Keras中自定义丢失函数中的访问层属性

时间:2019-06-27 12:25:06

标签: python tensorflow keras

我想在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的属性/值,并在损失函数中访问它?

1 个答案:

答案 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)