深度學習1--感知器
阿新 • • 發佈:2019-02-06
# -*- coding: utf-8 -*- """ Created on Thu Apr 12 18:01:30 2018 @author: SS """ ''' and 感知器的實現 用到的函式 包括: 初始化: __init__ 列印:__str__ 預測:predict (輸入向量 生成結果) 訓練:train 每一次的訓練:_one_iteration 更新權重:_update_weight ''' import numpy as np class And_Perceptron(object): def __init__(self,input_num,activator): self.input_num=input_num self.weight=np.zeros(self.input_num) self.activator=activator self.bias=0 def __str__(self): return 'weights\t:%s\nbias\t:%f\n' % (self.weight, self.bias) def predict(self,input_vec): input_vec_np=np.array(input_vec) # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...] =[x1*w1,x2*w2...] vec_weight=np.multiply(input_vec_np,self.weight) sum_vec_weight=np.sum(vec_weight) #sum=x1*w1+x2*w2+... output=self.activator(sum_vec_weight+self.bias) return output def _update_weight(self,input_vec,label,output,rate): #更新權重 input_vec_np=np.array(input_vec) delta=label-output self.weight+=delta*rate*input_vec_np self.bias+=rate*delta def _one_iteration(self,input_vecs,labels,rate): samples=zip(input_vecs,labels) #[[0,0],[0,1],[1,0],[1,1]] [0,0,0,1] for (input_vec,label) in samples: output=self.predict(input_vec) self._update_weight(input_vec,label,output,rate) def train(self,input_vecs,labels,iterations,rate): for i in range(iterations): self._one_iteration(input_vecs,labels,rate) def f(x): if x>0: return 1 else: return 0 def get_train_dataset(): input_vecs=[[1,1],[0,0],[0,1],[1,0]] labels=[1,0,0,0] return input_vecs,labels def train_and_perceptron(): p=And_Perceptron(2,f) input_vecs, labels = get_train_dataset() p.train(input_vecs, labels, 10, 0.1) #返回訓練好的感知器 return p if __name__ == '__main__': # 訓練and感知器 and_perception = train_and_perceptron() # 列印訓練獲得的權重 print and_perception # 測試 print '1 and 1 = %d' % and_perception.predict([1, 1]) print '0 and 0 = %d' % and_perception.predict([0, 0]) print '1 and 0 = %d' % and_perception.predict([1, 0]) print '0 and 1 = %d' % and_perception.predict([0, 1])