使用optim包训练CNN

我尝试使用optim包来训练CNN。我使用这个代码作为参考,这个代码是从视频教程(约在24:01左右)中获得的。这个特定的例子使用了普通的神经网络。我还使用了这个参考

我的CNN代码在这里。问题在于,如果输入的X不是单个图像,则会出现错误:

在nn.Sequential的第14个模块中:
/home/ubuntu/torch/install/share/lua/5.1/nn/Linear.lua:57: size mismatch at /tmp/luarocks_cutorch-scm-1-1695/cutorch/lib/THC/generic/THCTensorMathBlas.cu:52

当我不使用GPU时,错误变得更加明显:

size mismatch,[1024 x 2048],[409600]

为了方便起见,我复制了我的完整模型:

--模型开始
local model = nn.Sequential()
model:add(nn.SpatialConvolution(1, 64, 3, 3))
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2, 2, 2, 2))

model:add(nn.SpatialConvolution(64, 128, 3, 3))
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2, 2, 2, 2))

model:add(nn.SpatialConvolution(128, 256, 3, 3))
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2, 2, 2, 2))

model:add(nn.SpatialConvolution(256, 512, 3, 3))
model:add(nn.ReLU())
model:add(nn.SpatialMaxPooling(2, 2, 2, 2))

model:add(nn.View(-1))
model:add(nn.Linear(2048, 1024))
model:add(nn.ReLU())
model:add(nn.Linear(1024, 5))
model:add(nn.LogSoftMax())
--模型结束
  1. 使用nn.View(-1)是正确的吗?

  2. 我明白,当输入X有多个图像时,第一个Linear层的输入不是2048。但在第一个参考中的普通神经网络的情况下,optim.sgd如何正确地使用整个训练集作为输入(X)?

  3. 在这个问题中,使用optim.sgd(或者更好的是optim.adam)的最佳方式是什么?

点赞
用户4834108
用户4834108

模块 nn.View 没有被正确地编写。应该将该层写成 nn.View(−1, out_channels * out_height * out_width)。在上述情况下,它将是 nn.View(-1, 2048)来源:请参阅 此视频 的评论部分。

2017-04-05 22:44:43