Лямбда-слой для поэлементного умножения дает NaN после первого обновления модели. (Керас)

Моя модель написана на керасе. Он имеет несколько входов, один из которых должен быть умножен на выходы предпоследнего слоя Dense перед подачей логитов в softmax. Это поэлементное умножение выполняется с помощью лямбда-слоя.

def mul(x, mask):
    output = x*mask
    return output

logits = Lambda(lambda x: mul(x, input_2))(dense_output) # gives nan after first update

После первого обновления модели лямбда-слой начинает выдавать NaN в качестве вывода.
Этого не происходит, если у меня есть постоянный вектор, определенный в вычислительном графе, который умножается на результат плотного слоя.

logits = dense_output * [1, 1, 1, 1, 1, -100, 1, -100, 1, 1] # does not give nan

Я также пробовал использовать Multiply Layer, предоставляемый Keras. Но это тоже выбрасывает NaN после первого обновления. Вот фрагмент того же:

logits = Multiply()([dense_output, input_2]) # gives nan after first update

Я в основном хочу замаскировать определенные состояния вывода с помощью этого умножения на ввод, но не могу этого сделать, если слой продолжает выдавать NaN в качестве вывода.
Есть ли способ решить эту проблему? Любая помощь будет оценена!


person Divyam Goel    schedule 11.09.2020    source источник


Ответы (1)


Я не уверен, как это работает, но я нашел решение. Кажется, что добавление слоя Dense перед слоем Multiply решает проблему. Неважно, тренируем ли плотный слой или нет. Вот код:

logits = Multiply()([dense_output, input_2])
initializer = tf.keras.initializers.Identity()
masked_actions = Dense(num_actions, use_bias=False, 
                       trainable=False)(logits) #returns the same logits

Обновления модели теперь работают должным образом, не вызывая ошибок NaN ValueErrors.

person Divyam Goel    schedule 13.09.2020