【问题标题】:SpatialDepthWiseConvolution Xception backpropagation errorSpatialDepthWiseConvolution Xception 反向传播错误
【发布时间】:2018-08-03 13:05:39
【问题描述】:

我正在尝试实施受 Xception 想法启发的 NN。 无法理解我的模型有什么问题...

local torch = require 'torch'
local nn = require 'nn'

dofile('GlobalAveragePooling.lua')

local model = nn.Sequential()
-- Entry convolution 
model:add( nn.SpatialConvolution(3, 64, 3, 3, 2, 2, 1, 1) )
model:add( nn.SpatialBatchNormalization(64) )
model:add( nn.ReLU() )

-- Xception Unit with "skip-path"
local seq = nn.Sequential()
seq:add( nn.SpatialDepthWiseConvolution(64, 1, 3, 3, 1, 1, 1, 1) )
seq:add( nn.SpatialConvolution(64, 512, 1, 1, 1, 1, 0, 0) )
seq:add( nn.SpatialBatchNormalization(512) )
seq:add( nn.SpatialMaxPooling(3, 3, 2, 2, 1, 1) )

local con = nn.ConcatTable()
con:add( nn.SpatialConvolution(64, 512, 1, 1, 2, 2, 0, 0) )
con:add( seq )

model:add( con )
model:add( nn.CAddTable() )
model:add( nn.ReLU() )

-- Exit fully-connected layers for softmax(3) output
model:add( nn.GlobalAveragePooling() )
model:add( nn.Reshape(512) )

model:add( nn.Linear(512, 3) )
model:add( nn.LogSoftMax() )

print(tostring(model))

local X = torch.randn(10, 3, 16, 8)
local Y = torch.LongTensor(10):random(1,3)

local criterion = nn.ClassNLLCriterion()

local Yhat = model:forward(X)

local loss = criterion:forward(Yhat, Y)
local gradLoss = criterion:backward(Yhat, Y)
model:backward(X, gradLoss)

该模型在 forward() 步骤中效果很好。 但是当涉及到模型时失败:backward(X, gradLoss) 错误:

    /nn/THNN.lua:110: Need gradOutput of dimension 5 and gradOutput.size[3] == 8 but got gradOutput to be of shape: [10 x 64 x 1 x 4 x 8] at ../THNN/generic/SpatialDepthWiseConvolution.c:53
stack traceback:
[C]: in function 'v'    ../nn/THNN.lua:110: in function 'SpatialDepthWiseConvolution_updateGradInput'   ../nn/SpatialDepthWiseConvolution.lua:80:
in function 'updateGradInput' ../Module.lua:31:
in function <../nn/Module.lua:29>
[C]: in function 'xpcall'   ../nn/Container.lua:63:
in function 'rethrowErrors'     ../nn/Sequential.lua:88:
in function <../nn/Sequential.lua:78>
[C]: in function 'xpcall'   ../Container.lua:63:
in function 'rethrowErrors'     ../nn/ConcatTable.lua:66:
in function <../ConcatTable.lua:30>
[C]: in function 'xpcall'   ../nn/Container.lua:63:
in function 'rethrowErrors'     ../nn/Sequential.lua:84:
in function 'backward'  test.lua:45:
in main chunk   [C]: at 0x00405d50

【问题讨论】:

标签: lua neural-network deep-learning torch


【解决方案1】:

事实证明,问题在于 Torch/nn 中 SpatialDepthWiseConvolution 的低级实现。我创建了一个问题:https://github.com/torch/nn/issues/1307

目前(2018 年 3 月 3 日)此问题尚未解决。 当然,我希望有人能修复低级实现中的错误。 但目前我知道两种方法可以解决这个问题:

  • 通过火炬容器模拟
  • 使用我的纯 lua 实现

这是一种使用容器 ConcatParallel 以及标准 SpatialConvolution 模块来模拟此模块的方法:

  local depth_wise_conv = nn.Concat(2)
  for o = 1, nOutputPlane do
    local out = nn.Parallel(2, 2)
    for i = 1, nInputPlane do
      local seq = nn.Sequential()
      local conv = nn.SpatialConvolution(1, 1, kW, kH, dW, dH, pW, pH):noBias()
      seq:add( nn.Reshape(1, inputHeight, inputWidth) )
      seq:add( conv )
      out:add( seq )
    end
    depth_wise_conv:add( out )
  end

请注意,上面代码中的 depth_wise_conv 模块应该获得 4 维的批量输入:batchSize x nInputPlane x inputHeight x inputWidth

但我也花了一些时间创建了一个纯 lua 实现的 SpatialDepthWiseConvolution 作为一个模块。你可以在这里找到它: https://gist.github.com/diovisgood/36ce5a6c5e9dd4cb20b13dd2a28c1f71

还有:SpatialConvolution 实现和单元测试。 我在 MIT 许可下发布了这些模块,因此任何人都可以使用它们。

请注意,这些模块尚未经过大量测试! 因此,感谢您提供任何帮助或建议。

还有一件事。 Vincent Dumoulin 和 Francesco Visin 有一篇很棒的论文解释了卷积和转置卷积: 'A guide to convolution arithmetic for deep learning'

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2023-04-05
    • 2017-05-13
    • 2023-03-20
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多