Как условно масштабировать значения в слое Keras Lambda? - PullRequest
0 голосов
/ 06 ноября 2018

Входной тензор rnn_pv имеет форму (?, 48, 1). Я хочу масштабировать каждый элемент в этом тензоре, поэтому я стараюсь использовать слой Lambda, как показано ниже:

rnn_pv_scale = Lambda(lambda x: 1 if x >=1000 else x/1000.0 )(rnn_pv)

Но приходит ошибка:

TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.

Итак, как правильно реализовать эту функцию?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы не можете использовать операторы потока управления Python, такие как операторы if-else, для выполнения условных операций в определении модели. Вместо этого вам нужно использовать методы, определенные в бэкэндах Keras. Поскольку вы используете TensorFlow в качестве бэкэнда, вы можете использовать tf.where() для достижения этого:

import tensorflow as tf

scaled = Lambda(lambda x: tf.where(x >= 1000, tf.ones_like(x), x/1000.))(input_tensor)

В качестве альтернативы, для поддержки всех бэкэндов, вы можете создать маску для этого:

from keras import backend as K

def rescale(x):
    mask = K.cast(x >= 1000., dtype=K.floatx())
    return mask + (x/1000.0) * (1-mask)

#...
scaled = Lambda(rescale)(input_tensor)

Обновление: Альтернативный способ поддержки всех бэкэндов заключается в использовании K.switch метода:

from keras import backend as K

scaled = Lambda(lambda x: K.switch(x >= 1000., K.ones_like(x), x / 1000.))(input_tensor)
...