DL01-4:感知器实现(向量版)

2018-10-14  本文已影响11人  杨强AT南京

1.使用numpy做内积运算
2.使用向量或者矩阵内积实现感知器

一、向量与矩阵的内积计算

1、向量作为矩阵的注意点

运行效果如下: 向量根据情况作为行向量与列向量

2、使用向量计算加权求和

#coding=utf-8
import  numpy as np
#矩阵与向量的内积
weights=np.random.uniform(-0.1,0.1,size=4)
input_data=np.array([4.7,3.2,1.3,0.2])  #来自iris数据集
sum=0

#标量计算方式
for idx in range(len(input_data)):
    sum += weights[idx] * input_data[idx]

print(sum)
#矩阵与向量的内积计算方式
sum=np.dot(weights,input_data)
print(sum)

sum=np.dot(input_data,weights)
print(sum)
print()
运行效果: 内积形式的加权求和

二、感知器学习的向量实现

1、感知器的forward函数实现

    def forward(self,input_data):
        '''
        根据已知输入特征数据,进行加权求和与激活函数运算,得到输出。
        :param input_data:              输入的特征数据,必须与构造器指定维数大小一直
        :return:                        返回特征数据计算输出。
        '''
        #1.加权求和运算
        self.input_data=input_data      #后面计算更新梯度要使用
        self.sum=np.dot(self.input_data,self.weights)      #加权求和后面要使用
        self.sum+=self.bias             #偏置项
        #2.激活函数运算
        y=self.activation_function(self.sum)
        self.y=y                        #后面计算更新梯度要使用
        #print("输出:%f"%self.y)
        return  self.y                  #返回计算输出

2、感知器的backward函数实现

    def backward(self,expect_output):
        '''
        :param expect_output:           输入特征数据的期望输出值。
        :return:                        无返回值
        '''
        #1.计算每个权重更新相同的部分(delta在这儿是标量)。
        delta=(self.y-expect_output)
        delta=delta*self.activation_derivative(self.sum)
        delta=self.learn_rate * delta   #学习率

        #2.计算每个权重对应的更新梯度(包含偏置项)。
        self.w_delta=np.zeros(self.weights.shape,np.float32)    #向量
        self.b_delta=0

        #偏置项的更新梯度
        self.b_delta=delta      #标量
        #权重的更新梯度
        self.w_delta=delta*self.input_data  #向量(哈马达积)

        #3.更新权重
        self.bias-=self.b_delta
        self.weights-=self.w_delta      #形状相同的向量与矩阵的减法

三、标量与向量计算的速度比较

import time
start = time.clock()
#......这里是需要测试运行CPU时间的代码
end=time.clock()
print("CPU运行时间:",end-start)
【资源】

代码下载:

上一篇 下一篇

猜你喜欢

热点阅读