Julia 将通量与结构一起使用:意外的通道维度

Julia 将通量与结构一起使用:意外的通道维度,julia,flux,Julia,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))))) #gi

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

直接应用:

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)

为什么这两个代码段的输出通道尺寸不同?关于朱莉娅的结构,我遗漏了什么?谢谢

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

定义
(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),stride=(2,2))
,因此您的输入永远不会通过Conv层