Python 如何在Torch中培训一系列模型?

Python 如何在Torch中培训一系列模型?,python,scope,pytorch,torch,Python,Scope,Pytorch,Torch,我正在尝试训练一系列torch神经网络模型。我之所以使用列表,是因为我希望有任意数量的模型,并且能够遍历列表。我目前正在努力 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] = ne

我正在尝试训练一系列torch神经网络模型。我之所以使用列表,是因为我希望有任意数量的模型,并且能够遍历列表。我目前正在努力

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

我不明白为什么这样的代码不起作用,但是列表中的模型没有更新(在检查它们的系数之后),并且损失没有改变。这是关于模型或其参数的某种范围问题吗?还是有其他问题?谢谢。

我猜您当前的train\u模型函数只是计算损失,并更新模型的权重,因为您总是返回模型

因此,我建议您修改此函数,以便在返回模型之前为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

我猜您当前的train_模型函数只是计算损失,并在一次迭代中更新模型的权重,因为您总是返回模型

因此,我建议您修改此函数,以便在返回模型之前为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

这似乎是一个不同的用例。在本例中,您缺少了
model\u optimizer.zero\u grad()
。这似乎是一个不同的用例。在本例中,您缺少
模型\u优化器.zero\u grad()