Как изменить активацию слоя с помощью лямбда-функции во время тренировки - PullRequest
1 голос
/ 14 мая 2019

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

def fun(x):
  a = min(x)
  y = np.round(x*(2**a))
return y

layer_1 = Dense(32, activation='relu')(input)
layer_2 = Dense(12, activation='relu')(layer_1)
lambda_layer = Lambda(fun, output_shape=(12,))(layer_2)
layer_3 = dense(32, activation='relu')(lambda_layer)

как я могу получить выходные данные слоя и изменить их перед передачей на следующий слой?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Использование лямбда-функции - правильный подход к вашей проблеме.Однако имейте в виду, что лямбда-функция будет частью вашего вычислительного графа, и во время обучения необходимо рассчитывать градиенты для всего графа.

Например, вам не следует использовать функцию min(), как вы, а использовать функции, которые являются частью Keras Backend .Замена всех операций их эквивалентными внутренними компонентами keras приводит к:

import keras.backend as K

def fun(x):
    a = K.min(x)
    y = K.round(K.dot(x, (K.pow(2, a))))
    return y

Ваша окончательная модель (и все остальные слои Lambda) должны содержать только собственные функции Keras, чтобы безопасно выполнять все вычисления во время обучения.

0 голосов
/ 14 мая 2019

Сбой, потому что вы используете не собственные операции (например, np.round) внутри функции Lambda, которая ожидает keras операций

Изучите документы keras.backendи возьмите оттуда функции, которые вы хотите использовать.

Таким образом, ваша функция должна выглядеть примерно так

from keras import backend as K

def fun(x):
    a = K.min(x, axis=-1)  # Specify the axis you need!
    y = K.round(x*(2**a))

    return y

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...