最近在做剪枝相关的事情,在遍历模型模块的时候,使用的是如下方式:
for k, m in enumerate(model.modules()):
print("k:", k)
print("m:", m)
但是对于模型的模块输出发现有缺失,如下:
k: 6
m: Block(
(conv1): Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
(bn1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(nolinear1): ReLU(inplace=True)
(conv2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=16, bias=False)
(bn2): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(nolinear2): ReLU(inplace=True)
(conv3): Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
(bn3): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(shortcut): Sequential()
(se): SeModule(
(avg_pool): AdaptiveAvgPool2d(output_size=1)
(se): Sequential(
(0): Conv2d(16, 4, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(4, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU(inplace=True)
(3): Conv2d(4, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
(4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): hsigmoid()
)
)
)
k: 7
m: Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
k: 8
m: BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
k: 9
m: ReLU(inplace=True)
k: 10
m: Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=16, bias=False)
k: 11
m: BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
k: 12
m: Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)
k: 13
m: BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
k: 14
m: Sequential()
k: 15
Block结构内的第二个激活函数没有遍历输出,而是跳过了,很奇怪,还没找到原因,先记录一下。
3526





