【问题标题】:RuntimeError: shape '[784]' is invalid for input of size 7840RuntimeError:形状“[784]”对于大小为 7840 的输入无效
【发布时间】:2021-01-07 16:03:52
【问题描述】:

下面是代码:

import torch

import torchvision

from torchvision import transforms, datasets

#确定批量大小

Batch_size = 10

#下载火车数据

train_mnist = datasets.MNIST(root="./data", train=True, download=True,
                   transform=transforms.Compose([transforms.ToTensor()]))

#将训练数据传入Dataloader

train_set = torch.utils.data.DataLoader(train_mnist, batch_size=Batch_size, shuffle=True)

#下载测试数据

test_mnist = datasets.MNIST(root="./data", train=True, download=True,
                   transform=transforms.Compose([transforms.ToTensor()]))

#将测试数据传入Dataloader

test_set = torch.utils.data.DataLoader(test_mnist, batch_size=Batch_size, shuffle=True)

#构建网络

import torch.nn as nn
import torch.nn.functional as f
class Netwk(nn.Module):

def __init__(self):
    super().__init__()
    self.fc1 = nn.Linear(28*28, 64)
    self.fc2 = nn.Linear(64, 64)
    self.fc3 = nn.Linear(64, 64)
    self.fc4 = nn.Linear(64, 10)

def Fpropagation(self, x):
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = F.relu(self.fc3(x))
    x = self.fc4(x)

return F.log_softmax(x, dim=1)

return x

net = Netwk()

print(net)

#为损失创建优化

import torch.optim as optim

Optimizer = optim.Adam(net.parameters(), lr=0.001)

EPOCHS = 3
for epoch in range(EPOCHS):
    for data in train_set:
        X, y = data
        net.zero_grad()
        output = net(X.view(28*28))
        loss = F.nll_loss(output, y)
        loss.backward()
        optimizer.step()
        print(loss)

#我得到的错误

RuntimeError                              Traceback (most recent call last)

<ipython-input-58-b92f3c4f7059> in <module>()
     10     X, y = data
     11     net.zero_grad()
---> 12     output = net(X.view(28*28))
     13     loss = F.nll_loss(output, y)
     14     loss.backward()

RuntimeError: shape '[784]' is invalid for input of size 7840

试图绕过它,我似乎无法理解什么是错的。从已经尝试过的谷歌搜索来看,我的尺寸似乎有问题,如果完全是问题的话,我不知道如何获得正确的尺寸。

【问题讨论】:

  • X.view(28*28) 更改为X.view(280*280)
  • @sahasrara62,是的,已经这样做了,仍然出现错误。 RuntimeError Traceback(最近一次调用最后一次) in () 10 X, y = data 11 net.zero_grad() ---> 12 output = net(X.view(280* 280)) 13 loss = F.nll_loss(output, y) 14 loss.backward() RuntimeError: shape '[78400]' is invalid for input of size 7840
  • @sahasrara62 看这里的代码,github.com/Elijah-A-W/ALGORITHMS/blob/master/MnestPytorch.ipynb,谢谢。
  • 我不在ML区域,但是数据点和矩阵计算似乎不匹配,您需要在该区域查看

标签: python


【解决方案1】:

您在这里忘记了“批处理”。请看,当您for loop 中并X, y = data 行解构您的data。在这里,你可能认为X 是来自 trainset 的图像,但实际上 X 是一组图像(具体来说,10将 10 设置为您的 batch_size) 和 y 同样是一批标签。意思是,您的X 的形状类似于10x28x28x1。现在,您可能会意识到net(X.view(28*28)) 行实际上是将整批 10 张图像压缩成一个 28x28=>784 大小的向量,这是错误的,对吧?因此,您可能想要在这里做的是net(X.view(-1, 28*28)),现在-1 将确保无论您的批量大小是多少,当您将数据发送到模型中时它都保持不变,所以现在您可以轻松推断出形状X 将是10x784,这就是你想要的。

我注意到的另一件事,可能是一个错字,您的test_settrain_set 实际上是相同的。要下载正确的 test_set,确保发送 train=False 作为参数。

【讨论】:

  • 我设法更正了下载 test_set 并设置 train=False,您的解释帮助我真正理解了尺寸的工作原理,但我仍然收到错误请查看它,github.com/Elijah-A-W/ALGORITHMS/blob/master/MnestPytorch.ipynb跨度>
  • 将模型类 (Netwk()) 中的 Fpropagation() 方法名称更改为 forward(),因为您使用的是 PyTorch,因此您需要像它们一样命名这些方法在他们自己的实现中,错误应该会消失。另一个建议,在您的训练循环中将 net.zero_grad() 更改为 Optimizer.zero_grad()
  • ,非常感谢。它终于奏效了,我是深度学习的新手。我经常遇到这些挑战。请问有没有我可以参考和正确学习的资源,能够理解 pytorch 和深度学习在做什么?
  • 太棒了!要了解 PyTorch,您可以查看他们的教程 section,他们展示了如何构建各种模型,对于深度学习的理论部分,您可以查看 Andrew Ng 的 youtube 视频,它会给您基本的直觉.
猜你喜欢
  • 2020-06-11
  • 2020-09-03
  • 1970-01-01
  • 2021-10-11
  • 2022-01-15
  • 1970-01-01
  • 2021-08-02
  • 2020-07-08
  • 2021-12-16
相关资源
最近更新 更多