人工神经网络的产生必定程度上受生物学的启发,由于生物的学习系统是由相互链接的神经元相互链接的神经元组成的复杂网络。而人工神经网络跟这个差很少,它是一系列简单的单元相互密集链接而成的。其中每一个单元有必定数量的输入(多是其余单元的输出),并产生单一的实数值输出(可能成为其余单元的输入)。css
常见的人工神经网络结果以下图:html
(1) 网络由三部分组成,输入层、隐藏层和输出层,每每隐藏层只有1层或2层;git
(2) 每层由若干个单元组成,全部单元分层互连造成一个无环的前馈网络;github
(3) 下一层的某个单元的输入由上一层的全部单元的输出组成,每一个输入的权重由相连的边的权值决定。算法
不一样类型的单元对输入的处理方式不一样,比较经常使用是sigmoid单元。sigmoid单元首先对全部输入进行线性组合,而后将线性组合的结果经过sigmoid函数(F(x) = 1/(1+power(e,-x)))映射为0跟1之间的某个值做为输出(sigmoid函数有一个比较有用的特征就是F’(x) = F(x)*( 1-F(x)))。这样,sigmoid单元的输出是输入的非线性函数,而且输出是输入的可微函数。网络
人工神经网络的学习训练就是为每一条边选取一个合适的权值,使网络输出层的输出和目标值之间的偏差平方和最小化。而像反向传播(BackPropagation)这样的算法,就是使用梯度降低来调节各条表的权重,来最佳拟合输入-输出组成的训练数据。app
实验:人脸朝向识别函数
实验数据是具备不一样朝向的600多张人脸图片,每一个图片的像素是30*32。分为训练集、验证集和测试集,大体图像张数比为6:2:2。训练集用来训练人工神经网络,验证集用来选取在验证集上具备最好性能的网络,而测试集对选中的网络进行最后的评估。性能
输入:每一个像素对应一个网络输入,而且把范围是0-255的亮度值按比例缩放到0-1之间。学习
输出:使用4个不一样的输出单元,每一个单元对应一个脸的朝向,取具备最高值的输出做为人脸朝向的预测值。另外,使用0.1和0.9,而不是0和1,例如(0.9,0.1,0.1,01.)表示脸朝向正前方。
网络结构:使用一个隐藏层,隐藏层的单元个数为3个。
其余参数:学习速率设定为0.3,输入单元的权值被设定为0.0,输出单元的权值被初始化为一个较小的随机值。
Python版反向传播算法(随机梯度降低版本)
1.把输入沿网络前向传播
def feedForward(self): for j in xrange(1,self.hidNum): sum = 0.0 for i in xrange(self.inNum): sum += self.inOutput[i]*self.wIn2Hid[i][j] self.hidOutput[j] = self.sigmoid(sum) for k in xrange(self.outNum): sum = 0.0 for j in xrange(self.hidNum): sum += self.hidOutput[j] * self.wHid2Out[j][k] self.outOutput[k] = self.sigmoid(sum)
2.把偏差沿网络反向传播
def backPropagate(self,N=0.3): # calculate errors for output for k in xrange(self.outNum): error = self.targets[k]-self.outOutput[k] self.outOutputError[k] = self.outOutput[k]*(1-self.outOutput[k])*error # calculate errors for hidden layer for j in xrange(self.hidNum): error = 0.0 for k in xrange(self.outNum): error += self.outOutputError[k]*self.wHid2Out[j][k] self.hidOutputError[j] = self.hidOutput[j]*(1-self.hidOutput[j])*error # update hid-output weights for j in xrange(self.hidNum): for k in xrange(self.outNum): change = N*self.outOutputError[k]*self.hidOutput[j] self.wHid2Out[j][k] += change # update input-hid weights for i in xrange(self.inNum): for j in xrange(1,self.hidNum): change = N*self.hidOutputError[j]*self.inOutput[i] self.wIn2Hid[i][j] += change
实验结果:经过调整输入层、隐藏层中各个单元的权重,网络在验证集上最高的预测准确率是0.892,对应在测试集上的准确率为0.844。