我有一个数据集,该数据集被划分为较小的数据集。
我想为数据集的每个分区训练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()权重开始。
发布于 2019-02-21 13:32:31
当您调用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-02-21 13:30:29
每次您将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()))https://stackoverflow.com/questions/54808117
复制相似问题