乱七八糟的一些整理
nn.Identity()
主要特点
- 无操作(No-Op):输入是什么,输出就是什么,不做任何变换。
- 用于占位或跳过某些层:在动态网络设计中,可以用它替代某些可选的层(比如残差连接中的捷径分支)。
- 保持张量维度不变:适用于需要保持输入输出形状一致的场景。
典型用途
- 简化代码逻辑:在需要条件判断是否使用某层时,可以用
Identity()
代替None
,避免额外的if-else
检查。 - 残差连接(ResNet):如果主分支和捷径分支的维度一致,可以用
Identity()
作为捷径分支的占位符。 - 模型剪枝或动态架构:在模型结构调整时,某些层可以临时替换为
Identity()
而不影响整体结构。
示例代码
python
import torch.nn as nn
teacher_model = resnet18()
# 修改第一层卷积
teacher_model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
#移除原ResNet的初始MaxPooL层(防止过早下采样)
teacher_model.maxpool = nn.Identity()