Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 为什么相同的PyTorch代码(不同的实现)会造成不同的损失?_Machine Learning_Deep Learning_Neural Network_Computer Vision_Pytorch - Fatal编程技术网

Machine learning 为什么相同的PyTorch代码(不同的实现)会造成不同的损失?

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

我在处理Udacity上的时尚MNIST数据集问题。然而,与Udacity团队共享的解决方案相比,我的代码实现带来了截然不同的损失。我相信我的答案唯一的区别是神经网络的定义,除此之外,一切都是一样的。我无法找出损失如此巨大差异的原因

代码1:我的解决方案:

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官方教程,如果可能,请避免重复代码,如果您对两个网络使用相同的培训程序,您将在几秒钟而不是几天内发现这个问题。干杯