torch框架是基于lua的。在深度学习torch框架下,lua的编程相对来说还是比较好掌握的。下面我来和大家介绍一下神经网络模型是怎么构建出来的。此部分主要目的是对刚刚接触torch框架的小伙伴提供知识的学习,单纯的复制粘贴代码跑程序是跑不出来的。

1.torch可以让我们自己一层一层的设计自己的网络,像是容器一样可以一层一层地把你自己的Layer(神经网络的中的层)往里面添加。torch中有神经网络(Neural Networks)的包‘nn’。在使用nn包之前需要在程序中输入:require 'nn'; 这里的require相当与C语言中的include。

2.构建神经网络容器。torch中提供了三种形式构建的神经网络的容器,如图:


model = nn.Sequential()   这样就构建了一个名为model的神经网络容器,使用的神经网络类型是图片中的第一个。

3.创建一个卷基层: nn.SpatialConvolution()

model:add(nn.SpatialConvolutionMM(1, 32, 5, 5)),里面的参数值的含义分别为:1表示输入图片的通道为1,这个改写成3就是输入3通道的图片;32表示经过该层的卷积运算输出的通道数;5,5这两个参数代表的是用5x5的核进行卷积运算。总结,该层是把1通道的图片输入进来然后利用5x5的卷积核进行卷积运算,最后输出32通道的图片。

module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH]) 
这是卷积层的函数说明,我们在上面只用到了前4个参数,[ ]为可以不用输入的参数,后面的dW,dH即横向移动和纵向移动的步长默认为1,padW为宽度维度附加0的参数,因为有的图像用你设置的卷积核和步长运算时,可能出现维数不对的情况(类比2x3的矩阵不能乘以2x4的矩阵一样,你的需要把2x4的矩阵换成3x4的矩阵,这里是在2x4的矩阵下面添加一行0元素,使其成为3x4的矩阵),默认为0,最好是设置成(kW-1)/2,即卷积核的宽-1后再除以2。padH默认为padW,最好设置成(kH-1)/2,即卷积核的高-1后再除以2。

4.在卷积层里面添加激励函数, model:add(nn.Tanh()),这里添加的是Tanh(),也可以是ReLU函数,Sigmoid函数等等。 

5.添加pool池化层,model:add(nn.SpatialMaxPooling(3, 3, 3, 3))即在3x3的区域内找最大的数,横向步长为3,纵向步长为3。

module = nn.SpatialMaxPooling(kW, kH, [dW], [dH], [padW], [padH]) 这是pool池化层的函数说明,[ ]中的参数与卷积层函数所表达的意义是一样的,这里就不重复说明了。

6.添加卷基层torch的会自动连接前面的32张图片作为输入,这次是输出64张图片,卷积核为5x5,激励函数,池化层。 

   model:add(nn.SpatialConvolutionMM(32, 64, 5, 5))

   model:add(nn.Tanh())

   model:add(nn.SpatialMaxPooling(2, 2, 2, 2))

7.model:add(nn.Reshape(64*2*2))这行是将64x2x2的3维tensor转换成64x2x2的1维tensor。通俗地理解为原先用64x2x2的立方体描述的东西,现在转化成用一条64x2x2线来描述之前的东西。

8.model:add(nn.Linear(64*2*2, 200))Linear是全连接层,我们将3维的tensor转化成(想象成立方体)转化成了1维的tensor,这在上一步时会输出64x2x2=256个节点,在这里我们让这256个节点与200个节点建立全连接。

9.添加激活函数。model:add(nn.Tanh())

10.model:add(nn.Linear(200, 10)),200个节点与10个节点全连接。最后是将10个节点输出转化成对数概率,用于分类问题。

11.model:add(nn.LogSoftMax()),定义损失函数。

12.print(model),输出模型。

完整构建神经网络模型的代码:

require 'nn';
model = nn.Sequential()
model:add(nn.SpatialConvolutionMM(1, 32, 5, 5))
model:add(nn.Tanh())
model:add(nn.SpatialMaxPooling(3, 3, 3, 3))        
model:add(nn.SpatialConvolutionMM(32, 64, 5, 5))
model:add(nn.Tanh())
model:add(nn.SpatialMaxPooling(2, 2, 2, 2))
model:add(nn.Reshape(64*2*2))
model:add(nn.Linear(64*2*2, 200))
model:add(nn.Tanh())
model:add(nn.Linear(200,10))
model:add(nn.LogSoftMax())
print(model)

输出的结果如图所示:











Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐