如何一起训练两个具有不同输入的pytorch网络?

时间:2020-05-12 09:22:30

标签: deep-learning neural-network pytorch

我对pytorch完全陌生,所以这可能是一个非常基本的问题。我有两个应该一起训练的网络。

  1. 第一个将数据作为输入并返回其嵌入作为输出。

  2. 第二个将成对的嵌入式数据点作为输出返回它们的“相似性”。

  3. 然后,
  4. 为每个数据点计算部分损失,然后将所有损失合并。

  5. 此最终损失应通过两个网络反向传播。

该代码应如何显示?我在想这样的事情:

def train_models(inputs, targets):
    network1.train()
    network2.train()
    embeddings = network1(inputs)
    paired_embeddings = pair_embeddings(embeddings)
    similarities = network2(similarities)

    """
        I don't know how the loss should be calculated here.
        I have a loss formula for every embedded datapoint, 
        but not for every similarity.
        But if I only calculate loss for every embedding (using similarites),
        won't backpropagate() only modify network1, 
        since embeddings are network1's outputs
        and have not been modified in network2?
    """        

    optimizer1.step()
    optimizer2.step()
    scheduler1.step()
    scheduler2.step()
    network1.eval()
    network2.eval()

我希望这一点足够具体。如有必要,我会很乐意分享更多详细信息。一般而言,我对pytorch和深度学习非常缺乏经验,以至于我都不知道如何问这个问题。

1 个答案:

答案 0 :(得分:0)

您可以为此使用单个优化器,甚至可以为每个网络传递不同的学习率。

optimizer = optim.Adam([
    {'params': network1.parameters()},
    {'params': network2.parameters(), 'lr': 1e-3}
], lr=1e-4)

# ...

loss = loss1 + loss2
loss.backward()
optimizer.step()