如何无需重新训练即可禁用预训练自编码器latent space层的神经元?
问题解答
可行性结论
你需要的「预测阶段禁用部分潜空间神经元、无需重新训练模型」的操作完全可实现。
当前代码的问题
你当前直接修改n_modes参数重建模型的逻辑不可行:你训练好的模型是基于潜空间8个神经元的结构保存的权重,编码器最后一层、解码器第一层的权重维度都和8个神经元绑定,直接把n_modes改为1/2后重建的模型,对应层的权重维度和预训练权重不匹配,加载时会直接报错。
实现方案
推荐你用掩蔽法实现,无需修改模型结构、无需调整权重加载逻辑,只需要加一行掩码操作就能灵活控制启用的潜空间神经元数量,非常适合做 ablation 实验:
- 构建模型时固定
n_modes = 8,和你训练时的参数保持一致,正常加载预训练权重 - 在编码器输出
encoded之后、输入解码器之前,添加自定义掩码层,把不需要启用的神经元输出置为0即可,示例代码如下:
# 你需要保留的潜空间神经元数量,可自由调整为1/2/4等任意值 keep_modes = 2 # 添加掩码操作,仅保留前keep_modes个神经元的输出,其余置为0 encoded_masked = ks.layers.Lambda( lambda x: x * tf.sequence_mask(keep_modes, n_modes, dtype=tf.float32) )(encoded) # 解码器输入替换为掩码后的张量即可 autoencoder = tf.keras.models.Model(input_img, DEC(encoded_masked))
如果你需要完全裁剪掉未使用的神经元权重、减少推理计算量,可以手动提取预训练权重的对应维度赋值给小模型:
- 编码器最后一层权重取
[:, :keep_modes],偏置取[:keep_modes] - 解码器第一层权重取
[:keep_modes, :],偏置保持不变
赋值到你按n_modes=keep_modes构建的新模型对应层即可正常运行。
内容的提问来源于stack exchange,提问作者Yaroslav
相关产品推荐
相关产品推荐

