1. 程式人生 > >深度學習1--感知器

深度學習1--感知器

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 12 18:01:30 2018

@author: SS
"""

'''
and 感知器的實現 
用到的函式 包括:
初始化: __init__
列印:__str__
預測:predict (輸入向量 生成結果)
訓練:train
每一次的訓練:_one_iteration
更新權重:_update_weight
'''
import numpy as np 

class And_Perceptron(object):
    def __init__(self,input_num,activator):
        self.input_num=input_num
        self.weight=np.zeros(self.input_num)
        self.activator=activator
        self.bias=0
    def __str__(self):
         return 'weights\t:%s\nbias\t:%f\n' % (self.weight, self.bias)
    def predict(self,input_vec):
        input_vec_np=np.array(input_vec) 
        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...] =[x1*w1,x2*w2...]
        vec_weight=np.multiply(input_vec_np,self.weight)
        sum_vec_weight=np.sum(vec_weight)  #sum=x1*w1+x2*w2+...
        output=self.activator(sum_vec_weight+self.bias)
        return output
    
    def _update_weight(self,input_vec,label,output,rate):
        #更新權重
        input_vec_np=np.array(input_vec)
        delta=label-output
        self.weight+=delta*rate*input_vec_np
        self.bias+=rate*delta
    
    def _one_iteration(self,input_vecs,labels,rate):
        samples=zip(input_vecs,labels)
        #[[0,0],[0,1],[1,0],[1,1]]  [0,0,0,1]
        for (input_vec,label) in samples:
            output=self.predict(input_vec)
            self._update_weight(input_vec,label,output,rate)
            
    def train(self,input_vecs,labels,iterations,rate):
        for i in range(iterations):
            self._one_iteration(input_vecs,labels,rate)
    
def f(x):
    if x>0:
        return 1
    else:
        return 0

def get_train_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=And_Perceptron(2,f)
    input_vecs, labels = get_train_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])