原贴地址如下:零基础入门深度学习感谢大佬的文章
最近学习神经网络想要把大佬的例子复现出来并跑通,但是因为原文是python2.x版本现在想
用python3.x把模型复现出来。原理部在上面的链接可以看到。
主要报错的地方还是map函数和lambda后面的参数报错解决办法可以看下面2个博客
python3 中map和python2中 map的区别,超级实用
解决解决python3.x版本中zip与reduce及map合用出现的问题
在map和zip前加了list(),将 map(lambda (x, w): x * w, zip(input_vec, self.weights)), 0.0) + self.bias)这一句中的lambda(x,w)改为了lambda x: x[0]*x[1],…
关于后面那个有点疑问为什么不改就报错说TypeError: () missing 1 required positional argument: ‘w’。
from functools import reduce
class Perceptron(object):
def __init__(self,input_num,activator):
self.activator=activator
self.weights=[0.0 for _ in range(input_num)]
#_和i效果一样,就是个“垃圾桶” 好处是省了一个变量了。
self.bias=0.0
def __str__(self):
return 'weights\t:%s\nbias\t:%f\n'%(self.weights,self.bias)
#打印学习到的权重和偏执值
def predict(self,input_vec):
# 通过zip把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
# 变成[(x1,w1),(x2,w2),(x3,w3),...]
# 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
#最后利用reduce求和x1*w1,+x2*w2+x3*w3+...+b
return self.activator(reduce(lambda a,b:a+b,list(map(lambda x: x[0] * x[1],
list(zip(input_vec,self.weights))))#需要改!
,0.0)+self.bias)
#reduce还可以接受第三个可选参数用于运算初始值。
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):
'''
一次迭代,把所有训练数据过1遍
'''
#把输入输出打包在一起,成为样本的列表[(input_vec,label),...]
#而每个训练样本是(input_vec,label)
samples = zip(input_vecs,labels)
#对每一个样本,按照感知器规则更新权重
for (input_vec,label)in samples:
output=self.predict(input_vec)
#更新权重
self._update_weight(input_vec,output,label,rate)
def _update_weight(self,input_vec,output,label,rate):
'''
按照感知器规则更新权重
'''
# 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起
# 变成[(x1,w1),(x2,w2),(x3,w3),...]
# 然后利用感知器规则更新权重
delta=label - output
self.weights=list(map(lambda x: x[1] + rate * delta * x[0],list(zip(input_vec,self.weights))))#需要改!
#更新bias
self.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]]
#期望的输出列表
labels=[1,0,0,0]
return input_vecs,labels
def train_and_perceptron():
'''
使用and真值表训练感应器
'''
# 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f
p = Perceptron(2,f)
# 训练,迭代10轮, 学习速率为0.1
input_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]))
运行结果:

感知器&spm=1001.2101.3001.5002&articleId=103186031&d=1&t=3&u=bfb5681fd9a74e0fadffcdeae1524ef5)
508

被折叠的 条评论
为什么被折叠?



