每次训练课程结束后,Pytorch都会恢复训练

时间:2019-02-21 13:20:18

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

我有一个数据集,该数据集被划分为多个较小的数据集。

我想为数据集的每个分区训练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()权重开始。

2 个答案:

答案 0 :(得分:2)

每次将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()))

答案 1 :(得分:1)

调用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,并确保在训练后它们是不同的。