Python pytorch模型未更新

Python pytorch模型未更新,python,pytorch,training-data,Python,Pytorch,Training Data,我把我的培训代码放在下面。我使用torch.optim.SGD作为优化器。我原以为optimizer.step()会进行更新,但模型精度似乎保持不变。我的朋友说他没有使用optimizer.step(),他的工作很好。 我试着把它拿出来,结果还是一样。我会做错什么? 我认为准确度计算没有问题 class FNet(nn.Module): def __init__(self, **kwargs): super().__init__() self.fc1 =

我把我的培训代码放在下面。我使用torch.optim.SGD作为优化器。我原以为optimizer.step()会进行更新,但模型精度似乎保持不变。我的朋友说他没有使用optimizer.step(),他的工作很好。 我试着把它拿出来,结果还是一样。我会做错什么? 我认为准确度计算没有问题

class FNet(nn.Module):
    def __init__(self, **kwargs): 
        super().__init__()
        self.fc1 = nn.Linear(128*256, 1024) 
        self.fc2 = nn.Linear(1024, 256)
        self.fc3 = nn.Linear(256, 2)

    def forward(self, X): 
        X = F.relu(self.fc1(X))
        X = F.relu(self.fc2(X))
        X = self.fc3(X)
        return F.softmax(X, dim=1)



def main():

    learning_rate = 0.01
    model = FNet()
    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9, weight_decay=5e-04) # you can play with momentum and weight_decay parameters as well
    accs = [0,]

    for epoch in range(max_epoch):

        train(epoch, model, optimizer, train_batch)

        acc = test(model, val_batch)
        accs.append(acc)


def train(epoch, model, optimizer, trainloader):
    model.train()
    optimizer.zero_grad()
    for batch_idx, (data, labels) in enumerate(trainloader):

        outputs = model(data)
        loss = F.nll_loss(outputs, labels)
        loss.backward()

        optimizer.step()


def test(model, testloader):
    correct = 0
    total = 0
    model.eval()

    for batch_idx, (data, labels) in enumerate(testloader):

            outputs = model(data.view(-1,128*256))

            for sample_idx,output in enumerate(outputs):

                if torch.argmax(output) == labels[sample_idx]:
                    correct = correct + 1
                total = total + 1

    accuracy = correct/total
    return accuracy

我想这条线应该在你的for循环下
优化器.zero\u grad()
。需要在每个循环后清除参数渐变

试试这个

def train(epoch, model, optimizer, trainloader):
    model.train()
    for batch_idx, (data, labels) in enumerate(trainloader):
        optimizer.zero_grad()
        outputs = net(data)
        loss = F.nll_loss(outputs, labels)
        loss.backward()

        optimizer.step()
我认为您应该在型号的最后一行中使用而不是
softmax

def forward(self, X): 
    X = F.relu(self.fc1(X))
    X = F.relu(self.fc2(X))
    X = self.fc3(X)
    return F.log_softmax(X, dim=1) # => use `log_softmax` instead.
要求输入为日志概率。文件说:

通过前向调用提供的输入应包含每个类的日志概率



另外,如中所述,在for循环内使用
optimizer.zero\u grad()

给出一小段代码没有帮助。缺少相关信息,例如,您是否已将模型参数传递给优化器?优化器需要知道要更新哪些参数。我添加了运行代码的其余部分。您是否观察到损失值,它是否减少了?损失值到处都是,有时减少,有时恢复。我不知道发生了什么。你可以在不设置动量和权重衰减并检查的情况下使用优化器吗?这不会影响任何事情即使它不影响,你也必须在每次迭代时调用零梯度。修复了零梯度,将其改为log\u softmax,现在损失几乎保持不变,精度仍然不变