RuntimeError:维度指定为 0 但张量没有维度

2024-03-28

我试图使用 MNIST 数据集实现简单的 NN,但我不断收到此错误 将 matplotlib.pyplot 导入为 plt

import torch
from torchvision import models
from torchvision import datasets, transforms
from torch import nn, optim
import torch.nn.functional as F
import helper

transform = transforms.ToTensor()

train_data = datasets.MNIST(root='data', train=True,
                                   download=True, transform=transform)
test_data = datasets.MNIST(root='data', train=False,
                                  download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size = 20, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size = 20, shuffle=True)
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(784,10)

    def forward(self,x):

        x = x.view(-1,784)
        x = F.relu(self.fc1(x))
        x = F.log_softmax(x, dim = 1)
        return x


model = Net()
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr = 0.003)

epochs = 20
model.train()
for epoch in range(epochs):
    train_loss = 0

    for image, lables in train_data:

        optimizer.zero_grad()

        output = model(image)
        loss = criterion(output, lables)
        loss.backwards()
        optimizer.step()
        train_loss += loss.item()*image.size(0)
    train_loss = train_loss/len(train_data.dataset)

    print('Epoch: {} \tTraining Loss: {:.6f}'.format(epoch+1, train_loss))

这是错误 RuntimeError:维度指定为 0 但张量没有维度


您直接遇到的问题是 NLL 损失预计为labels(你正在拼写它lables顺便说一句)至少 1 维的张量,并且它得到一个 0 维张量(也称为标量)。如果您看到此类消息,最好只是print(output.shape, labels.shape)以便于检查。此错误的根源是您可能错误地运行for image, labels in train_data代替for image, labels in train_loader。结果是你的数据没有被批处理 - 对来自的标量进行批处理dataset将创建缺失的维度NLLLoss抱怨。

修复此问题后,我们将继续修复backwards -> backward最后len(train_data.dataset) -> len(train_data)。然后循环起作用(如果它是一个合理的网络等,我没有测试)。

作为旁注,您可以结合NLLLoss and log_softmax通过使用CrossEntropyLoss https://pytorch.org/docs/master/nn.html#torch.nn.CrossEntropyLoss,其优点是具有额外的数值稳定性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RuntimeError:维度指定为 0 但张量没有维度 的相关文章

随机推荐