卷积神经网络的维度变化

卷积层各尺寸

  • 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数

  • 输出矩阵格式:三个维度,依次为:样本数、图像高度、图像宽度、图像通道数

  • 权重矩阵(卷积核)格式:四个维度,依次为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)

注:输入矩阵、权重矩阵、输出矩阵这三者之间的相互决定关系

  • 卷积核的输入通道数(in depth)由输入矩阵的通道数所决定。

  • 输出矩阵的通道数(out depth)由卷积核的输出通道数所决定。

  • 输出矩阵的高度和宽度(height, width)这两个维度的尺寸由输入矩阵、卷积核、扫描方式所共同决定。计算公式如下。(蓝色标注)

在这里插入图片描述

举例

标准卷积计算举例

以 AlexNet 模型的第一个卷积层为例

  • 输入图片的尺寸统一为 227 x 227 x 3 (高度 x 宽度 x 颜色通道数),

  • 本层一共具有96个卷积核,

  • 每个卷积核的尺寸都是 11 x 11 x 3。

  • 已知 stride = 4, padding = 0,

  • 假设 batch_size = 256,

  • 则输出矩阵的高度/宽度为 (227 - 11) / 4 + 1 = 55 在这里插入图片描述

理解:有96个过滤器,每个过滤器有3个卷积核。

1 x 1 卷积计算

后期 GoogLeNet、ResNet 等经典模型中普遍使用一个像素大小的卷积核作为降低参数复杂度的手段。 从下面的运算可以看到,其实 1 x 1 卷积没有什么神秘的,其作用就是将输入矩阵的通道数量缩减后输出(512 降为 32),并保持它在宽度和高度维度上的尺寸(227 x 227)。

原理:卷积核的个数决定了输出的特征图的个数,也就是特征图的通道数,或者说是卷积后的输出的通道数,因此可以使用远小于原来的输入特征图通道数个1×1卷积核来压缩通道数。 在这里插入图片描述

理解:有32个过滤器,每个过滤器有512个卷积核。

全连接层计算举例

实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。 在这里插入图片描述

理解:有4096个过滤器,每个过滤器有512个卷积核。

理解输出通道数

首先提出一个过滤器的概念:

  • 卷积核就是由长和宽来指定的,是一个二维的概念。

  • 而过滤器是是由长、宽和深度指定的,是一个三维的概念。

  • 过滤器可以看做是卷积核的集合。

  • 过滤器比卷积核高一个维度——深度。

通过概念可以明白,输出通道数即过滤器的个数,输入图像的通道数就代表一个过滤器包含几个卷积核

举个例子便于理解:

### Python 中卷积神经网络维度计算与处理 在构建卷积神经网络CNN)时,理解输入和各层之间的尺寸变化至关重要。对于给定的输入图像大小,在经过不同类型的层之后,输出特征图的尺寸会发生相应的变化。 #### 输入层到卷积层的维度变换 假设有一个形状为 \( (N, C_{in}, H_{in}, W_{in}) \) 的四维张量作为输入,其中: - N 表示批次大小; - \(C_{in}\) 是通道数(灰度图为1,RGB彩色图片则为3); - \(H_{in}\),\(W_{in}\) 分别代表高度和宽度。 当这个输入通过一个具有特定参数设置的二维卷积操作后,其输出尺寸可以通过下面公式来估算: \[ H_{out} = \left\lfloor{\frac{H_{in} + 2p - k}{s}}\right\rfloor + 1,\quad W_{out}=\left\lfloor {\frac {W_{in}+2p-k}{s}}\right\rfloor +1 \] 这里, - p 为填充(padding),默认值通常是0; - k 为核(kernel size),即滤波器窗口的高度/宽度; - s 则表示步幅(stride)[^1]。 ```python import torch.nn as nn conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=(5, 5)) input_tensor = torch.randn((8, 3, 224, 224)) # batch_size=8, channels=3, height=width=224 output_tensor = conv_layer(input_tensor) print(f'Output shape after Conv layer: {output_tensor.shape}') ``` #### 卷积层至池化层后的维度调整 接着上述过程得到的新特征映射会进一步传递给最大池化(Max Pooling)或其他形式的下采样层。同样地,可以依据类似的逻辑推导出最终输出的空间分辨率: \[ H^{'}_{out}= \left\lfloor{\frac{{H}_{out}-k_p }{s_p }}\right\rfloor +1 ,\qquad W^{'} _{out}=\left\lfloor {\frac {{W}_{out}-{k}_p }{{s}_p }}\right\rfloor +1 \] 此处, - \(k_p\) 和 \(s_p\) 分别指定了池化的内核大小与移动距离[^2]。 ```python pool_layer = nn.MaxPool2d(kernel_size=(2, 2), stride=2) after_pool_output = pool_layer(output_tensor) print(f'Shape after MaxPooling layer: {after_pool_output.shape}') ``` #### 多层结构中的维度演变规律 随着更多卷积层、激活函数以及可能存在的批标准化(batch normalization)等组件加入进来,每一阶段都会按照前述原则影响着整体的数据流形态。值得注意的是,在某些特殊情况下——比如采用全局平均池化(global average pooling)—可能会改变原有的模式;而在其他时候,则需特别留意防止因过度缩小而导致的信息丢失问题[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值