我有一个数据集,该数据集被划分为多个较小的数据集。
我想为数据集的每个分区训练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()
权重开始。
答案 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
,并确保在训练后它们是不同的。