Несоответствие размеров Pytorch vsion, м1 - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь запустить простую линейную регрессию, но у меня возникает ошибка при тренировке.

Размер изображений - это форма последовательности данных print(dataset_train[0][0].shape) показывает мне torch.Size([3, 227, 227])


size_of_image=3*227*227

class linearRegression(nn.Module):
    def __init__(self, inputSize, outputSize):
        super(linearRegression, self).__init__()
        self.linear = nn.Linear(inputSize, outputSize)

    def forward(self, x):
        out = self.linear(x)
        return out

model = linearRegression(size_of_image, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
criterion = torch.nn.CrossEntropyLoss()         
trainloader = DataLoader(dataset = dataset_train, batch_size = 1000)
for epoch in range(5):
    for x, y in trainloader:
        yhat = model(x)
        loss = criterion(yhat, y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()            

Я пытался понять, что это за ошибка, но я не нашел решения, может ли кто-нибудь мне помочь?

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-44-6f00f9272a22> in <module>
      1 for epoch in range(5):
      2     for x, y in trainloader:
----> 3         yhat = model(x)
      4         loss = criterion(yhat, y)
      5         optimizer.zero_grad()

~/PycharmProjects/estudios/venv/lib/python3.8/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    548             result = self._slow_forward(*input, **kwargs)
    549         else:
--> 550             result = self.forward(*input, **kwargs)
    551         for hook in self._forward_hooks.values():
    552             hook_result = hook(self, input, result)

<ipython-input-21-d20eb6e0c349> in forward(self, x)
      5 
      6     def forward(self, x):
----> 7         out = self.linear(x)
      8         return out

~/PycharmProjects/estudios/venv/lib/python3.8/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    548             result = self._slow_forward(*input, **kwargs)
    549         else:
--> 550             result = self.forward(*input, **kwargs)
    551         for hook in self._forward_hooks.values():
    552             hook_result = hook(self, input, result)

~/PycharmProjects/estudios/venv/lib/python3.8/site-packages/torch/nn/modules/linear.py in forward(self, input)
     85 
     86     def forward(self, input):
---> 87         return F.linear(input, self.weight, self.bias)
     88 
     89     def extra_repr(self):

~/PycharmProjects/estudios/venv/lib/python3.8/site-packages/torch/nn/functional.py in linear(input, weight, bias)
   1610         ret = torch.addmm(bias, input, weight.t())
   1611     else:
-> 1612         output = input.matmul(weight.t())
   1613         if bias is not None:
   1614             output += bias

Im RuntimeError: size mismatch, m1: [681000 x 227], m2: [154587 x 1] at /pytorch/aten/src/TH/generic/THTensorMath.cpp:41

Ответы [ 2 ]

1 голос
/ 17 июня 2020

В linearRegression вы определили линейное преобразование как: nn.Linear(3*227*227, 1), что означает, что слой Linear ожидает 3*227*227 входных функций и будет выводить 1 функцию.

Однако , вы передаете 4D тензор формы [1000, 3, 227, 227] (batch-channel-height-width) на линейный слой, который рассматривает последнее измерение как измерение объекта. Это означает, что линейный слой получает 227 входных функций вместо 3*227*227. Итак, вы получаете следующую ошибку.

RuntimeError: size mismatch, m1: [681000 x 227], m2: [154587 x 1]

Обратите внимание, что линейные слои связаны с весовой матрицей формы in_features x out_features (в вашем случае это [154587 x 1]). И вход в линейный слой сглаживается до 2D-тензора, в вашем случае это [1000*3*227 x 227] = [681000 x 227].

Итак, попытка матричного умножения двух тензоров с формой [681000 x 227] и [154587 x 1] приводит к указанной выше ошибке.

1 голос
/ 17 июня 2020

Вам необходимо flatten входное 2D-изображение в 1D-сигнал:
Входные данные представляют собой 4-мерный тензор формы 1000-3-227-227 (пакетный канал-высота-ширина ). Однако nn.Linear ожидает в качестве входных 2D-тензоров форм пакетных каналов.

Ваш код c forward должен выглядеть примерно так:

def forward(self, x):
  flat_x = x.view(x.shape[0], -1)  # collapse all dimensions to the second one
  out = self.linear(flat_x)
  return out
...