当前位置:网站首页 > 技术博客 > 正文

多层感知器模型



 DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

@author:wepon

@blog:http://blog.csdn.net/u0/article/details/

本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参考本文第一部分的算法简介。

经详细注释的代码:放在我的github地址上,可下载。

多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:





从上图可以看到,多层感知机层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。



输入层没什么好说,你输入什么就是什么,比如输入是一个n维向量,就有n个神经元。

隐藏层的神经元怎么得来?首先它与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是

f(W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f 可以是常用的sigmoid函数或者tanh函数:



       




最后就是输出层,输出层与隐藏层是什么关系?其实隐藏层到输出层可以看成是一个多类别的逻辑回归,也即softmax回归,所以输出层的输出就是softmax(W2X1+b2),X1表示隐藏层的输出f(W1X+b1)


MLP整个模型就是这样子的,上面说的这个三层的MLP用公式总结起来就是,函数G是softmax





因此,MLP所有的参数就是各个层之间的连接权重以及偏置,包括W1、b1、W2、b2。对于一个具体的问题,怎么确定这些参数?求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(SGD):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等,本文不详细讨论,读者可以参考本文顶部给出的两个链接。



了解了MLP的基本模型,下面进入代码实现部分。







再次说明,代码来自:Multilayer Perceptron,本文只是做一个详细解读,如有错误,请不吝指出。


这个代码实现的是一个三层的感知机,但是理解了代码之后,实现n层感知机都不是问题,所以只需理解好这个三层的MLP模型即可。概括地说,MLP的输入层X其实就是我们的训练数据,所以输入层不用实现,剩下的就是“输入层到隐含层”,“隐含层到输出层”这两部分。上面介绍原理时已经说到了,“输入层到隐含层”就是一个全连接的层,在下面的代码中我们把这一部分定义为HiddenLayer。“隐含层到输出层”就是一个分类器softmax回归(也有人叫逻辑回归),在下面的代码中我们把这一部分定义为LogisticRegression。


代码详解开始:


(1)导入必要的python模块

主要是numpy、theano,以及python自带的os、sys、time模块,这些模块的使用在下面的程序中会看到。

 
  

(2)定义MLP模型(HiddenLayer+LogisticRegression)

这一部分定义MLP的基本“构件”,即上文一直在提的HiddenLayer和LogisticRegression

  • HiddenLayer

隐含层我们需要定义连接系数W、偏置b,输入、输出,具体的代码以及解读如下:


 
     



  • LogisticRegression

逻辑回归(softmax回归),代码详解如下。

(如果你想详细了解softmax回归,可以参考: DeepLearning tutorial(1)Softmax回归原理简介+代码详解)



 
     



ok!这两个基本“构件”做好了,现在我们可以将它们“组装”在一起。

我们要三层的MLP,则只需要HiddenLayer+LogisticRegression,

如果要四层的MLP,则为HiddenLayer+HiddenLayer+LogisticRegression........以此类推。

下面是三层的MLP:



 

MLP类里面除了隐含层和分类层,还定义了损失函数、规则化项,这是在求解优化算法时用到的。





(3)将MLP应用于MNIST(手写数字识别)

上面定义好了一个三层的MLP,接下来使用它在MNIST数据集上分类,MNIST是一个手写数字0~9的数据集。


首先定义加载数据 mnist.pkl.gz 的函数load_data():


 
      



加载了数据,可以开始训练这个模型了,以下就是主体函数test_mlp(),将MLP用在MNIST上:


 
      



文章完,经详细注释的代码:放在我的github地址上,可下载
如果有任何错误,或者有说不清楚的地方,欢迎评论留言。





版权声明


相关文章:

  • 蒙特卡罗搜索树的步骤2025-06-06 14:01:02
  • ds1302实时时钟程序流程图2025-06-06 14:01:02
  • 王者荣耀空白符号特殊符号大全2025-06-06 14:01:02
  • 颜色代码取色器2025-06-06 14:01:02
  • python popen用法2025-06-06 14:01:02
  • python的pywin322025-06-06 14:01:02
  • mysql分区表语法2025-06-06 14:01:02
  • 积分电路 运放2025-06-06 14:01:02
  • linux getopt函数2025-06-06 14:01:02
  • f_fdisk2025-06-06 14:01:02