【问题标题】:How to infer the shape of the output when connecting convolution layer with dense layers?将卷积层与密集层连接时如何推断输出的形状?
【发布时间】:2021-08-25 17:52:04
【问题描述】:

我正在尝试使用pytorch 构建卷积神经网络,但无法理解如何解释第一个密集连接层的输入神经元。比如说,我有以下架构:

self.conv_layer = nn.Sequential(
   nn.Conv2d(3, 32, 5),
   nn.Conv2d(32, 64, 5),
   nn.MaxPool2d(2, 2),
   nn.Conv2d(64, 128, 5),
   nn.Conv2d(128, 128, 5),
   nn.MaxPool2d(2, 2))

self.fc_layer = nn.Sequential(
   nn.Linear(X, 512),
   nn.Linear(512, 128),
   nn.Linear(128, 10))

这里X 将是第一个线性层中的神经元数量。那么,我是否需要跟踪每一层的输出张量的形状,以便找出X

现在,我可以将值放在公式(W - F + 2P) / S + 1 中,然后计算每一层之后的形状,这样会比较方便。

难道没有更方便的东西可以自动完成吗?

【问题讨论】:

    标签: python pytorch conv-neural-network


    【解决方案1】:

    一个简单的解决方案是使用LazyLinear 层:https://pytorch.org/docs/stable/generated/torch.nn.LazyLinear.html

    根据文档:

    一个torch.nn.Linear 模块,其中in_features 被推断出来......它们将在第一次调用forward 完成后被初始化,并且该模块将成为一个常规的torch.nn.Linear 模块。 Linear 的 in_features 参数是从 input.shape[-1] 推断出来的。

    【讨论】:

    • 谢谢,这是一个非常方便的解决方案,不需要额外的努力,这正是我想要的。
    【解决方案2】:

    如果您不想遍历层并迭代计算输出形状,您可以通过离线定义模型的 CNN 部分进行推断:

    cnn = nn.Sequential(
        nn.Conv2d(3, 32, 5),
        nn.Conv2d(32, 64, 5),
        nn.MaxPool2d(2, 2),
    
        nn.Conv2d(64, 128, 5),
        nn.Conv2d(128, 128, 5),
        nn.MaxPool2d(2, 2))
    

    例如,如果您有一个形状为 (1, 3, 100, 100) 的输入:

    >>> cnn(torch.empty(1, 3, 100, 100)).shape
    torch.Size([1, 128, 19, 19])
    

    所以第一个全连接密集层的特征数应该是:

    >>> cnn(torch.empty(1, 3, 100, 100)).numel()
    46208
    

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 2018-11-21
      • 1970-01-01
      • 2020-08-17
      • 2016-08-26
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多