Я хочу написать пользовательскую функцию потерь в Keras, которая зависит от атрибута (пользовательского) слоя в сети.
Идея заключается в следующем:
- Iиметь собственный слой, который изменяет входные данные в каждой эпохе на основе случайной величины
- Выходные метки должны быть изменены на основе той же переменной
Некоторые примеры кода, чтобы сделать его более понятным:
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
в слое при каждом вызове и доступеэто в функции потерь?