我想在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
的属性/值,并在损失函数中访问它?
答案 0 :(得分:0)
不太确定我是否遵循此目的(并且对您的自定义层np
内的call()
的调用感到不便-无法使用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)