我正在尝试创建一个自定义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)
事实上,在整个训练过程中,如果你输了比赛,你会受到1分的惩罚。你知道吗
我仍然不完全理解它背后的所有细节,但这里是我弄错的地方:
我假设正则化器在训练过程中由模型使用,但实际上在构建模型将使用的计算图时只使用一次。 因此,Keras在其计算图中学会了“取权重,从自身中减去它们,然后返回系数乘以标准值”。 经过我的编辑,它学会了做什么是“采取重量,并返回10000”。你知道吗
因此,通过将
__call__
函数更改为:它的作用是从给定的权重中减去一个具体的数组,然后计算差值。这个数组当然是初始权重,因为它们是这个对象遇到的第一个权重。你知道吗
请随意纠正我,给我一个更准确的答案。正如我所说的-我仍然不完全理解这一点。你知道吗
相关问题 更多 >
编程相关推荐