微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Pytorch 错误:mat1 dim 1 必须与 CNN 中的 mat2 dim 0 匹配

我从 (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?)

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。