我想在 Keras 中编写一个自定义损失函数,它取决于网络中(自定义)层的属性。
想法如下:
- 我有一个自定义层,它根据随机变量修改每个时期的输入
- 应根据同一变量修改输出标签
一些示例代码可以使其更清楚:
import numpy as np
from keras import losses, layers, models
class MyLayer(layers.Layer):
def call(self, x):
a = np.random.rand()
self.a = a # <-- does this work as expected?
return x+a
def my_loss(layer):
def modified_loss(y_true, y_pred):
a = layer.a
y_true = y_true + a
return losses.mse(y_true, y_pred)
input_layer = layers.Input()
my_layer = MyLayer(input_layer, name="my_layer")
output_layer = layers.Dense(4)(my_layer)
model = models.Model(inputs=input_layer, outputs=output_layer)
model.compile('adam', my_loss(model.get_layer("my_layer")))
我希望每个批处理的a
都会发生变化,并且在层和损失函数中使用相同的a
。
现在,它没有按照我预期的方式工作。损失函数中的 a
似乎永远不会更新(甚至可能在层中也不会更新)。
如何在每次调用时更改层中 a
的属性/值并在损失函数中访问它?
最佳答案
不太确定我是否遵循了此目的(并且我对自定义层的 call()
内对 np
的调用感到困扰 - 你能不这样做吗?使用 tf.random 函数代替?)但您当然可以访问损失函数中的 a 属性。
也许是这样的:
class MyLayer(layers.Layer):
def call(self, x):
a = np.random.rand() # FIXME --> use tf.random
self.a = a
return x+a
input_layer = layers.Input()
my_layer = MyLayer(input_layer, name="my_layer")
output_layer = layers.Dense(4)(my_layer)
model = models.Model(inputs=input_layer, outputs=output_layer)
def my_loss(y_true, y_pred):
y_true = y_true + my_layer.a
return losses.mse(y_true, y_pred)
model.compile('adam', loss=my_loss)
关于python - Keras 中自定义损失函数中的访问层属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56790971/