找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1009

积分

0

好友

131

主题
发表于 昨天 21:57 | 查看: 2| 回复: 0

在构建卷积神经网络(CNN)时,理解并正确计算卷积层的输入输出形状(Shape)是至关重要的基础。这不仅关系到模型能否顺利运行,也直接影响着我们对网络架构的设计。本文将结合代码,详细探讨卷积层输出Shape的计算公式,并重点介绍实现多个卷积层连续输出的关键方法。

一、卷积层输出Shape计算公式验证

对输入图像进行卷积操作后,得到的特征图(Feature Map)尺寸会发生变化。其输出尺寸的计算公式如下:

  • 输出高度 = (输入高度 - 卷积核高度 + 2 × 填充) / 步幅 + 1
  • 输出宽度 = (输入宽度 - 卷积核宽度 + 2 × 填充) / 步幅 + 1

一个常见的误区:初学者容易将公式误写为 (输入高度 - 卷积核高度 + 2 × 填充) / (步幅 + 1),即错误地将“+1”也作为分母的一部分。正确的理解是先进行除法运算,最后再加1。只有使用正确的公式,手动计算的结果才能与程序运行结果一致。

二、实现连续卷积层输出的核心代码与实践

PyTorch中实现多层卷积连接,关键在于确保前一层的输出通道数out_channels与后一层的输入通道数in_channels完全相等。下面通过一个具体的代码示例来演示。

import torch
from torch import nn

# 定义第一个卷积层
conv_layer1 = nn.Conv2d(
    in_channels=3,   # 输入通道数,对应RGB三通道图片
    out_channels=64, # 输出通道数,即本层产生的特征图数量
    kernel_size=3,   # 卷积核大小 3x3
    stride=1,        # 步幅
    padding=1,       # 填充,此处为1表示在四周各填充1圈0
)

# 定义第二个卷积层
conv_layer2 = nn.Conv2d(
    in_channels=64,  # 输入通道数,必须等于conv_layer1的out_channels
    out_channels=128,
    kernel_size=3,
    stride=2,        # 步幅为2,特征图尺寸会减半
    padding=0,       # 无填充
)

if __name__ == '__main__':
    # 模拟一个批次大小为1的RGB图像输入,尺寸为24x24
    # 输入Tensor的Shape为: (batch_size, channels, height, width)
    input_tensor = torch.randn(size=(1, 3, 24, 24))

    # 第一层卷积 forward
    output_1 = conv_layer1(input_tensor)
    print(f‘第一层卷积输出Shape: {output_1.shape}‘) # 预期输出: torch.Size([1, 64, 24, 24])

    # 第二层卷积 forward,将第一层的输出作为本层输入
    output_2 = conv_layer2(output_1)
    print(f‘第二层卷积输出Shape: {output_2.shape}‘) # 预期输出: torch.Size([1, 128, 11, 11])

代码解析与结果说明

  1. 第一层卷积:输入为(1, 3, 24, 24)。根据公式计算,padding=1抵消了kernel_size=3带来的尺寸减少,stride=1,因此输出的高度和宽度保持不变,仍为24。通道数变为out_channels=64。所以output_1.shape[1, 64, 24, 24]
  2. 第二层卷积:输入为第一层的输出[1, 64, 24, 24]。其in_channels=64与第一层out_channels完美对齐,这是连接成功的前提。计算输出尺寸:高度 = (24 - 3 + 2*0) / 2 + 1 = 11,宽度同理。通道数变为128。因此output_2.shape[1, 128, 11, 11]

运行上述代码,结果与手动计算一致,验证了公式的正确性和层间连接的有效性。

三、关键要点与总结

实现卷积神经网络的连续前向传播,核心在于通道维度的对齐。在设计网络架构时,必须像搭积木一样,确保每一层输出的“形状”都能严丝合缝地作为下一层的输入。其中,in_channelsout_channels的匹配是最常见也最需要仔细检查的环节。掌握输出Shape的计算公式,能帮助我们在调试网络、设计自定义模块时快速定位维度不匹配的问题,是深度学习实践中的一项基本功。虽然原理清晰后操作变得简单,但这一步的严谨性是构建复杂有效模型的基石。




上一篇:C++类型推导:auto与decltype(auto)核心差异与应用场景解析
下一篇:Android SELinux强制访问控制详解:架构演进、核心实现与调试指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 16:03 , Processed in 0.117263 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表