RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 2 but got size 3 for tensor number 1 in the list.

常见的模型报错,比方说pix2pix模型

In[18], line 84, in Generator.forward(self, x)

82 bottleneck = self.bottleneck(d7)

83 up1 = self.up1(bottleneck)

—> 84 up2 = self.up2(torch.cat([up1, d7], 1))

85 up3 = self.up3(torch.cat([up2, d6], 1))

86 up4 = self.up4(torch.cat([up3, d5], 1))

RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 2 but got size 3 for tensor number 1 in the list.

解决方案:

模型里面加一个函数

from torch import nnimport torch.nn.functional as Fclass Generator(nn.Module):def __init__(self,*args):self.padder_size = 256'''模型该长啥样长啥样'''def forward(self,inp):B,C,H,W = inp.shapeinp = self.check_image_size(inp)'''该怎么forward怎么forward'''return x[:,:,:H,:W]def check_image_size(self, x):_, _, h, w = x.size()mod_pad_h = (self.padder_size - h % self.padder_size) % self.padder_sizemod_pad_w = (self.padder_size - w % self.padder_size) % self.padder_sizex = F.pad(x, (0, mod_pad_w, 0, mod_pad_h))return x

padder_size根据最接近你数据集的来,这个函数是从GitHub – megvii-research/NAFNet: The state-of-the-art image restoration model without nonlinear activation functions.这个模型的代码里找的,本来是做pix2pix但是输入为300*300的时候就报错,256*256就不报错,后面发现是中间反卷积的时候输出形状和下采样的形状不一样,cat就不好使了,上了这个函数就好使了,但是会慢不少。