Deep learning 实现问题:用于模式识别的Deep ConvNet

Deep learning 实现问题:用于模式识别的Deep ConvNet,deep-learning,pytorch,conv-neural-network,pattern-recognition,Deep Learning,Pytorch,Conv Neural Network,Pattern Recognition,我正在尝试使用一个完全卷积的网络来实现一个模式识别模型(图1中,我能够在没有登录或任何东西的情况下获得全文,但如果这是一个问题,我也可以附加一张图片!),但是当从最后一个Conv2D层移动到第一个fc_层时,我遇到了一个大小错误 以下是我的错误消息: RuntimeError: size mismatch, m1: [4 x 1024], m2: [4 x 1024] at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:283 最初,如

我正在尝试使用一个完全卷积的网络来实现一个模式识别模型(图1中,我能够在没有登录或任何东西的情况下获得全文,但如果这是一个问题,我也可以附加一张图片!),但是当从最后一个Conv2D层移动到第一个fc_层时,我遇到了一个大小错误

以下是我的错误消息:

RuntimeError: size mismatch, m1: [4 x 1024], m2: [4 x 1024] at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:283

最初,如图所示,我的第一个线性层是:

nn.Linear(4*4*512, 1024)

但在得到大小不匹配后,我将其更改为:

nn.Linear(4,1024)

现在,我有一个奇怪的错误消息,如上所述

以下是我的代码供参考(如果有帮助):


import torch.nn as nn
import torch.utils.model_zoo as model_zoo

class convnet(nn.Module):

    def __init__(self, num_classes=1000):
        super(convnet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(64, 64, kernel_size=3, padding=1),
            nn.MaxPool2d(kernel_size=1),
            nn.Conv2d(64, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128, 128, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2),# stride=2),
            nn.Conv2d(128, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2), #stride=2),
            nn.Conv2d(256, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), #nn.Dropout(p=0.5)
        )

        self.classifier = nn.Sequential(
            nn.Linear(4, 1024),
            nn.Dropout(p=0.5),
            nn.ReLU(inplace=True),
            #nn.Dropout(p=0.5),
            nn.Linear(1024, 1024),
            nn.ReLU(inplace=True),
            nn.Linear(1024, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x,1)
        x = self.classifier(x)
        return x
我怀疑这是一个填充和步幅的问题。
谢谢

错误来自矩阵乘法,其中
m1
应该是一个mxn矩阵,
m2
应该是一个nxp矩阵,结果将是一个mxp矩阵。在您的例子中,它是4x1024和4x1024,但这不起作用,因为
1024!=4

这意味着您对第一个线性层的输入大小为[4,1024](4为批量大小),因此第一个线性层的输入特征应为1024

self.classifier=nn.Sequential(
nn.线性(10241024),
nn.辍学率(p=0.5),
nn.ReLU(就地=真),
#nn.辍学率(p=0.5),
nn.线性(10241024),
nn.ReLU(就地=真),
nn.线性(1024,num_类),
)
如果不确定输入的要素数量,可以在图层之前打印出其大小:

x=self.features(x)
x=焊炬。展平(x,1)
打印(x.size())35;=>torch.size([41024])
x=自分类器(x)

非常感谢您!我现在意识到了我的错误(:只是一个小问题(与原始问题无关),在论文中,网络还包括pad1x2等等,你知道这在完全连接层的上下文中意味着什么吗?它们是带
padding=(1,2)的卷积
,不知道他们为什么称它们为FC,可能是因为它们是分类标题的一部分,但至少它们的描述与其他卷积一致。他们在第3.2.2节中提到了这一点。