Я пытаюсь реализовать RCAN для суперразрешения в Tensorflow Юлун Чжан и др. (Исходный код, опубликованный с бумагой, реализован в PyTorch: https://github.com/yulunzhang/RCAN).
Я пытаясь понять, как они реализовали RCAB. Глядя на опубликованную ими диаграмму сетевой архитектуры, можно понять, как построена нулевая сеть. Но код, похоже, ему не соответствует.
Согласно схеме здесь: https://raw.githubusercontent.com/yulunzhang/RCAN/master/Figs/RCAB.PNG
Каждый RCAB должен иметь следующую структуру:
Residual Channel Attention Block(RCAB){
--0) Conv2D
--1) Relu
--2) Conv2D
--3) Channel Attention Layer{
----0)Global pooling
----1)Conv2D
----2)Relu
----3)Conv2D
----4)Sigmoid
----5)Element Wise Product (Input of this layer/function would be the output from the Conv2D layer 3)
--}
--4) Element Wise Sum (Input of this layer/function would be the input of layer 1)
}
Однако, когда я печатаю модель PyTorch в репозитории GitHub, RCAB выглядит так: (см. https://github.com/yulunzhang/RCAN/blob/master/RCAN_TrainCode/experiment/model/Network_RCAN_BIX2_G10R20P48-2018-07-15-20-14-55.txt для полной печатной модели)
(0)RCAB(
(body): Sequential(
(0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): CALayer(
(avg_pool): AdaptiveAvgPool2d(output_size=1)
(conv_du): Sequential(
(0): Conv2d(64, 4, kernel_size=(1, 1), stride=(1, 1))
(1): ReLU(inplace)
(2): Conv2d(4, 64, kernel_size=(1, 1), stride=(1, 1))
(3): Sigmoid()
)
)
)
)
Там Кажется, что в RCAB моделей, которые публикуются вместе с бумагой, нет упоминания о сумме Element Wise и продукте Element Wise. Слой Signmoid - это последний уровень в каждом RCAB.
Итак, мой вопрос: есть ли в Pytorch неявный способ объявления этих поэлементных слоев суммы / продукта? Или же издатели кода / модели просто не добавили такой уровень и, следовательно, не следовали опубликованной ими схеме архитектуры модели?