我试图使用 MNIST 数据集实现简单的 NN,但一直收到此错误 import matplotlib.pyplot as 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))
Run Code Online (Sandbox Code Playgroud)
这是错误 RuntimeError:维度指定为 0 但张量没有维度
您直接遇到的问题是,NLL 损失期望一个至少为 1 维的张量labels(顺便说一句,您正在拼写它),并且它得到一个 0 维张量(也称为标量)。lables如果您看到此类消息,最好只是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和,这具有额外的数值稳定性的优点。log_softmaxCrossEntropyLoss
| 归档时间: |
|
| 查看次数: |
10195 次 |
| 最近记录: |