深度学习入门之感知器(原理+代码)
生活随笔
收集整理的這篇文章主要介紹了
深度学习入门之感知器(原理+代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
感知器的原理:感知器的原理相當簡單,當線性可分的時候就是中學的時候學過的y=kx+b,只不過中學的時候k和b都是給出的,給我們x讓我們去求y,看看y是在這條直線的上方還是下方。而現在沒有給我們k和b,給我們了一大堆(x,y),讓我們根據這一大堆x和y求一條直線,這條直線最好能把這一大堆數據劃分為兩類(最大似然函數的思想,大學學過的p(|X)),并且要求這條直線兩邊的點最好離這條直線遠一點(支持向量機就是基于此思想),因為這些點離這條直線遠了,一些點被誤劃分的概率就會小很多。
感知器涉及到的相關公式
感知器的輸出
激活函數我們選擇階躍函數
感知器訓練涉及到的公式即權重參數w和偏置項b的更新規則。
?
其中t是實際的值即label,y是我們輸入x訓練出的值,n是學習率,用來調整學習的速率n值太大太小都不容易找到合適的w和b。
用感知器去實現與操作,代碼詳解
這一段我們寫好感知器的數據讀取,權重更新規則。
class Perceptron(object):def __init__(self, input_num, activator):'''初始化感知器,設置輸入參數的個數,以及激活函數。激活函數的類型為double -> double'''self.activator = activator# 權重向量初始化為0self.weights = [0.0 for _ in range(input_num)]# 偏置項初始化為0self.bias = 0.0def __str__(self):'''打印學習到的權重、偏置項'''return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)def predict(self, input_vec):'''輸入向量,輸出感知器的計算結果'''# 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起# 變成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用map函數計算[x1*w1, x2*w2, x3*w3]# 最后利用reduce求和return self.activator(reduce(lambda a, b: a + b,map(lambda (x, w): x * w, zip(input_vec, self.weights)), 0.0) + self.bias)def train(self, input_vecs, labels, iteration, rate):'''輸入訓練數據:一組向量、與每個向量對應的label;以及訓練輪數、學習率'''for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):'''一次迭代,把所有的訓練數據過一遍'''# 把輸入和輸出打包在一起,成為樣本的列表[(input_vec, label), ...]# 而每個訓練樣本是(input_vec, label)samples = zip(input_vecs, labels)# 對每個樣本,按照感知器規則更新權重for (input_vec, label) in samples:# 計算感知器在當前權重下的輸出output = self.predict(input_vec)# 更新權重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):'''按照感知器規則更新權重'''# 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起# 變成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用感知器規則更新權重delta = label - outputself.weights = map(lambda (x, w): w + rate * delta * x,zip(input_vec, self.weights))# 更新biasself.bias += rate * delta接下來我們開始訓練并測試
def f(x):'''定義激活函數f'''return 1 if x > 0 else 0 def get_training_dataset():'''基于and真值表構建訓練數據'''# 構建訓練數據# 輸入向量列表input_vecs = [[1,1], [0,0], [1,0], [0,1]]# 期望的輸出列表,注意要與輸入一一對應# [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0labels = [1, 0, 0, 0]return input_vecs, labels def train_and_perceptron():'''使用and真值表訓練感知器'''# 創建感知器,輸入參數個數為2(因為and是二元函數),激活函數為fp = Perceptron(2, f)# 訓練,迭代10輪, 學習速率為0.1input_vecs, labels = get_training_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])資料參考于:https://www.zybuluo.com/hanbingtao/note/433855
?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的深度学习入门之感知器(原理+代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c mysql触发器,mysql触发器
- 下一篇: 深度学习笔记之lSTM网络