如何在keras自定义正则化器中使用初始化层权重?

2024-04-18 09:59:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个自定义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分的惩罚。你知道吗


Tags: selfnonenormreturnifdefcheckdiff
1条回答
网友
1楼 · 发布于 2024-04-18 09:59:54

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

我假设正则化器在训练过程中由模型使用,但实际上在构建模型将使用的计算图时只使用一次。 因此,Keras在其计算图中学会了“取权重,从自身中减去它们,然后返回系数乘以标准值”。 经过我的编辑,它学会了做什么是“采取重量,并返回10000”。你知道吗

因此,通过将__call__函数更改为:

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

它的作用是从给定的权重中减去一个具体的数组,然后计算差值。这个数组当然是初始权重,因为它们是这个对象遇到的第一个权重。你知道吗

请随意纠正我,给我一个更准确的答案。正如我所说的-我仍然不完全理解这一点。你知道吗

相关问题 更多 >