python - Keras 中自定义损失函数中的访问层属性

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

最佳答案

不太确定我是否遵循了此目的(并且我对自定义层的 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/

相关文章:

tensorflow - 文本分类中 CNN 模型输入的可变大小?

python - Keras的evaluate_generator准确率高,但各个类别的准确率较低

python - 张量板 - 错误 :Trace already enabled - How to solve?

tensorflow - FCN中的patch-wise训练和完全卷积训练

Python:如何在函数中键入提示 tf.keras 对象?

python - 只有第一行输出被打印到我的文本文件

tensorflow - 训练 TF2 object_detection API 时张量板中的饱和对比度和低亮度

python - 在ubuntu EC2深度学习实例中通过jupyter笔记本从s3读取数据

python - 禁用键盘但继续获取事件

python - 在 Python 3 中返回迭代器时, `yield from` 应该优先于 `return` 吗?