You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在CNN模型中检查图像尺寸?以及如何在指定PyTorch网络代码中检查图像形状?

如何在PyTorch CNN中检查图像尺寸与卷积层权重形状

我来帮你解决这两个问题——首先是如何追踪CNN中图像的尺寸变化,然后是你代码里访问卷积权重形状出错的原因和修正方法。

一、检查CNN各层的图像尺寸

有三种常用方法可以查看图像经过每一层后的尺寸:

  • 方法1:在forward函数中直接打印尺寸
    最简单直接的方式就是在模型的forward方法里,每经过一层就打印当前张量的shape。比如修改你的forward函数:

    def forward(self,x):
        print(f"输入图像尺寸: {x.shape}")
        x = self.ConvLayer1(x)
        print(f"经过ConvLayer1后的尺寸: {x.shape}")
        # 后续每一层都可以添加类似的打印语句
        ...
        output = self.func(x)
        return output
    

    当你传入一个测试输入(比如torch.randn(1,1,28,28),代表批量大小1、单通道、28x28的图像),就能清晰看到每一步的尺寸变化。

  • 方法2:使用torchsummary库快速查看全网络信息
    如果你想一次性获取整个网络所有层的输入输出尺寸、参数数量,可以用torchsummary库。先安装它:

    pip install torchsummary
    

    然后在代码中调用:

    from torchsummary import summary
    
    model = MyNetwork()
    # 传入input_size:(通道数, 高度, 宽度),这里假设你的输入是单通道28x28图像
    summary(model, input_size=(1, 28, 28))
    

    它会输出一个清晰的表格,包含每一层的类型、输出形状和参数总数,非常直观。

  • 方法3:手动计算尺寸
    卷积层的输出尺寸可以用公式精准计算:

    输出高度/宽度 = (输入高度/宽度 - 核大小 + 2Padding) / Stride + 1
    比如你的ConvLayer1里第一个卷积层,输入高宽为HxW,核大小3x3,stride=1,padding=1,代入公式得:(H-3+2
    1)/1 +1 = H,所以尺寸不变;第二个卷积层同理,经过ConvLayer1后图像的高宽和输入一致,通道数变为12。

二、修正访问卷积层权重形状的错误

你用self.ConvLayer1.weight.shape出错的原因很明确:self.ConvLayer1nn.Sequential容器,它本身并没有weight属性——这个属性只属于容器内部的具体卷积层。

要正确获取权重形状,你需要通过索引访问Sequential里的对应层:

  • 第一个卷积层的权重形状:self.ConvLayer1[0].weight.shape
  • 第二个卷积层的权重形状:self.ConvLayer1[1].weight.shape

你可以在__init__里添加打印语句验证:

class MyNetwork(nn.Module):
    def __init__(self):
        super(MyNetwork,self).__init__()
        self.ConvLayer1 = nn.Sequential(
            nn.Conv2d(1, 6, kernel_size=(3,3), stride=1,padding=1),
            nn.Conv2d(6, 12, kernel_size=(3,3), stride=1,padding=1),
            nn.ReLU()
        )
        # 打印权重形状
        print(f"第一个卷积层权重形状: {self.ConvLayer1[0].weight.shape}")  # 输出 torch.Size([6, 1, 3, 3])
        print(f"第二个卷积层权重形状: {self.ConvLayer1[1].weight.shape}")  # 输出 torch.Size([12, 6, 3, 3])
        ......
    def forward(self,x):
        x = self.ConvLayer1(x)
        .....
        output = self.func(x)
        return output

这里的权重形状含义是[输出通道数, 输入通道数, 核高度, 核宽度],和你定义Conv2d时的参数完全对应,符合预期。

内容的提问来源于stack exchange,提问作者Princy Saini

火山引擎 最新活动