TensorFlow模型训练过程中激活值的存储位置在哪里?
TensorFlow 2 反向传播中间激活值的存储位置
- 默认动态图(Eager Execution)模式下,反向传播依赖的中间激活值不会存储在
tf.keras.Model实例本身的属性中,而是临时保存在tf.GradientTape的上下文缓存里。只有被梯度带记录的前向传播过程产生的激活值才会被留存,反向传播计算完梯度后,这些缓存默认会自动释放,除非你初始化梯度带时指定了persistent=True参数。 - 如果你直接用Keras内置的
fit()、train_on_batch()等方法训练,没有手动写梯度带逻辑,这些中间激活值会存在Keras内部自动创建的临时梯度带缓存中,单步训练执行完成后就会被销毁,你没法直接从模型对象里读取到。 - 要是你需要主动获取这些中间激活值,可以用两种方案实现:
- 重写模型的
call方法,在前向传播时同时返回所有你需要的中间层激活值 - 基于现有模型实例创建衍生模型,输入和原模型相同,输出为你需要获取激活值的层的输出,直接调用这个衍生模型做前向传播就能拿到对应激活值
- 重写模型的
- 要是你开了
tf.function用静态图模式执行,中间激活值会由TensorFlow的图运行时引擎在专属缓存中管理,同样不会挂载到Model对象上,梯度计算完成后会按图优化规则自动回收内存。
内容的提问来源于stack exchange,提问作者灵翼俠
相关产品推荐
相关产品推荐

