如何查看Keras(TF2)自定义优化器中层变量的slots槽变量取值
查看自定义优化器slot槽变量的方法
完全可以直接通过优化器实例的内置方法读取,步骤非常简单:
- 首先保留训练时使用的自定义优化器实例(比如你初始化的
opt = YourCustomOptimizer()对象) - 拿到你要查询slot对应的模型权重变量,比如某层的kernel/bias变量
- 调用优化器的
get_slot(var, slot_name)方法即可获取对应槽变量,调用.numpy()可转为普通numpy数组查看数值
代码示例
单变量查询:
# 取模型第3层的kernel权重作为目标变量 target_var = model.layers[2].kernel # 读取对应squared_gradient_ma槽变量 squared_gradient_ma = opt.get_slot(target_var, "squared_gradient_ma") print(squared_gradient_ma.numpy()) # 读取对应squared_param_ma槽变量 squared_param_ma = opt.get_slot(target_var, "squared_param_ma") print(squared_param_ma.numpy())
批量遍历所有可训练参数的槽变量:
for var in model.trainable_variables: print(f"当前变量名:{var.name}") print(f"梯度平方移动平均值:\n{opt.get_slot(var, 'squared_gradient_ma').numpy()}") print(f"参数平方移动平均值:\n{opt.get_slot(var, 'squared_param_ma').numpy()}") print("-"*60)
注意事项
- 只有你创建slot时包含的变量(默认是所有可训练参数)才能读到对应slot,
trainable=False的变量默认不会生成slot - 如果你是从checkpoint加载训练好的优化器,只要完整加载了优化器状态,也可以用同样方法读取slot数值,不需要重新训练
内容的提问来源于stack exchange,提问作者acdr
相关产品推荐
相关产品推荐

