我正在尝试训练一个火炬神经网络模型列表。我使用列表是因为我想要任何数量的模型,并且能够遍历列表。我目前正在尝试
for i in range(len(model_list)):
old_model = model_list[i]
new_model = train_model(old_model, data) # train_model take a model, trains it, and returns it
model_list[i] = new_model
但是我遇到了某种范围问题,因为列表中的模型不会更新其参数。我认为这与我正在更新的模型有关,是某种克隆,尽管我不明白为什么返回模型没有效果。我的训练代码如下:
def train_model(model, data):
model_optimizer = optim.Adam(model.parameters())
model_output = model(data)
model_loss = criterion(model_output, target) # lets just say target we get from data
model_loss.backward()
model_optimizer.step()
return model
我不明白为什么这样的代码行不通,但是列表中的模型没有更新(检查它们的系数后),损失也没有改变。关于模型或其参数是否存在某种范围问题?还是还有其他问题?谢谢。
答案 0 :(得分:0)
我猜您当前的train_model函数仅在一次迭代中计算损失并更新模型的权重,因为您总是返回模型。
因此,我建议您修改此功能,以便在返回模型之前训练X个时期的模型。
建议的代码:
def train_model(model, data):
model_optimizer = optim.Adam(model.parameters())
for epoch in range(EPOCHS):
for data in train_loader:
model.zero_grad()
model_output = model(data)
model_loss = criterion(model_output, target) # lets just say target we get from data
model_loss.backward()
model_optimizer.step()
return model