Skip to content

乱七八糟的一些整理

nn.Identity()

主要特点

  1. 无操作(No-Op):输入是什么,输出就是什么,不做任何变换。
  2. 用于占位或跳过某些层:在动态网络设计中,可以用它替代某些可选的层(比如残差连接中的捷径分支)。
  3. 保持张量维度不变:适用于需要保持输入输出形状一致的场景。

典型用途

  • 简化代码逻辑:在需要条件判断是否使用某层时,可以用 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()