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) 用于迭代更新内部权值,后面详细讲解;
下面让我们一起动手尝试如何构建神经网络的架构
在搭建之前先看一下卷积神经网络的架构,如下所示。
1. 首先将Torch7中的nn包导入到工作区(注意语句结束加“;”),这儿使用require关键字,如下所示。
2. 接下来需要申明一个神经网络容器来搭建神经网络,如上所述,目前有三种方式可以定义,第一种Sequential则采用队列方式,一层层的搭建,Concat和Parallel如字面意思那样,如下所示。
在此演示采用的是Sequential子模块,如下所示。
3. 现在有了容器后需要向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)
4. 然后添加往卷基层添加卷积的操作以及激活函数ReLU,如下所示。
5. 加入新的池化Pooling层,在3x3的区域内寻找最大值作为该区域的值,横向和纵向的查找步长分别为3,如下所示。
(介绍一下池化函数:
module = nn.SpatialMaxPooling(kW, kH, [dW], [dH], [padW], [padH])
参数的定义与卷积函数的定义一致,见上面)
6. 重复上述过程,分别添加卷基层(输入通道为8,输出通道为16,卷积核大小为6x6),激活函数(ReLU),池化层(3x3, 横纵向步长为3),如下所示。
7. 将三维的Tensor转换成一维的Tensor,如下所示。
8. 添加16*6*6=576与200的线性全连接层,如下所示。
9. 添加激活函数,如下所示。
10. 添加200与120的线性全连接层,并添加激活函数,如下所示。
11. 添加120与20的线性全连接层,并采用不softMAX将输出转换成概率,如下所示。
12. 至此含有多个卷基层的卷积神经网络的结构已经搭建完毕,将其打印可以清晰的描述其结构,如下所示。
这样,我们就搭建了一个卷积神经网络的架构,接下来需要考虑的就是如何训练这样一个神经网络,这个问题将在以后给出。
参考文章:
http://blog.csdn.net/u010946556/article/details/51332644
http://blog.csdn.net/hungryof/article/details/52022415
等不一一列出,感谢他们的分享。
- 常用的AJAX弹出层代码
- Linux下检测IP地址冲突及解决方法
- linux如何挂载windows下的共享文件
- silverlight2中的定时器,以及如何动态改变控件的坐标
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
- jQuery1.3以上版本"@"的问题
- 龚宏绩:三七互娱游戏上云的现状与未来
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- 利用Reflector把"闭包"看清楚
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP中的Iterator迭代对象属性详解
- 使用Python实现微信拍一拍功能的思路代码
- Laravel5.7 Eloquent ORM快速入门详解
- 微信公众号用户与网站用户的绑定解决方案分析
- laravel使用Faker数据填充的实现方法
- PHP开发实现快递查询功能详解
- Laravel5.7 数据库操作迁移的实现方法
- PHP7引入的"??"和"?:"的区别讲解
- Python自动化操作实现图例绘制
- ThinkPHP5.0框架使用build 自动生成模块操作示例
- PHP远程连接oracle数据库操作实现方法图文详解
- 微信公众平台开发教程②微信端分享功能图文详解
- 微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
- keras分类之二分类实例(Cat and dog)
- 详解Python 循环嵌套