【问题标题】:Pytorch resumes training after every training sessionPytorch 在每次训练后恢复训练
【发布时间】:2019-07-15 10:16:45
【问题描述】:

我有一个数据集,它被分割成更小的数据集。

我想为数据集的每个分区训练 3 个模型,但我需要所有训练会话都从相同的初始化网络参数开始。

所以它看起来像这样:

modelList = []
thisCNN = NNet()

for x in range(3):
    train = torch.utils.data.DataLoader(Subset(train_set, indexes[x]), batch_size=32)
    bb = trainMyNet(thisCNN, train, test)
    modelList.append(list(bb.parameters()))

print modelList[0][1]
print modelList[1][1]
print modelList[2][1]

在打印过程中,我为每个保存的模型获得了相同的精确参数,这很奇怪,而且我还注意到,在每次迭代之后,模型实际上会从上一次迭代中恢复训练,因为它会降低每次迭代的损失。

我想要实现的是,每次迭代都在当前子集x 上获得一个新模型,但训练应该以相同的初始thisCNN = NNet() 权重开始。

【问题讨论】:

    标签: python machine-learning deep-learning computer-vision pytorch


    【解决方案1】:

    每次您将thisCNN 传递到trainMyNet 时,您都在传递同一个网络。因此,权重将在同一位置更新。您应该在 for 循环中声明 thisCNN

    for x in range(3):
        thisCNN = NNet()
        train = torch.utils.data.DataLoader(Subset(train_set, indexes[x]), batch_size=32)
        bb = trainMyNet(thisCNN, train, test)
        modelList.append(list(bb.parameters()))
    

    【讨论】:

    • 不正确。我已经尝试过了,正如预期的那样,在每次迭代中,`thisCNN = NNet()` 都会获得新的初始权重。
    • 然后,在 for 循环之外尝试 cnns = [NNet()] * 3。在里面,你只需调用cnns[x] 而不是thisCNN
    • 另外,请分享您的trainMyNet
    【解决方案2】:

    当您调用bb = trainMyNet(thisCNN, train, test) 时,您不会获取thisCNN 的副本,但它与您在每次迭代中更新的模型相同。为了让您的代码正常工作,您可能应该传递此模型的副本:

    from copy import deepcopy    
    modelList = []
    thisCNN = NNet()
    
    for x in range(3):
        train = torch.utils.data.DataLoader(Subset(train_set, indexes[x]), batch_size=32)
        bb = trainMyNet(deepcopy(thisCNN), train, test)
        modelList.append(list(bb.parameters()))
    
    print modelList[0][1]
    print modelList[1][1]
    print modelList[2][1]
    

    这应该将所有模型初始化为thisCNN,并确保它们在训练后不同。

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 2020-12-29
      • 1970-01-01
      • 2018-10-13
      • 2021-06-24
      • 2021-05-31
      • 1970-01-01
      • 2018-07-28
      • 2022-01-21
      相关资源
      最近更新 更多