【问题标题】:Make first layer of AlexNet parallel in lua在 lua 中使 AlexNet 的第一层并行
【发布时间】:2017-11-29 16:35:59
【问题描述】:

我正在尝试在 Lua 的 Torch 中为 Alexnet 的第一层创建并行表。我想将两批 RGB 图像传递给网络,然后将它们的添加发送到下一层。例如:假设我想将 6 个通道的图像发送到 alexnet 的第一层,但在这种情况下,我想将两批 3 个通道的图像发送到第一个并行层,将它们连接起来,然后将输出发送到下一层层。 实际代码是这样的:

net = nn.Sequential()
net:add(nn.SpatialConvolution(3,96,11,11,4,4,2,2))       
net:add(nn.SpatialBatchNormalization(96))
net:add(nn.ReLU(true))
net:add(nn.SpatialMaxPooling(3,3,2,2))                   
net:add(nn.SpatialConvolution(96,256,5,5,1,1,2,2))       
net:add(nn.SpatialBatchNormalization(256))
net:add(nn.ReLU(true))
net:add(nn.SpatialMaxPooling(3,3,2,2))                   
net:add(nn.SpatialConvolution(256,384,3,3,1,1,1,1))     

我认为它可以工作的代码是:

net = nn.Sequential()
c = nn.ParallelTable()
c:add(nn.SpatialConvolution(3,48,11,11,4,4,2,2)) 
c:add(nn.SpatialConvolution(3,48,11,11,4,4,2,2))
net:add(c)
net:add(nn.JoinTable(1,8))
net:add(nn.SpatialBatchNormalization(96))
net:add(nn.ReLU(true))
net:add(nn.SpatialMaxPooling(3,3,2,2)) 

我得到的错误是:

在 nn.ParallelTable 的 1 个模块中: /torch/install/share/lua/5.1/cudnn/init.lua:171:断言失败!

我想知道这个实现哪里出了问题,非常感谢任何帮助。

谢谢

【问题讨论】:

  • 实际代码显示输入有 18 个通道,因此您不能使用带有 3 个输入通道的SpatialConvolution
  • 这是我的错误。实际代码是 3 将获得 3 个通道的输入,但现在我想给模型 2 批 3 通道图像(我可以通过在第一层将 3 更改为 6 来给模型批次 6 通道,但我想给网络两批3通道而不是一批6通道)
  • 模型输入张量的尺寸是多少?
  • 输入张量的尺寸是128* 3*227 * 227。
  • 您正在使用 gpu 进行培训?你的模型和输入张量被转换成 cuda 模型和张量了吗?

标签: lua parallel-processing deep-learning layer torch


【解决方案1】:

您的错误出现在net:add(nn.JoinTable(1,8)) 行上,它应该是 3 而不是 8。这个值是输入张量的维度数(不将批处理维度计为维度)。在这里你用 3D 图像为你的网络提供信息,然后你应该写 net:add(nn.JoinTable(1,3))

我使用了以下代码,一切顺利

require 'nn'
require 'cutorch'
require 'cunn'
require 'cudnn'

net = nn.Sequential()
c = nn.ParallelTable()
c:add(nn.SpatialConvolution(3,48,11,11,4,4,2,2)) 
c:add(nn.SpatialConvolution(3,48,11,11,4,4,2,2))
net:add(c)
net:add(nn.JoinTable(1,3))
net:add(nn.SpatialBatchNormalization(96))
net:add(nn.ReLU(true))
net:add(nn.SpatialMaxPooling(3,3,2,2)) 

net:cuda()

input1 = torch.rand(128,3,227, 227):cuda()
input2 = torch.rand(128,3,227,227):cuda()

out = net:forward({input1, input2})

print(out:size())

【讨论】:

  • 非常感谢您的帮助。我将其更改为 3 并且有效。
  • @M.es 如果这解决了您的问题,请接受答案以向所有人表明问题已解决
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2017-05-08
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多