Machine learning 为什么相同的PyTorch代码(不同的实现)会造成不同的损失?
我在处理Udacity上的时尚MNIST数据集问题。然而,与Udacity团队共享的解决方案相比,我的代码实现带来了截然不同的损失。我相信我的答案唯一的区别是神经网络的定义,除此之外,一切都是一样的。我无法找出损失如此巨大差异的原因 代码1:我的解决方案:Machine learning 为什么相同的PyTorch代码(不同的实现)会造成不同的损失?,machine-learning,deep-learning,neural-network,computer-vision,pytorch,Machine Learning,Deep Learning,Neural Network,Computer Vision,Pytorch,我在处理Udacity上的时尚MNIST数据集问题。然而,与Udacity团队共享的解决方案相比,我的代码实现带来了截然不同的损失。我相信我的答案唯一的区别是神经网络的定义,除此之外,一切都是一样的。我无法找出损失如此巨大差异的原因 代码1:我的解决方案: import torch.nn as nn from torch import optim images, labels = next(iter(trainloader)) model = nn.Sequential(nn.Linear(7
import torch.nn as nn
from torch import optim
images, labels = next(iter(trainloader))
model = nn.Sequential(nn.Linear(784,256),
nn.ReLU(),
nn.Linear(256,128),
nn.ReLU(),
nn.Linear(128,64),
nn.ReLU(),
nn.Linear(64,10),
nn.LogSoftmax(dim=1))
# Flatten images
optimizer = optim.Adam(model.parameters(),lr=0.003)
criterion = nn.NLLLoss()
for i in range(10):
running_loss = 0
for images,labels in trainloader:
images = images.view(images.shape[0], -1)
output = model.forward(images)
loss = criterion(output,labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
else:
print(f"Training loss: {running_loss}")
# Loss is coming around 4000
代码2:官方解决方案:
from torch import nn, optim
import torch.nn.functional as F
class Classifier(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(784, 256)
self.fc2 = nn.Linear(256, 128)
self.fc3 = nn.Linear(128, 64)
self.fc4 = nn.Linear(64, 10)
def forward(self, x):
# make sure input tensor is flattened
x = x.view(x.shape[0], -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.relu(self.fc3(x))
x = F.log_softmax(self.fc4(x), dim=1)
return x
model = Classifier()
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr=0.003)
epochs = 5
for e in range(epochs):
running_loss = 0
for images, labels in trainloader:
log_ps = model(images)
loss = criterion(log_ps, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
else:
print(f"Training loss: {running_loss}")
# Loss is coming around 200
损失的巨大差异有什么解释吗?您在实现中忘记了调零/清除梯度。这就是你所缺少的:
optimizer.zero\u grad()
换言之,只需做:
范围(10)内的i的:
运行损耗=0
对于图像,trainloader中的标签:
images=images.view(images.shape[0],-1)
输出=模型向前(图像)
损失=标准(输出、标签)
#错过了这个!
optimizer.zero_grad()
loss.backward()
optimizer.step()
运行损失+=损失。项目()
其他:
打印(f“培训损失:{running_loss}”)
你可以走了 您忘了在实现中调零/清除渐变。这就是你所缺少的:
optimizer.zero\u grad()
换言之,只需做:
范围(10)内的i的:
运行损耗=0
对于图像,trainloader中的标签:
images=images.view(images.shape[0],-1)
输出=模型向前(图像)
损失=标准(输出、标签)
#错过了这个!
optimizer.zero_grad()
loss.backward()
optimizer.step()
运行损失+=损失。项目()
其他:
打印(f“培训损失:{running_loss}”)
你可以走了 检查数据加载器:批量大小和数据扩充。确保它们是相同的。嗨,数据加载器是完全相同的。我的任务是创建模型并起草培训循环。一位好心的用户指出,我在代码中缺少optimizer.zero_grad(),当我将它添加回代码时,我得到了与原始解决方案类似的结果检查数据加载器:批量大小和数据扩展。确保它们是相同的。嗨,数据加载器是完全相同的。我的任务是创建模型并起草培训循环。一位好心的用户指出,我在代码中缺少optimizer.zero_grad(),当我将它添加回代码时,我得到的结果与最初为我解决问题的解决方案H-man相似。真不敢相信那东西居然溜走了。老实说,我认为optimizer.zero_grad()只在启动网络时使用,因为我是在同一块代码中启动它的,所以我认为它不是必需的。非常感谢您的回答。我很高兴:)顺便说一句,请确保您阅读了Pytorch官方教程,如果可能,请避免重复代码,如果您对两个网络使用相同的培训程序,您将在几秒钟而不是几天内发现这个问题。干杯那个帮我解决问题的人。真不敢相信那东西居然溜走了。老实说,我认为optimizer.zero_grad()只在启动网络时使用,因为我是在同一块代码中启动它的,所以我认为它不是必需的。非常感谢您的回答。我很高兴:)顺便说一句,请确保您阅读了Pytorch官方教程,如果可能,请避免重复代码,如果您对两个网络使用相同的培训程序,您将在几秒钟而不是几天内发现这个问题。干杯