使用 keras (tf2),我正在编写自己的优化器。在这个优化器中,我跟踪所有权重的平方和所有梯度的移动平均值。我将这些存储在所谓的 slots 中,创建如下:
def _create_slots(self,var_list):
# Separate for-loops required for some reason
for var in var_list:
self.add_slot(var,'squared_gradient_ma',initializer="zeros")
for var in var_list:
self.add_slot(var,'squared_param_ma',initializer="zeros")
我在 _resource_apply_dense
方法中更新这些,如下所示:
def _resource_apply_dense(self,grad,var):
squared_gradient_ma = self.get_slot(var,'squared_gradient_ma')
squared_param_ma = self.get_slot(var,'squared_param_ma')
ma_decay = 1 / 1000000
new_squared_gradient_ma = state_ops.assign(
squared_gradient_ma,(1.0 - ma_decay) * squared_gradient_ma + ma_decay * math_ops.square(grad),use_locking=self._use_locking,)
new_squared_param_ma = state_ops.assign(
squared_param_ma,(1.0 - ma_decay) * squared_param_ma + ma_decay * math_ops.square(var),)
(当然,还有更新实际权重的代码,未显示。)
这样可以在每个训练批次上更新这两个移动平均值。
现在,在训练结束时,我可以通过调用 layer.get_weights()
检查模型学习的权重。我可以调用类似的东西来查看我制作的这两个插槽的值吗?