Pytorch错误:mat1尺寸1必须与CNN中的mat2尺寸0匹配

2024-06-06 21:01:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我从(https://gist.github.com/johnolafenwa/96b3322aabb61d4d36fd870a77f02aa3)获取的NN有几个问题 首先,我在输出大小和输入批量大小方面遇到了问题,如这里所述(How do I modify this PyTorch convolutional neural network to accept a 64 x 64 image and properly output predictions?

我想现在输入的批次大小与目标批次大小匹配,但出现了一个新问题,我不知道为什么会发生此错误。任何帮助都会有帮助

def get_dls(bs, size):
    dblock = DataBlock(blocks=(ImageBlock, CategoryBlock),
                   get_items=get_image_files,
                   get_y=parent_label,
                   splitter = GrandparentSplitter(train_name='train', valid_name='test'),
                   item_tfms=Resize(460),
                   batch_tfms=[*aug_transforms(size=size, min_scale=0.75, do_flip=False, mult=2, pad_mode='zeros'),
                               Normalize.from_stats(*own_stats)])
    return dblock.dataloaders(path, bs=bs)

dls = get_dls(32, 64)

class Unit(nn.Module):
    def __init__(self,in_channels,out_channels):
        super(Unit,self).__init__()
        

        self.conv = nn.Conv2d(in_channels=in_channels,kernel_size=3,out_channels=out_channels,stride=1,padding=1)
        self.bn = nn.BatchNorm2d(num_features=out_channels)
        self.relu = nn.ReLU()

    def forward(self,input):
        output = self.conv(input)
        output = self.bn(output)
        output = self.relu(output)

        return output

class SimpleNet(nn.Module):
    def __init__(self,num_classes=7):
        super(SimpleNet,self).__init__()
        
        #Create 14 layers of the unit with max pooling in between
        self.unit1 = Unit(in_channels=3,out_channels=32)
        self.unit2 = Unit(in_channels=32, out_channels=32)
        self.unit3 = Unit(in_channels=32, out_channels=32)

        self.pool1 = nn.MaxPool2d(kernel_size=2)

        self.unit4 = Unit(in_channels=32, out_channels=64)
        self.unit5 = Unit(in_channels=64, out_channels=64)
        self.unit6 = Unit(in_channels=64, out_channels=64)
        self.unit7 = Unit(in_channels=64, out_channels=64)

        self.pool2 = nn.MaxPool2d(kernel_size=2)

        self.unit8 = Unit(in_channels=64, out_channels=128)
        self.unit9 = Unit(in_channels=128, out_channels=128)
        self.unit10 = Unit(in_channels=128, out_channels=128)
        self.unit11 = Unit(in_channels=128, out_channels=128)

        self.pool3 = nn.MaxPool2d(kernel_size=2)

        self.unit12 = Unit(in_channels=128, out_channels=128)
        self.unit13 = Unit(in_channels=128, out_channels=128)
        self.unit14 = Unit(in_channels=128, out_channels=128)

        self.avgpool = nn.AvgPool2d(kernel_size=4)
        
        #Add all the units into the Sequential layer in exact order
        self.net = nn.Sequential(self.unit1, self.unit2, self.unit3, self.pool1, self.unit4, self.unit5, self.unit6
                                 ,self.unit7, self.pool2, self.unit8, self.unit9, self.unit10, self.unit11, self.pool3,
                                 self.unit12, self.unit13, self.unit14, self.avgpool)

        self.fc = nn.Linear(in_features=128,out_features=num_classes)

    def forward(self, input):
        output = self.net(input)
        print(output.shape)
        output = output.view(-1,128*2*2)
        print(output.shape)
        #output = output.view(output.size(0), -1)
        print(output.shape)
        output = self.fc(output)
        return output

model = SimpleNet(num_classes=7)
learn = Learner(dls, model, loss_func=CrossEntropyLossFlat(), 
                metrics=accuracy)

learn.fit_one_cycle(1, 3e-3)

这是错误消息:

RuntimeError                              Traceback (most recent call last)
<ipython-input-50-db5d2a1287cb> in <module>()
----> 1 learn.fit_one_cycle(1, 3e-3)

18 frames
/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias)
   1688     if input.dim() == 2 and bias is not None:
   1689         # fused op is marginally faster
-> 1690         ret = torch.addmm(bias, input, weight.t())
   1691     else:
   1692         output = input.matmul(weight.t())

RuntimeError: mat1 dim 1 must match mat2 dim 0

任何形式的帮助、提示或参考都会有所帮助。 提前谢谢


Tags: inselfinputoutputsizegetinitdef