Есть ли в PyTorch неявные функции для поэлементного произведения и суммы? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь реализовать 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 неявный способ объявления этих поэлементных слоев суммы / продукта? Или же издатели кода / модели просто не добавили такой уровень и, следовательно, не следовали опубликованной ими схеме архитектуры модели?

1 Ответ

0 голосов
/ 29 мая 2020

Если вы посмотрите на их фактический файл модели, вы можете найти поэлементную сумму (реализованную как +): https://github.com/yulunzhang/RCAN/blob/master/RCAN_TrainCode/code/model/rcan.py

Я считаю, что поэлементный продукт обрабатывается так же путь. Это не совсем «часть модели» в смысле PyTorch. Они не создаются в __init__ и являются своего рода динамическими c, только раскрывая их поведение во время прохода forward. Анализ модели Stati c не мог их выявить (и, следовательно, не показать в текстовом сообщении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...