如何在keras自定义正则化程序中使用初始化的图层权重?

时间:2019-04-16 16:17:12

标签: python tensorflow keras deep-learning

我正在尝试创建一个自定义的Keras正则化程序,它使用该图层的权重与其原始权重之间的距离,但是我使用的似乎无效。似乎该调节器对训练和损失函数完全没有影响。

您能帮我发现我在做什么错吗?

<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

(我正在使用tensorflow作为后端)

编辑: 在玩完该类后,我注意到了一个奇怪的现象:好像在每批训练中一次又一次地创建了正则化器对象,这将解释为什么我得到零。 通过将类更改为-

,我得出了这个结论
class NormReg():
    def __init__(self, coeff):
        self._coeff = coeff
        self._original_weights = None

    def _norm(self, weight_matrix):
        return K.sum(K.square(weight_matrix))

    def __call__(self, weight_matrix):
        if self._original_weights is None:
            self._original_weights = weight_matrix

        diff_matrix = weight_matrix - self._original_weights
        return self._coeff * self._norm(diff_matrix)

在整个训练过程中,看到损失确实受到_ugly_check为1的惩罚。

1 个答案:

答案 0 :(得分:0)

我仍然不完全了解它背后的所有细节,但这是我弄错了的地方:

我假设正则化器在训练期间由模型使用,但实际上在构建模型将要使用的计算图时仅使用一次。 因此,Keras在其计算图中学会做的是“取权重,从权重中减去权重,然后得出系数乘以范数”。 编辑之后,它学会了做“权重并返回10000”。

因此,将__call__函数更改为:

def __call__(self, weight_matrix):
        diff_matrix = weight_matrix - K.eval(weight_matrix)
        return self._coeff * self._norm(diff_matrix)

它的作用是现在从给定的权重中减去一个具体的ndarray,然后计算差值。该ndarray当然是初始权重,因为这些是该对象遇到的第一个权重。

请随时纠正我,并给出更准确的答案。正如我所说-我仍然不完全了解这一点。