DeepLearning——感知器

本文介绍感知器的基本概念及其作为神经网络的基础单元的作用。感知器能够解决线性分类和回归问题,但无法实现异或运算。通过Python代码演示如何使用感知器实现AND逻辑运算。

感知器

为了理解神经网络,我们应该先理解神经网络的组成单元——神经元。神经元也叫做感知器。感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题。并且,感知器算法也是非常简单的。

  • 感知器的结构图
    感知器

可以看到感知器的结构有如下几个组成部分:

  • 输入权值,一个感知器可以接收多个输入,每个输入上有一个权值,此外还有一个偏置项

  • 激活函数

  • 输出

感知器不仅仅能实现简单的布尔运算。它可以拟合任何的线性函数,任何线性分类线性回归问题都可以用感知器来解决。然而,感知器却不能实现异或运算。

感知器算法这里就不单独记录了,比较简单,随机梯度下降会单独写一次。

wiwi+Δwi

bb+Δb

其中
Δwi=η(ty)xi

Δb=η(ty)
  • 用感知器实现一个and运算
#from  functools import reduce
#import operator
class Perceptron:
    def __init__(self,input_num,activator):
        self.activator = activator
        self.input_num = input_num
        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 list_and_list(self,input_vec,weights):
        list1 = [ x * y for x,y in zip(input_vec,weights)]
        return list1

    def list_to_sum(self,list):
        list_sum = 0
        for i in list:
            list_sum += i
        return list_sum

    def predict(self,input_vec):
        return self.activator(self.list_to_sum(self.list_and_list(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,lables,rate):
        samples = zip(input_vecs,lables)
        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 = [w + rate * delta * x for x,w in zip(input_vec,self.weights)]
        self.bias += rate * delta

这里感知器的结构已经构造好了。下面就进行and运算


def f(x):
    return 1 if x > 0 else 0

def get_training_dataset():
    input_vecs = [[1,1],[0,0],[0,1],[1,0]]
    labels = [1,0,0,0]
    return input_vecs,labels

def train_and_perceptron():
    p = Perceptron(2,f)
    input_vecs,labels = get_training_dataset()
    p.train(input_vecs,labels,10,0.1)
    return p

if __name__ == '__main__':
    and_perceptron = train_and_perceptron()
    print(and_perceptron)
    print('1 and 1 = %d' % and_perceptron.predict([1, 1]))
    print('0 and 0 = %d' % and_perceptron.predict([0, 0]))
    print('1 and 0 = %d' % and_perceptron.predict([1, 0]))
    print('0 and 1 = %d' % and_perceptron.predict([0, 1]))

运行结果如下:

weights :[0.2, 0.1]
bias    :-0.200000

1 and 1 = 1
0 and 0 = 0
1 and 0 = 0
0 and 1 = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值