Я хочу написать пользовательскую функцию потерь в 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
в слое при каждом вызове и получить к нему доступ в функции потерь?