Python 如何在keras自定义正则化器中使用初始化层权重?
我试图创建一个自定义Keras正则化器,它使用层的权重与其原始权重的距离,但我使用的似乎不起作用。似乎这个正则化器对训练和损失函数没有任何影响 你能帮我找出我做错了什么吗Python 如何在keras自定义正则化器中使用初始化层权重?,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我试图创建一个自定义Keras正则化器,它使用层的权重与其原始权重的距离,但我使用的似乎不起作用。似乎这个正则化器对训练和损失函数没有任何影响 你能帮我找出我做错了什么吗 class NormReg(): 定义初始值(自身,系数): 自身系数=系数 自身。\原始\权重=无 定义标准(自身、重量矩阵): 返回K.sum(K.square(权重矩阵)) 定义调用(自身、重量矩阵): 如果self.\u原始\u权重为无: 自身。\原始\权重=权重\矩阵 差异矩阵=权重矩阵-自身。原始权重 返回自我系数
class NormReg():
定义初始值(自身,系数):
自身系数=系数
自身。\原始\权重=无
定义标准(自身、重量矩阵):
返回K.sum(K.square(权重矩阵))
定义调用(自身、重量矩阵):
如果self.\u原始\u权重为无:
自身。\原始\权重=权重\矩阵
差异矩阵=权重矩阵-自身。原始权重
返回自我系数*自我范数(差异矩阵)
(我使用tensorflow作为后端)
编辑:
在玩了一点这个类之后,我注意到了一些奇怪的事情:好像正则化器对象在每个批次的训练中被一次又一次地创建,这将解释为什么我会得到零。
我通过将课程改为-
class NormReg():
定义初始值(自身,系数):
自我检查=1
自身系数=系数
自身。\原始\权重=无
定义标准(自身、重量矩阵):
返回K.sum(K.square(权重矩阵))
定义调用(自身、重量矩阵):
如果self.\u原始\u权重为无:
自身。\原始\权重=权重\矩阵
如果自我检查=1:
自我检查=0
返回10000
差异矩阵=权重矩阵-自身。原始权重
返回自我系数*自我范数(差异矩阵)
事实上,在整个训练过程中,如果失败的话,将会受到1分的惩罚 我仍然不完全理解它背后的所有细节,但这里是我弄错的地方: 我假设正则化器在训练期间由模型使用,但实际上在构建模型将使用的计算图时只使用一次。 因此,Keras在其计算图中学会了“取权重,从自身中减去它们,然后返回系数乘以标准值”。 在我编辑之后,它学会了做的是“取重量,然后返回10000” 因此,通过将
\uuu call\uu
函数更改为:
def\uuuu调用(自重矩阵):
差异矩阵=权重矩阵-K.eval(权重矩阵)
返回自我系数*自我范数(差异矩阵)
这样做的目的是,它现在从给定的权重中减去一个具体的ndarray,然后计算差值。当然,这是初始权重,因为这些是该对象遇到的第一个权重
请随时纠正我,并给出更准确的答案。正如我所说,我仍然不能完全理解这一点 我仍然不完全理解它背后的所有细节,但这里是我弄错的地方: 我假设正则化器在训练期间由模型使用,但实际上在构建模型将使用的计算图时只使用一次。 因此,Keras在其计算图中学会了“取权重,从自身中减去它们,然后返回系数乘以标准值”。 在我编辑之后,它学会了做的是“取重量,然后返回10000” 因此,通过将
\uuu call\uu
函数更改为:
def\uuuu调用(自重矩阵):
差异矩阵=权重矩阵-K.eval(权重矩阵)
返回自我系数*自我范数(差异矩阵)
这样做的目的是,它现在从给定的权重中减去一个具体的ndarray,然后计算差值。当然,这是初始权重,因为这些是该对象遇到的第一个权重
请随时纠正我,并给出更准确的答案。正如我所说,我仍然不能完全理解这一点 检查逻辑。你得到的是
diff_matrix
这里始终为零这是我在这里发布的观点,我找不到错误…检查逻辑。你得到的是diff_matrix
这里始终为零这是我在这里发布的重点,我找不到错误。。。