我有一个数据集,它被划分成更小的数据集。
我想为数据集的每个分区训练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]

在打印过程中,对于每个保存的模型,我都得到了相同的精确参数,这很奇怪,而且我还注意到,在每次迭代之后,模型实际上从上一次迭代中恢复训练,因为每次迭代的损失更低。
我试图实现的是,每次迭代都在当前子集上得到一个新的模型,但是训练应该从相同的初始权重开始。

最佳答案

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

08-25 05:44