Использование пользовательской функции активации шага в Keras приводит к «Операции имеет значение« Нет »для градиента».ошибка.Как решить это? - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю авто-кодировщик и хочу закодировать свои значения в логическую матрицу.Однако, когда я использую свою функцию активации пользовательского шага в одном из промежуточных слоев (все другие слои используют 'relu'), keras вызывает эту ошибку:

An operation has `None` for gradient.

Я пытался использовать hard-sigmoid функция, но она не подходит для моей проблемы, потому что она все еще выдает промежуточные значения, когда мне нужен только двоичный файл.Я знаю, что в большинстве точек моя функция не имеет градиента, но возможно ли использовать какую-то другую функцию для расчета градиента и все еще использовать функцию шага для вычисления точности и потерь?

Моя функция активации:

def binary_activation(x):
    ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
    zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
    return keras.backend.switch(x > 0.5, ones, zeros)

Я ожидаю, что смогу использовать двоичную пошаговую функцию активации для обучения сети, а затем использовать ее в качестве типичного авто-кодировщика.Что-то похожее на двоичную карту характеристик, используемую в этой статье .

1 Ответ

0 голосов
/ 11 февраля 2019

Как уже упоминалось здесь , вы можете использовать tf.custom_gradient , чтобы определить «распространяемый обратно» градиент для вашей функции активации.

Возможно что-то вроде:

@tf.custom_gradient
def binary_activation(x):

    ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
    zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)

    def grad(dy):
        return ...  # TODO define gradient
  return keras.backend.switch(x > 0.5, ones, zeros), grad
...