Могу ли я одновременно обучать две сети, одна из которых содержит другую сеть? - PullRequest
0 голосов
/ 24 октября 2019

Я определяю две сети в моей модели.

def Net_One():
    conv2d
    conv2d
    ...
def Net_Two():
    Net_One(input)
    conv2d
    fc

Итак, мой вопрос: когда я обучаю Net_Two, используя оптимизацию обратного распространения, будет ли pytorch автоматически обучать Net_One или нет? Почему?

1 Ответ

0 голосов
/ 24 октября 2019

Во-первых, соглашение о названии класса модели должно быть CapWords : NetOne, NetTwo, но это ничего не повредит, просто соглашение.

Что касается ваших вопросов, Это зависит от обработки NetTwo ().
, если окончательная потеря NetTwo не имеет ничего общего с NetOne (), тогда обратное распространение не будет проходить через NetOne (), и, следовательно, не будет обновлятьсяПараметры NetOne (). В противном случае обратное распространение будет вычислять градиенты NetOne () и обновлять его веса.

Для примеров кода:

# NetTwo's loss has nothing to do with NetOne:
def NetOne():
    def __init__(self):
        super(NetOne, self).__init__()
        ...

    def forward(inputs):
        ...


def NetTwo():
    def __init__(self):
        super(NetTwo, self).__init__()
        ...

    def forward(inputs):
        # in this processing, temp is never used by NetTwo's layers..
        ...
        temp = NetOne(inputs)
        inputs = conv2d(inputs)
        ...

В верхних кодах temp никогда не используется, поэтомуNetOne не будет обновляться при обновлении NetTwo.

Но если NetTwo.forward () используется temp, он будет обновлен, как показано ниже:

def NetTwo():
    def __init__(self):
        super(NetTwo, self).__init__()
        ...

    def forward(inputs):
        # in this processing, temp is used by NetTwo's layers.
        ...
        temp = NetOne(inputs)
        inputs = conv2d(temp)
        ...

Сделаноэто ответ на твой вопрос?

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