我正在尝试创建一个自定义 Keras 正则化器,它使用图层权重与其原始权重的距离,但我使用的似乎不起作用。似乎这个正则化器对训练和损失函数完全没有影响。
你能帮我找出我做错了什么吗?
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)
(我使用 tensorflow 作为后端)
编辑: 在玩了这个类之后,我注意到了一些奇怪的事情:就好像正则化器对象在每批训练中一遍又一遍地创建,这将解释为什么我得到零。我通过将课程更改为 -
class NormReg():
def __init__(self, coeff):
self._ugly_check = 1
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
if self._ugly_check == 1:
self._ugly_check = 0
return 10000
diff_matrix = weight_matrix - self._original_weights
return self._coeff * self._norm(diff_matrix)
事实上,损失确实会在整个训练过程中受到 _ugly_check 为 1 的惩罚。
白衣非少年
相关分类