RuntimeError: Ожидается 4-мерный ввод для 4-мерного веса 32 3 3, но вместо этого получен 3-мерный ввод размера [3, 224, 224]?

Я пытаюсь использовать предварительно обученную модель. Вот где возникает проблема

Разве модель не должна принимать простое цветное изображение? Почему ожидается четырехмерный ввод?

RuntimeError                              Traceback (most recent call last)
<ipython-input-51-d7abe3ef1355> in <module>()
     33 
     34 # Forward pass the data through the model
---> 35 output = model(data)
     36 init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability
     37 

5 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py in forward(self, input)
    336                             _pair(0), self.dilation, self.groups)
    337         return F.conv2d(input, self.weight, self.bias, self.stride,
--> 338                         self.padding, self.dilation, self.groups)
    339 
    340 

RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of size [3, 224, 224] instead

Где

inception = models.inception_v3()
model = inception.to(device)

person JobHunter69    schedule 28.07.2019    source источник
comment
Модель факела обычно ожидает в качестве входных данных пакет изображений. Если вы хотите передать одно изображение, убедитесь, что это все еще пакет одного изображения. Кроме того, Inception-v3 ожидает, что размеры изображения будут 3X229X229, в отличие от других моделей фонарей, которые ожидают 3X224X224.   -  person asymptote    schedule 28.07.2019


Ответы (2)


Как Усман Али написал в своем комментарии, что pytorch (и большинство других наборов инструментов DL) ожидает в качестве входных данных пакет изображений. Таким образом вам нужно позвонить

output = model(data[None, ...])  

Вставка одноэлементного «пакетного» измерения во входные data.

Также обратите внимание, что используемая вами модель может рассчитывать на другой размер ввода (3x229x229), а не 3x224x224.

person Shai    schedule 28.07.2019
comment
Мне также пришлось добавить data[None, ...].float(), чтобы он заработал - person chavezbosquez; 19.04.2020
comment
@chavezbosquez, вы должны посмотреть на .to(...), чтобы переместить / преобразовать ваш входной тензор в правильный тип данных / устройство, как ожидается от вашей модели. - person Shai; 19.04.2020

Из документации Pytorch по сверточным слоям Conv2d слои ожидают ввода с формой

(n_samples, channels, height, width) # e.g., (1000, 1, 224, 224)

Передача изображений в градациях серого в их обычном формате (224, 224) не сработает.

Чтобы получить правильную форму, вам нужно будет добавить размер канала. Сделать это можно следующим образом:

x = np.expand_dims(x, 1)      # if numpy array
tensor = tensor.unsqueeze(1)  # if torch tensor

Метод unsqueeze() добавляет измерения по указанному индексу. Результат будет иметь форму:

(1000, 1, 224, 224)
person Nicolas Gervais    schedule 02.01.2020