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层