Fighting365' Blog

Torch7下搭建卷积神经网络架构

综述

之前的博文,如一文读懂卷积神经网络(CNN)多层网络与反向传播算法详解感知机详解卷积神经网络详解等已经比较详细的讲述了神经网络以及卷积神经网络的知识。本篇博文主要讲述在Torch7中神经网络如何建立以及相关的原理(即神经网络包NN的内容),虽然讲述的是神经网络的建立。但是不会涉及太多神经网络的知识,假如你对该领域不是很了解,可以去之前的几篇博文里面充充电。

首先简单的介绍一下Torch7中的神经网络工具包,该包是由不同的模块组合而成。NN包中最底层是一个叫Module的抽象模块,Container是对其功能扩展的子模块,Sequential、Parallel和Concat是继承于Container最重要的三个子模块,所构成的神经网络既可以包括简单层,如Linear、Mean、Max和Reshape等,也可以包括卷基层以及激活函数等。通过这些类可以构成神经网络的架构,但是关于如何训练需要一个性能指标也就是损失函数,在NN中损失函数定义在Criterion模块中,常用的损失函数有MSECriterion (均方根误出)、ClassNLLCriterion (交叉熵)。很自然的,有了性能指标之后我们需要考虑如何优化该性能指标,这儿分为两种,一种是使用Torch7内部的优化函数包Optim来优化(简单,上手快),另一种则是采用迭代法更新权值(该方法一般用于简单的网络,当存在卷积层时,优化困难),推荐使用Optiml来优化。

在了解了NN包的组成模块后,让我们详细的了解一下Module模块。上面我们说到NN有不同的模块组成,这些模块有的有参数,有的无参数,但是都有输入dLoss_dInput和输出dLoss_dOutput(除输入层模块和输出层模块以外);对于那些有参数的模块而言需要计算dLoss_dParams,该参数其实包括两部分,一部分是权值,即dLoss_dWeight,另一部分是偏置,即dLoss_dBias.
在Module中定义了四个基本函数方法,如下所示:

  1. forward(input) 根据输入计算module的输出;
  2. backward(input, gradOutput) 该函数利用反向传播(BP算法原理充电的点这儿脉络清晰的BP神经网络讲解)更行网络内部的权值,其中gradOutput即上述的dLoss_dOutput;
  3. zeroGradParameters() 用于权值迭代更新,用到的概率比较小;
  4. updateGradParameters(learningRate) 用于迭代更新内部权值,后面详细讲解;

下面让我们一起动手尝试如何构建神经网络的架构

在搭建之前先看一下卷积神经网络的架构,如下所示。

首先将Torch7中的nn包导入到工作区(注意语句结束加“;”),这儿使用require关键字,如下所示。

接下来需要申明一个神经网络容器来搭建神经网络,如上所述,目前有三种方式可以定义,第一种Sequential则采用队列方式,一层层的搭建,Concat和Parallel如字面意思那样,如下所示。


在此演示采用的是Sequential子模块,如下所示。

现在有了容器后需要向net容器添加卷积层,输入通道为2,输出通道为8,卷积核大小为6x6,如下所示。


(介绍一下卷积函数:
module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW],
[dH], [padW], [padH])
参数含义如下:
nInputPlane:输入的通道数
nOutputPlane:输出的通道数
kW x kH:定义卷积核的大小
[dW],[dH:分别为横向和纵向移动的步长,默认值为1
[padW]:宽度维度附加值,默认值为零,使用时推荐设置为(kW-1)/2。在卷积运算的维度不匹配时起作用,这儿不考虑]
[padH]:与padW类似,推荐设置为(kH-1)/2)

然后添加往卷基层添加卷积的操作以及激活函数ReLU,如下所示。

加入新的池化Pooling层,在3x3的区域内寻找最大值作为该区域的值,横向和纵向的查找步长分别为3,如下所示。


(介绍一下池化函数:
module
= nn.SpatialMaxPooling(kW, kH, [dW], [dH], [padW], [padH])
参数的定义与卷积函数的定义一致,见上面)

重复上述过程,分别添加卷基层(输入通道为8,输出通道为16,卷积核大小为6x6),激活函数(ReLU),池化层(3x3, 横纵向步长为3),如下所示。

将三维的Tensor转换成一维的Tensor,如下所示。

添加1666=576与200的线性全连接层,如下所示。

添加激活函数,如下所示。

添加200与120的线性全连接层,并添加激活函数,如下所示。

添加120与20的线性全连接层,并采用不softMAX将输出转换成概率,如下所示。

至此含有多个卷基层的卷积神经网络的结构已经搭建完毕,将其打印可以清晰的描述其结构,如下所示。


这样,我们就搭建了一个卷积神经网络的架构,接下来需要考虑的就是如何训练这样一个神经网络,这个问题将在以后给出。
参考文章:
http://blog.csdn.net/u010946556/article/details/51332644
http://blog.csdn.net/hungryof/article/details/52022415
等等不一一列出,感谢你们的分享。

Fighting365 wechat
ex. subscribe to my blog by scanning my public wechat account