“RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional i

Posted

技术标签:

【中文标题】“RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of size [3, 224, 224]”?【英文标题】:"RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of size [3, 224, 224] instead"? 【发布时间】:2019-12-05 19:44:11 【问题描述】:

我正在尝试使用预训练模型。这就是问题发生的地方

模型不应该采用简单的彩色图像吗?为什么它需要 4 维输入?

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)

【问题讨论】:

火炬模型通常需要一批图像作为输入。如果要传递单个图像,请确保它仍然是一批单个图像。此外,Inception-v3 预计图像尺寸为 3X229X229,而其他 Torch 模型预计为 3X224X224。 【参考方案1】:

由于模型需要一批图像,我们需要传递一个 4 维张量,可以这样做:

方法一:output = model(data[0:1]) 方法二:output = model(data[0].unsqueeze(0))

这只会发送整批的第一张图片。

对于第 i 个图像,我们可以这样做:

方法一:output = model(data[i:i+1]) 方法二:output = model(data[i].unsqueeze(0))

【讨论】:

【参考方案2】:

来自卷积层上的 Pytorch documentation,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)

【讨论】:

对于灰度图像,你是对的。但是,对于需要被视为一批 1 图像的 RGB 图像,那将是 .unsqueeze(0) 你能在这里解释一下n_samples吗? 是训练数据的数量,比如图片的数量【参考方案3】:

正如Usman Ali 在他的评论中所写,pytorch(和大多数其他 DL 工具箱)需要 batch 图像作为输入。因此你需要调用

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

在您的输入data 中插入一个单一的“批量”维度。

另请注意,您使用的模型可能需要不同的输入大小 (3x229x229),而不是 3x224x224。

【讨论】:

我还必须添加 data[None, ...].float() 才能使其工作 @chavezbosquez 您应该查看.to(...) 以将您的输入张量移动/转换为模型所期望的正确数据类型/设备。 转换 .to(device) 是需要的,因为输入图像是使用另一种方法加载的(很可能是使用来自 WebDataSet 的 PIL)。 device的值可以设置如下:device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

以上是关于“RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional i的主要内容,如果未能解决你的问题,请参考以下文章