零基础入门深度学习 - (1)感知器

原贴地址如下:零基础入门深度学习感谢大佬的文章
最近学习神经网络想要把大佬的例子复现出来并跑通,但是因为原文是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]))

运行结果:
result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值