Маска шагов в TensorFlow
В одной партии последовательности часто разной длины. Короткие дополняют нулями до общей длины, но эти шаги не должны влиять на расчёт. Маска отмечает, какие шаги настоящие, а какие служат только выравниванием.
Класс Masking сравнивает
значения шага с заданным числом
заполнителя. Совпадение помечает
шаг как пропускаемый. Маска
передаётся дальше по цепочке
слоям, которые умеют её учитывать.
Подадим строку, где хвост из нулей, и выведем маску шагов:
import tensorflow as tf
batch = tf.constant([[[1.0], [2.0], [0.0], [0.0]]],
dtype=tf.float32)
layer = tf.keras.layers.Masking(mask_value=0.0)
y = layer(batch)
print(y._keras_mask)
# выведет [[ True True False False]]
Если после маски стоит рекуррентный блок, хвост из нулей не меняет итог: две цепочки с одинаковым началом и разным числом нулей в конце дают один и тот же ответ:
import tensorflow as tf
tf.keras.utils.set_random_seed(0)
short = tf.constant([[[1.0], [2.0], [3.0],
[0.0], [0.0]]], dtype=tf.float32)
long = tf.constant([[[1.0], [2.0], [3.0],
[0.0], [0.0], [0.0], [0.0]]],
dtype=tf.float32)
model = tf.keras.Sequential([
tf.keras.layers.Masking(mask_value=0.0),
tf.keras.layers.LSTM(3),
])
print(model(short).numpy())
print(model(long).numpy())
Соберите пару шагов [4.0, 0.0, 0.0]
с одним признаком в партии
из одной строки. Узнайте,
какие шаги маска считает
действительными.
Задайте две строки одинаковых четырёх шагов, где последние два шага - нули. Сравните сводку рекуррентного блока после слоя заполнителя для короткой и удлинённой версии второй строки.
Создайте вход формы (2, 6, 1),
где в каждой строке первые
три числа ненулевые, а остальные
- нули. Выведите маску шагов
после слоя с заполнителем
0.0.