如何查看 keras 层变量槽的值

How to see the values of a keras layer's variables' slots

我正在使用 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),
            use_locking=self._use_locking,
            )

(当然还有更新实际权重的代码,就不展示了)

这使得这两个移动平均数在每个训练批次上更新。

现在,在训练结束时,我可以通过调用 layer.get_weights() 检查模型学到的权重。是否有类似的东西可以调用来查看我制作的这两个插槽的值?

假设您的优化器是 tf.keras.optimizers.Optimizer 的子类,并且您正在使用 model.fit 进行训练,那么您可以通过以下方式访问优化器权重:

model.optimizer.get_weights()