Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在keras自定义正则化器中使用初始化层权重?_Python_Tensorflow_Keras_Deep Learning - Fatal编程技术网

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

Python 如何在keras自定义正则化器中使用初始化层权重?,python,tensorflow,keras,deep-learning,Python,Tensorflow,Keras,Deep Learning,我试图创建一个自定义Keras正则化器,它使用层的权重与其原始权重的距离,但我使用的似乎不起作用。似乎这个正则化器对训练和损失函数没有任何影响 你能帮我找出我做错了什么吗 class NormReg(): 定义初始值(自身,系数): 自身系数=系数 自身。\原始\权重=无 定义标准(自身、重量矩阵): 返回K.sum(K.square(权重矩阵)) 定义调用(自身、重量矩阵): 如果self.\u原始\u权重为无: 自身。\原始\权重=权重\矩阵 差异矩阵=权重矩阵-自身。原始权重 返回自我系数

我试图创建一个自定义Keras正则化器,它使用层的权重与其原始权重的距离,但我使用的似乎不起作用。似乎这个正则化器对训练和损失函数没有任何影响

你能帮我找出我做错了什么吗

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
这里始终为零这是我在这里发布的重点,我找不到错误。。。