深度学习(1)_感知器

虽然最近工作上比较忙,还临近了考试,但还是要看一点专业上的东西,到时候不至于两眼一抹黑的从头来。师兄给我推荐了一个博客:零基础入门深度学习(1) - 感知器,开头第一节就是撸一个感知器,道理讲的很清楚,但是代码是python2写的,按照他的这个代码在python3上运行,会报出一个错误:TypeError: <lambda>() missing 1 required positional argument: 'w'。错误讲的很明确,但检查了很久,也没有发现语法上有什么问题,网上也同样有人在问,但所有的回答都不能解决问题。其实原文中lambda、reduce、map等等函数,都是为了实现一个“点乘”的功能,直接使用numpy中的np.dot()就可以避免了在python3中的报错。于是乎,又重写了这样一段代码,直接使用了numpy,在python3.6.1中完美运行。
import numpy as np

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 train( self, input_vecs, labels, iteration, rate ):
        '''
        输入向量,计算感知器的输出结
        '''
        for _ in range( iteration ):
            self._one_iteration( input_vecs, labels, rate )
            
    def _one_iteration( self, input_vecs, labels, rate ):
        sample = zip( input_vecs, labels )
        for input_vec, label in sample:
            output = self.predict( input_vec ) #计算出一个值
            #和标签值进行对比,更新权重weight
            self._update_weights( input_vec, output, label, rate )
     
    def _update_weights( self, input_vec, output, label, rate  ):
        #首先计算出delta
        delta = label - output
        for i in range( len( input_vec ) ):
            self.weights[i] = self.weights[i] + rate * delta * input_vec[i]
        self.bias = self.bias + rate * delta
        
    def predict( self, input_vec ):
        return self.activator( np.dot( self.weights, input_vec ) + self.bias )
     
def f( x ):
    '''
    定义激活函数
    '''
    return 1 if x > 0 else 0
    
def get_training_dataset():
    input_vecs = [ [1,1], [0,0], [1,0], [0,1] ]
    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_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] ) ) )
    
'''
	在python3.6.1中运行的结果:
	==================================
    weights :[0.1, 0.2]
    bias    :-0.200000

    1 and 1 = 1
    0 and 0 = 0
    1 and 0 = 0
    0 and 1 = 0
    请按任意键继续. . .
	==================================

'''
这只是提供一个在python3.6.1能够正常运行的版本,所以没写什么注释,推荐看原博客,讲解注释都很完美。


小艾的博客 http://www.aixinyan.me/