看到@hanbingtao大神的《零基础入门深度学习(1) - 感知器》,心里非常激动,原来不明白的问题终于搞清楚了,尤其是提供了python代码……哦,对了,代码是在2.x环境下的,直接在3.x中运行会报错,当时百思不得其解,历经一天,终于搞清楚,主要是zip与reduce及map合用的问题,因此只需要修改以下3处,亲测可运行:
1.py2中reduce可以直接用,py3中需要导入;
2.py2和py3在map和zip的地方有区别(一并感谢百度知道中的匿名用户),py3的结果是迭代器,所以需要自己手动将结果转化为列表。因此只是光改代码提示错误的地方还不够,出现map和zip的地方都需要修改。两处使用reduce和map的函数都需要修改,下面代码中我已标红(这是与原代码不同之处)
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)]
self.bias = 0.0
def __str__(self):
return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
def predict(self, input_vec):
return self.activator(reduce(lambda a,b: a + b,list(map(lambda x: x[0] * x[1], list(zip(input_vec, self.weights)))))+self.bias)
def train(self, input_vecs, labels, iteration, rate):
for i in range(iteration):
self._one_iteration(input_vecs, labels, rate)
def _one_iteration(self, input_vecs, labels, rate):
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):
delta = label - output
self.weights = list(map(lambda x: x[1] + rate * delta * x[0],list(zip(input_vec, self.weights))))
self.bias += rate * delta
def f(x):
return 1 if x > 0 else 0
def train_and_perceptron():
p = Perceptron(2, f)
input_vecs = [[1, 1], [1, 0], [0, 1], [0, 0]]
labels = [1, 0, 0, 0]
p.train(input_vecs, labels, 10, 0.1)
return p
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]))