【发布时间】:2021-04-09 17:39:31
【问题描述】:
我一直在阅读有关卷积网络的文章,并且自己编写了一些模型。当我看到其他模型的可视化图表时,它显示每一层都比上一层更小更深。层具有三个维度,例如256x256x32。这第三个数字是多少?我假设前两个数字是节点数,但我不知道深度是多少。
【问题讨论】:
标签: machine-learning deep-learning pytorch conv-neural-network
我一直在阅读有关卷积网络的文章,并且自己编写了一些模型。当我看到其他模型的可视化图表时,它显示每一层都比上一层更小更深。层具有三个维度,例如256x256x32。这第三个数字是多少?我假设前两个数字是节点数,但我不知道深度是多少。
【问题讨论】:
标签: machine-learning deep-learning pytorch conv-neural-network
对不起,简短的回答,但是当你有一个数字图像时,你有 2 个维度,然后你通常有 3 个颜色。卷积过滤器查看具有较低高度/宽度尺寸和更多深度通道(在您的情况下为 32)的图片部分以获取更多信息。然后将其输入神经网络进行学习。
【讨论】:
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)
现在请记住,输出的维度将取决于卷积层的stride 和padding。这里输出的形状和过滤器的形状一样,不一定非得如此!取一个(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_h 和k_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 的第一个卷积层总共有多少参数?
【讨论】:
我在 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有很多卷积参数。
【讨论】: