Доступ к атрибуту слоя в пользовательской функции потерь в Keras - PullRequest
1 голос
/ 27 июня 2019

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

1 Ответ

0 голосов
/ 27 июня 2019

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