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