1

在结构中调用 Flux 函数时,我似乎得到了不同的行为(不同的输出维度),而不是直接将函数应用于张量:

直接申请:

m = Chain(MaxPool((2,2), stride=2),Conv((3,3), 32*8=>32*16, pad=1), BatchNorm(32*16, relu),Conv((3,3), 32*16=>32*16, pad=1), BatchNorm(32*16, relu))
println(size(m(ones((32, 32, 256, 1))))) #gives the expected (16, 16, 512, 1)

通过结构:

block(in_channels, features) = Chain(MaxPool((2,2), stride=2), Conv((3,3), in_channels=>features, pad=1), BatchNorm(features, relu), Conv((3,3), features=>features, pad=1), BatchNorm(features, relu))

struct test
    b
end

function test()
    b = (block(32*8, 32*16))
    test(b)
end

function (t::test)(x)
    x1 = t.b[1](x)
    println(size(x1)) 
end

test1 = test()
test1(ones((32, 32, 256, 1))) #gives (16, 16, 256, 1)

为什么 2 个片段的输出通道尺寸不同?我对 Julia 中的结构缺少什么?谢谢!

4

2 回答 2

2

(t::test)(x)定义函数的正确方法是

function (t::test)(x)
    x1 = t.b(x)  # Note the absence of [1]
    println(size(x1)) 
end

t.b[1]将给出链中的第一层,即,MaxPool((2, 2), pad = (0, 0, 0, 0), stride = (2, 2))因此您的输入永远不会通过 Conv 层。

于 2020-05-11T21:59:33.553 回答
0

发现错误,它与索引而不是使用结构有关。我声明bb = (block(32*8, 32*16)),但通过索引b[1],我实际上只是调用MaxPool了 Flux 链中的第一个操作( ),这说明了通道维度的差异。我应该做的是b = block(32*8, 32*16)运行x1 = t.b(x)链中的所有功能。

于 2020-05-11T21:59:17.793 回答