如何查看 keras 层的变量槽的值

使用 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() 检查模型学习的权重。我可以调用类似的东西来查看我制作的这两个插槽的值吗?

wu379611988 回答:如何查看 keras 层的变量槽的值

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

model.optimizer.get_weights()
本文链接:https://www.f2er.com/34850.html

大家都在问