理解卷积网络层

时间:2021-01-03 19:29:31

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

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

3 个答案:

答案 0 :(得分:4)

TL;DR:256x256x32 指的是层的输出形状而不是层本身。


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

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

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

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

组成的卷积层
<头>
输入 过滤器 卷积 输出
形状 c kernel_size=3 (1, 5, 5)
表示

现在请记住,输出的维度将取决于卷积层的 stridepadding。这里输出的形状与过滤器的形状相同,不一定必须是!采用 (3, 3) 的输入形状,使用相同的卷积设置,您最终会得到 (3,3) 的形状(与滤波器形状 (1, 5, 5) 不同。

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

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

(3, 3)(k, 3, 3) 分别为内核高度和内核宽度。和 k_h, k_w 一个输出特征图的高度和宽度:

<头>
输入 layer 输出
形状 h' w' (c, h, w)
描述 (k, c, k_h, k_w)-channel (k, h', w')xc 特征图 h 形状过滤器 w k-channel (c, k_h, k_w)xk 特征图

回到你的问题:

<块引用>

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

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

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

enter image description here

VGG 的输入形状是 h',知道第一个卷积的结果具有形状 w',您可以确定该层共有 64 个过滤器。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我在 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很多卷积参数。

相关问题