Функция nn.dropout
Функция nn.dropout применяет механизм dropout к
входному тензору. Первым параметром передается
входной тензор, вторым - вероятность сохранения
элемента rate (keep probability). Элементы,
которые не были обнулены, масштабируются на
1 / rate, чтобы суммарное математическое
ожидание тензора оставалось неизменным. Третьим
параметром можно передать шум noise_shape,
а четвертым - зерно генератора seed.
Синтаксис
tf.nn.dropout(x, rate, [noise_shape], [seed], [name])
Пример
Давайте применим dropout к тензору из единиц
с вероятностью сохранения 0.5:
import tensorflow as tf
tf.random.set_seed(0)
t = tf.constant([1.0, 1.0, 1.0, 1.0, 1.0])
res = tf.nn.dropout(t, rate=0.5)
print(res)
Результат выполнения кода:
tf.Tensor([2. 0. 2. 0. 2.], shape=(5,), dtype=float32)
Как видно из результата, элементы, которые
остались, были умножены на 2 (то есть на
1 / 0.5), а остальные обнулены.
Пример
Давайте применим dropout к двумерному тензору
с вероятностью сохранения 0.8:
import tensorflow as tf
tf.random.set_seed(0)
t = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
res = tf.nn.dropout(t, rate=0.8)
print(res)
Результат выполнения кода:
tf.Tensor(
[[1.25 2.5 0. ]
[0. 6.25 0. ]], shape=(2, 3), dtype=float32)
Обратите внимание, что сохраненные элементы
масштабируются на 1.25 (то есть на
1 / 0.8).
Пример
Давайте используем параметр noise_shape,
чтобы dropout применялся только по определенным
осям тензора:
Результат выполнения кода:
tf.Tensor(
[[0. 0. 0.]
[8. 10. 12.]], shape=(2, 3), dtype=float32)
В этом случае маска dropout имеет форму
[2, 1] и применяется ко всей строке
целиком: первая строка обнулилась полностью,
а вторая - умножилась на 2.
Пример
Давайте применим dropout внутри слоя
tf.keras.layers.Dropout для регуляризации
модели:
import tensorflow as tf
tf.random.set_seed(0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(4, activation='relu'),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(1)
])
t = tf.constant([[1.0, 2.0, 3.0]])
res = model(t, training=True)
print(res)
Результат выполнения кода:
tf.Tensor([[-0.5298233]], shape=(1, 1), dtype=float32)
При training=True слой Dropout активен,
а при training=False он пропускает данные
без изменений.
Смотрите также
-
функцию
batch_normalization,
которая нормализует активации слоя -
функцию
l2_normalize,
которая выполняет L2-нормализацию по оси -
функцию
moments,
которая вычисляет среднее и дисперсию -
функцию
softmax,
которая применяет функцию softmax к логитам