我正在尝试创建一个自定义的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的惩罚。
答案 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当然是初始权重,因为这些是该对象遇到的第一个权重。
请随时纠正我,并给出更准确的答案。正如我所说-我仍然不完全了解这一点。