深度學(xué)習(xí)的最開(kāi)始---2
4:實(shí)戰(zhàn)
> 語(yǔ)言:python
> ide: pycharm
1 : Perceptor.py
# -*- coding:utf8 -*-
'''
神經(jīng)網(wǎng)絡(luò)感知器
'''
class Preceptron(object):
def __init__(self,input_num,activator):
'''
? ? ? ?初始化感知器衙四,設(shè)置輸入?yún)?shù)的個(gè)數(shù),以及激活函數(shù)。
? ? ? ?激活函數(shù)的類型為double -> double
? ? ? ?'''
? ? ? ?self.activator = activator
#權(quán)重向量初始化為0
? ? ? ?self.weights = [0.0 for _ in range(input_num)]
#構(gòu)建一個(gè)長(zhǎng)度為input_num的double類型list
? ? ? ?#偏置項(xiàng)初始化為0
? ? ? ?self.bias = 0.0
? ?def __str__(self):
'''
? ? ? ?print時(shí)的附加輸出項(xiàng)
? ? ? ?打印學(xué)習(xí)到的權(quán)重逻杖、偏置項(xiàng)
? ? ? ?'''
? ? ? ?return 'weigths\t:%s\nbias\t:%f\n' %(self.weights, self.bias)
#預(yù)測(cè)
? ?def predict(self, input_vec):
'''
? ? ? ?輸入向量恭应,輸出感知器計(jì)算結(jié)果
? ? ? ?'''
? ? ? ?# input_vec[] 和 weight[] 打包在一起
? ? ? ?# 變成[(x1,w1),(x2,w2).....(xn,wn)]
? ? ? ?# 最后利用reduce求和
? ? ? ?# zip()多個(gè)數(shù)組打包方法
? ? ? ?# map(a,b)執(zhí)行a函數(shù)b為參數(shù)
? ? ? ?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):
'''
? ? ? ?輸入訓(xùn)練數(shù)據(jù):一組向量并徘、與每個(gè)向量對(duì)應(yīng)的label 暗赶、訓(xùn)練輪數(shù) 够委、學(xué)習(xí)率
? ? ? ?'''
? ? ? ?# iteration:迭代
? ? ? ?for i in range(iteration):
self._one_iteration(input_vecs, labels, rate)
def _one_iteration(self, input_vecs, labels, rate):
'''一次迭代荐类。把所有訓(xùn)練數(shù)據(jù)過(guò)一遍'''
? ? ? ?# 把輸入和輸出打包在一起,成為樣本的列表
? ? ? ?# 每個(gè)訓(xùn)練樣本是(input_vex, label)
? ? ? ?samples = zip(input_vecs, labels)
# 對(duì)每個(gè)樣本茁帽,按照感知器規(guī)則更新權(quán)重
? ? ? ?for (input_vec, label) in samples:
# 計(jì)算感知器在當(dāng)前權(quán)重下的輸出
? ? ? ? ? ?output = self.predict(input_vec)
# 更新權(quán)重
? ? ? ? ? ?self._update_weights(input_vec, output, label ,rate)
def _update_weights(self, input_vec, output, label ,rate):
'''按照感知器規(guī)則更新權(quán)重'''
? ? ? ?# 把input_vec 和 weigths 打包在一起
? ? ? ?delta = label - output
self.weights = map(
lambda (x, w): w + rate * delta * x,
zip(input_vec, self.weights))
self.bias +=rate * delta
2:and_train.py
????????????
# -*- coding:utf8 -*-
import ?Perceptor
def f(x):
'''
? ?定義一個(gè)激活函數(shù)
? ?'''
? ?return 1 if x > 0 else 0
def get_training_dataset():
#基于真值表構(gòu)建訓(xùn)練數(shù)據(jù)
? ?input_vecs= [[1,1],[0,0],[1,0],[0,1]]
labels = [1,0,0,0]
return input_vecs,labels
def train_percetron():
p = Perceptor.Preceptron(2,f)
input_vecs, labels = get_training_dataset()
p.train(input_vecs, labels, 10, 0.1)
return ?p
if __name__ == '__main__':
and_perception = train_percetron()
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])
python中的函數(shù)和使用方法就不做解釋了玉罐,百度即可解決,最后執(zhí)行下來(lái)脐雪,就完成了一個(gè)簡(jiǎn)單的感知器訓(xùn)練了厌小。