本节代码地址:
https://github.com/vic-w/torch-practice/tree/master/mnist
MNIST是手写数字识别的数据库。在深度学习流行的今天,MNIST数据库已经被大家玩坏了。但是用它来学习卷积神经网络是再好不过的了。这一次,我们就用Torch来实现MNIST数据库的识别。
这一次的代码用到了mnist库,如果之前没有安装,可以在命令行键入:
luarocks install mnist
和往常一样,我们要先包含必要的库
require 'torch'
require 'nn'
require 'optim'
mnist = require 'mnist'
其中require ’mnist'一句返回了一个mnist的对象。可以用下面两句来获得mnist的图像数据。
fullset = mnist.traindataset()
testset = mnist.testdataset()
接下来我们主要关注的就是模型如何建立,因为除了模型之外,其他的代码都是大同小异的。
首先来看一下著名的LeNet网络模型:
这个图是从Caffe那里借来的。其实用Caffe训练LeNet模型真的是又快又好。但我们的目的是为了学习,所以我们还是用Torch再把它实现一遍。
从上面的图上可以看出,这个模型首先使用了Scale层(蓝色),把输入的图片取值缩小到一定范围内。然后是连续两个卷积层conv1和conv2(红色),分别接一个池化层pool1和pool2(黄色),最后是两个全连接层ip1和ip2 (紫色,ip=inner product),将所有的信息归结到最后的Softmax层(蓝色)。其中只有在两个全连接层之间使用了激活层,激活方式是ReLU(Rectified Linear Units)
将这个模型用Torch的代码实现也非常简单。首先仍然是建立一个容器用来存放各种模块。
model = nn.Sequential()
放入一个reshape模块。因为mnist库的原始图片是储存为1列728个像素的。我们需要把它们变成1通道28*28的一个方形图片。
model:add(nn.Reshape(1, 28, 28))
<