DeepLearning——感知器

来源:互联网 发布:java 多线程面试 编辑:程序博客网 时间:2024/06/05 21:05

感知器

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

  • 感知器的结构图
    感知器

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

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

  • 激活函数

  • 输出

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

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

wiwi+Δwi

bb+Δb

其中
Δwi=η(ty)xi

Δb=η(ty)

  • 用感知器实现一个and运算
#from  functools import reduce#import operatorclass 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 0def get_training_dataset():    input_vecs = [[1,1],[0,0],[0,1],[1,0]]    labels = [1,0,0,0]    return input_vecs,labelsdef train_and_perceptron():    p = Perceptron(2,f)    input_vecs,labels = get_training_dataset()    p.train(input_vecs,labels,10,0.1)    return pif __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.2000001 and 1 = 10 and 0 = 01 and 0 = 00 and 1 = 0
原创粉丝点击