В задаче классификации временной последовательности я использовал 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]]]