несоответствие размеров, m1: [3584 x 28], м2: [784 x 128] в /pytorch/aten/src/TH/generic/THTensorMath.cpp:940 - PullRequest
0 голосов
/ 16 января 2019

Я выполнил следующий код и получил ошибку, показанную в самом низу. Я хотел бы знать, как решить эту проблему. спасибо

import torch.nn as nn
import torch.nn.functional as F
from torch import optim

from torchvision import transforms
_tasks = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

from torchvision.datasets import MNIST
mnist = MNIST("data", download=True, train=True, transform=_tasks)

from torch.utils.data import DataLoader
from torch.utils.data.sampler import SubsetRandomSampler

create training and validation split
split = int(0.8 * len(mnist))

index_list = list(range(len(mnist)))
train_idx, valid_idx = index_list[:split], index_list[split:]

create sampler objects using SubsetRandomSampler
tr_sampler = SubsetRandomSampler(train_idx)
val_sampler = SubsetRandomSampler(valid_idx)

create iterator objects for train and valid datasets
trainloader = DataLoader(mnist, batch_size=256, sampler=tr_sampler)
validloader = DataLoader(mnist, batch_size=256, sampler=val_sampler)
Создание модели для исполнения
class Model(nn.Module):
  def init(self):
    super().init()
    self.hidden = nn.Linear(784, 128)
    self.output = nn.Linear(128, 10)

  def forward(self, x):
    x = self.hidden(x)
    x = F.sigmoid(x)
    x = self.output(x)
    return x

model = Model()

loss_function = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay= 1e-6, momentum = 0.9, nesterov = True)

for epoch in range(1, 11): ## run the model for 10 epochs
  train_loss, valid_loss = [], []

  #training part
  model.train()
  for data, target in trainloader:
    optimizer.zero_grad()

    #1. forward propagation
    output = model(data)

    #2. loss calculation
    loss = loss_function(output, target)

    #3. backward propagation
    loss.backward()

    #4. weight optimization
    optimizer.step()

    train_loss.append(loss.item())

  # evaluation part
  model.eval()
  for data, target in validloader:
     output = model(data)
     loss = loss_function(output, target)
     valid_loss.append(loss.item())

При выполнении этого я получаю следующую ошибку:

RuntimeError Traceback (последний последний вызов) в () ----> 1 выход = модель (данные) 2 3 ## 2. расчет потерь 4 потеря = функция потерь (выход, цель) 5

/ usr / local / lib / python3.6 / dist-packages / torch / nn / modules / module.py в вызов (self, * input, ** kwargs) 487 result = self._slow_forward (* input, ** kwargs)

/ usr / local / lib / python3.6 / dist-packages / torch / nn / functions.py в линейный (вход, вес, смещение) 1352 рет = torch.addmm (torch.jit._unwrap_optional (bias), вход, weight.t ()) 1353 еще: -> 1354 output = input.matmul (weight.t ()) 1355, если смещение не равно None: 1356 output + = torch.jit._unwrap_optional (bias)

RuntimeError: несоответствие размера, m1: [3584 x 28], м2: [784 x 128] при /pytorch/aten/src/TH/generic/THTensorMath.cpp:940

1 Ответ

0 голосов
/ 16 января 2019

Ваши входные данные MNIST имеют форму [256, 1, 28, 28], соответствующую [B, C, H, W]. Вам необходимо сгладить входные изображения в один вектор длиной 784, прежде чем подавать его на линейный слой Linear(784, 128) так, чтобы входное значение стало [256, 784], соответствующее [B, N], где N равно 1x28x28, вашему размеру изображения. Это можно сделать следующим образом:

for data, target in trainloader:

        # Flatten MNIST images into a 784 long vector
        data = data.view(data.shape[0], -1)

        optimizer.zero_grad()
        ...

То же самое необходимо сделать в цикле проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...