我想在前向传递后在预训练的 ResNet 上获得每一层的激活。对于大多数层,我可以只使用模块的输出参数来查询激活,但是对于 CAddTable,输出参数只包含 0 或 1 个值,对应于正向传递期间真实输出的符号。CAddTable 后面的 ReLU 单元包含非整数值,这表明在前向传递期间,CAddTable 返回了正确的值。
例如,对于单个特征图,我有 2 个 CAddTable 输入:
输入 1:
(1,1,.,.) =
-0.4010 -0.4658 -0.2517 -0.2863 -0.2731 -0.3428 -0.2685
-1.1177 -1.3387 -0.7699 -0.5595 -0.5505 -0.7473 -0.6121
-1.7965 -1.8100 -0.7766 -0.2923 -0.2297 -0.8788 -0.9094
-1.5759 -0.7506 0.5790 0.8329 0.0072 -1.5523 -1.5252
0.1142 1.1772 1.6391 1.2629 -0.2074 -2.1833 -1.9419
0.9352 1.8757 1.5200 0.8178 -0.5817 -2.1865 -1.7899
1.1880 2.0332 1.3987 0.3307 -1.0040 -2.0327 -1.5910
[torch.CudaTensor of size 1x1x7x7]
输入 2:
(1,1,.,.) =
0.0000 0.0000 0.1688 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
1.1719 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
2.3147 0.0000 0.0000 0.0000 0.0000 0.0000 0.6100
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
1.0300 0.4141 1.2499 0.1507 0.0000 0.0000 0.0000
3.0425 1.5787 0.5076 0.7407 0.8804 0.0000 0.0000
[torch.CudaTensor of size 1x1x7x7]
CAddTable 输出(我希望这是输入的总和,但它实际上是总和的单位步长函数)
(1,1,.,.) =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 1 1 1 0 0
1 1 1 1 0 0 0
1 1 1 1 0 0 0
1 1 1 1 0 0 0
[torch.CudaTensor of size 1x1x7x7]
CAddTable 之后 ReLU 单元的输出
(1,1,.,.) =
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.7388 0.0000 0.5790 0.8329 0.0072 0.0000 0.0000
0.1142 1.1772 1.6391 1.2629 0.0000 0.0000 0.0000
1.9651 2.2899 2.7700 0.9686 0.0000 0.0000 0.0000
4.2305 3.6119 1.9063 1.0714 0.0000 0.0000 0.0000
[torch.CudaTensor of size 1x1x7x7]
有谁知道为什么会发生这种情况?