Нормализация Tensorflow / Keras с NaN - PullRequest
0 голосов
/ 16 июня 2019

В задаче классификации временной последовательности я использовал np.nan в качестве индикатора пропущенных значений (т. Е. Конца последовательности).Я могу рассчитать длину последовательности самостоятельно и использовать tf.nn.dynamic_rnn для построения слоев RNN (я знаю, что это устарело, это просто POC).

Есть ли способ использовать внешнийпакетной нормализации, чтобы выполнить нормализацию, исключая NAN?Подобно np.nanmean?Или мне нужно реализовать это с нуля?

Например, следующий код выводит np.nan s:

import tensorflow as tf
import numpy as np

inp = np.array([
    # Sequence 1
    [ 
      [0.0, 0.1],
      [1.0, 0.2],
      [2.0, 0.3],
      [np.nan, np.nan],
      [np.nan, np.nan]
    ],
    # Sequence 2
    [
      [1.0, 0.2],
      [2.0, 0.3],
      [3.0, 0.4],
      [4.0, 0.5],
      [5.0, 0.6]
    ]
])

in_training_mode = tf.placeholder(tf.bool)
tf_inp = tf.placeholder(tf.float32, shape=inp.shape)
tf_bn = tf.keras.layers.BatchNormalization(axis=2)(
                tf_inp, training=in_training_mode
        )

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(tf_bn, feed_dict={tf_inp : inp, in_training_mode: True}))

# Output:
# [[[nan nan]
#  [nan nan]
#  [nan nan]
#  [nan nan]
#  [nan nan]]
# [[nan nan]
#  [nan nan]
#  [nan nan]
#  [nan nan]
#  [nan nan]]]

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

print((inp - np.nanmean(inp, axis=(0,1))) / np.nanstd(inp, axis=(0,1)))

# Output:
# [[[-1.44115338 -1.44115338]
#  [-0.80064077 -0.80064077]
#  [-0.16012815 -0.16012815]
#  [        nan         nan]
#  [        nan         nan]]
# [[-0.80064077 -0.80064077]
#  [-0.16012815 -0.16012815]
#  [ 0.48038446  0.48038446]
#  [ 1.12089708  1.12089708]
#  [ 1.76140969  1.76140969]]]

1 Ответ

0 голосов
/ 06 июля 2019

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

...