【问题标题】:Understanding convolutional layers shapes了解卷积层形状
【发布时间】:2021-04-09 17:39:31
【问题描述】:

我一直在阅读有关卷积网络的文章,并且自己编写了一些模型。当我看到其他模型的可视化图表时,它显示每一层都比上一层更小更深。层具有三个维度,例如256x256x32。这第三个数字是多少?我假设前两个数字是节点数,但我不知道深度是多少。

【问题讨论】:

    标签: machine-learning deep-learning pytorch conv-neural-network


    【解决方案1】:

    对不起,简短的回答,但是当你有一个数字图像时,你有 2 个维度,然后你通常有 3 个颜色。卷积过滤器查看具有较低高度/宽度尺寸和更多深度通道(在您的情况下为 32)的图片部分以获取更多信息。然后将其输入神经网络进行学习。

    【讨论】:

      【解决方案2】:

      TLDR; 256x256x32 指的是层的输出形状,而不是层本身。


      有很多文章和帖子解释了卷积层的工作原理。我会尽量回答你的问题,但不会涉及太多细节,只关注形状

      假设您使用的是 2D 卷积层,您的输入和输出都将是 3 维的。也就是说,不考虑对应于第 4 轴的批次......因此,卷积层输入的形状将是 (c, h, w)(或 (h, w, c),取决于框架),其中 c 是通道数, h 是输入的宽度,w 是宽度。您可以将其视为 c-channel hxw 图像。 这种输入最直观的例子是卷积神经网络的第一个卷积层的输入:很可能是大小为hxw 的图像,带有c 通道,例如c=1 用于灰度或c=3对于 RGB...

      重要的是,对于该输入的所有像素,每个通道上的值都会提供有关该像素的附加信息。拥有三个通道将为每个像素(“像素”在 2D 输入空间中的位置)提供比拥有单个通道更丰富的内容。由于每个像素将使用三个值(三个通道)vs. 编码一个(一个通道)。这种关于通道代表什么的直觉可以外推到更多的通道。正如我们所说,输入可以有c 频道。

      现在回到卷积层,这里是good visualization。想象一下有一个 5x5 1 通道输入。以及由单个 3x3 过滤器组成的卷积层(即kernel_size=3

      input filter convolution output
      shape (1, 5, 5) (3, 3) (3,3)
      representation

      现在请记住,输出的维度将取决于卷积层的stridepadding。这里输出的形状和过滤器的形状一样,不一定非得如此!取一个(1, 5, 5)的输入形状,使用相同的卷积设置,你最终会得到一个(4, 4)的形状(这与过滤器形状(3, 3)不同。

      另外,需要注意的是,如果输入有多个通道:形状(c, h, w),则过滤器必须具有相同数量的通道。输入的每个通道将与滤波器的每个通道进行卷积,结果将被平均为单个 2D 特征图。因此,您将获得(c, 3, 3)中间输出,在对通道进行平均后,我们将得到(1, 3, 3)=(3, 3)。因此,考虑使用单个滤波器进行卷积,无论有多少输入通道,输出都将始终只有一个通道。

      从那里你可以做的是在同一层上组装多个过滤器。这意味着您将图层定义为具有k 3x3 过滤器。所以一层由k过滤器组成。对于输出的计算,想法很简单:一个过滤器给出(3, 3) 特征图,所以k 过滤器将给出k (3, 3) 特征图。然后将这些映射堆叠到通道维度中。最终,您的输出形状为...(k, 3, 3)

      k_hk_w 分别是内核高度和内核宽度。和h',w'输出的一个特征图的高度和宽度:

      input layer output
      shape (c, h, w) (k, c, k_h, k_w) (k, h', w')
      description c-channel hxw feature map k filters of shape (c, k_h, k_w) k-channel h'xw' feature map

      回到你的问题:

      图层有 3 个尺寸,例如 256x256x32。这第三个数字是多少?我假设前两个数字是节点数,但我不知道深度是多少。

      卷积层有四个维度,但其中之一是由您的输入通道数强加的。您可以选择卷积核的大小和过滤器的数量。这个数字将决定 输出的通道数。

      256x256 看起来非常高,您很可能对应于特征图的输出形状。另一方面,32 将是输出的通道数,正如我试图解释的那样,它是该层中过滤器的数量。通常来说,卷积网络在视觉图中表示的维度对应于中间输出形状,而不是层形状。

      VGG神经网络为例:

      用于大规模图像识别的深度卷积网络

      VGG 的输入形状是(3, 224, 224),知道第一个卷积的结果是形状(64, 224, 224),您可以确定该层中总共有 64 个过滤器。

      事实证明,VGG 中的内核大小是 3x3。所以,这里有一个问题要问你:知道每个滤波器只有一个偏置参数,VGG 的第一个卷积层总共有多少参数?

      【讨论】:

      • “256x256 似乎非常高”,在我看来就像输入图像大小:) 没那么高。
      • OP 似乎建议它对应于过滤器大小“图层有 3 个维度,例如 256x256x32”。所以我实际上指的是 256x256 的内核大小非常高。但当然,它对应的是特征图,而不是内核。
      【解决方案3】:

      我在 PyTorch 中创建了示例来演示您的输出:

      import torch
      import torch.nn as nn
      
      bs=16
      x = torch.randn(bs, 3, 256, 256)
      c = nn.Conv2d(3,32,kernel_size=5,stride=1,padding=2)
      out = c(x)
      print(out.shape, out.shape[1])
      

      输出:

      torch.Size([16, 32, 256, 256]) 32
      

      这是一个真正的内部张量。它可能会有所帮助。

      你可以play有很多卷积参数。

      【讨论】:

        猜你喜欢
        • 2018-02-10
        • 2017-10-06
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        相关资源
        最近更新 更多