如何在CNN模型中检查图像尺寸?以及如何在指定PyTorch网络代码中检查图像形状?
我来帮你解决这两个问题——首先是如何追踪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+21)/1 +1 = H,所以尺寸不变;第二个卷积层同理,经过ConvLayer1后图像的高宽和输入一致,通道数变为12。
二、修正访问卷积层权重形状的错误
你用self.ConvLayer1.weight.shape出错的原因很明确:self.ConvLayer1是nn.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




