tf.nn.experimental.stateless_dropout
Вычисляет dropout: случайным образом заменяет элементы нулями, чтобы предотвратить переобучение.
tf.nn.experimental.stateless_dropout(
x, rate, seed, rng_alg=None, noise_shape=None, name=None
)
Dropout полезен для регуляризации моделей DNN. Элементы входных данных случайным образом заменяются нулями (а остальные элементы масштабируются). Это способствует тому, что каждый узел может быть полезен независимо, поскольку он не может полагаться на выходные данные других узлов.
Точнее: с вероятностью rate элементы x заменяются на 0. Масштаб остальных элементов увеличивается в 1.0 / (1 - rate) раз, чтобы сохранить ожидаемое значение.
x = tf.ones([3,5])
tf.nn.experimental.stateless_dropout(x, rate=0.5, seed=[1, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[2., 0., 2., 0., 0.],
[0., 0., 2., 0., 2.],
[0., 0., 0., 0., 2.]], dtype=float32)>x = tf.ones([3,5])
tf.nn.experimental.stateless_dropout(x, rate=0.8, seed=[1, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[5., 0., 0., 0., 0.],
[0., 0., 0., 0., 5.],
[0., 0., 0., 0., 5.]], dtype=float32)>tf.nn.experimental.stateless_dropout(x, rate=0.0, seed=[1, 0]) == x
<tf.Tensor: shape=(3, 5), dtype=bool, numpy=
array([[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]])>Эта функция является версией tf.nn.dropout без сохранения состояния: независимо от количества вызовов этой функции, одинаковые значения seed будут приводить к одинаковым результатам, а разные значения seed — к разным результатам.
x = tf.ones([3,5])
tf.nn.experimental.stateless_dropout(x, rate=0.8, seed=[1, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[5., 0., 0., 0., 0.],
[0., 0., 0., 0., 5.],
[0., 0., 0., 0., 5.]], dtype=float32)>
tf.nn.experimental.stateless_dropout(x, rate=0.8, seed=[1, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[5., 0., 0., 0., 0.],
[0., 0., 0., 0., 5.],
[0., 0., 0., 0., 5.]], dtype=float32)>
tf.nn.experimental.stateless_dropout(x, rate=0.8, seed=[2, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[5., 0., 0., 0., 0.],
[0., 0., 0., 5., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)>
tf.nn.experimental.stateless_dropout(x, rate=0.8, seed=[2, 0])
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[5., 0., 0., 0., 0.],
[0., 0., 0., 5., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)>Сравните результаты выше с результатами функции tf.nn.dropout ниже. При втором вызове tf.nn.dropout с тем же начальным значением будет получен другой результат.
tf.random.set_seed(0)
x = tf.ones([3,5])
tf.nn.dropout(x, rate=0.8, seed=1)
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[0., 0., 0., 5., 5.],
[0., 5., 0., 5., 0.],
[5., 0., 5., 0., 5.]], dtype=float32)>
tf.nn.dropout(x, rate=0.8, seed=1)
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 5., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)>
tf.nn.dropout(x, rate=0.8, seed=2)
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[0., 0., 0., 0., 0.],
[0., 5., 0., 5., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)>
tf.nn.dropout(x, rate=0.8, seed=2)
<tf.Tensor: shape=(3, 5), dtype=float32, numpy=
array([[0., 0., 0., 0., 0.],
[5., 0., 5., 0., 5.],
[0., 5., 0., 0., 5.]], dtype=float32)>Разница между этой функцией и tf.nn.dropout аналогична разнице между tf.random.stateless_uniform и tf.random.uniform. Подробное описание различных систем генерации случайных чисел в TF см. в руководстве по генерации случайных чисел. Как указано в руководстве, устаревшие операции с RNG, сохраняющие состояние, например tf.random.uniform и tf.nn.dropout, пока не объявлены устаревшими, однако их настоятельно не рекомендуется использовать, поскольку их состояние сложно контролировать.
По умолчанию для каждого элемента независимо определяется, оставить его или отбросить. Если задан параметр noise_shape, он должен быть совместим с формой посредством broadcasting формы x, и независимые решения будут приниматься только для измерений со значением noise_shape[i] == shape(x)[i]. Это полезно, чтобы отбрасывать целые каналы изображения или последовательности. Например:
x = tf.ones([3,10])
tf.nn.experimental.stateless_dropout(x, rate=2/3, noise_shape=[1,10],
seed=[1, 0])
<tf.Tensor: shape=(3, 10), dtype=float32, numpy=
array([[3., 0., 0., 0., 0., 0., 0., 3., 0., 3.],
[3., 0., 0., 0., 0., 0., 0., 3., 0., 3.],
[3., 0., 0., 0., 0., 0., 0., 3., 0., 3.]], dtype=float32)>| Аргументы | |
|---|---|
x | Тензор с числами с плавающей точкой. |
rate | Скаляр Tensor того же типа, что и x. Вероятность отбрасывания каждого элемента. Например, при значении rate=0.1 будет отброшено 10% входных элементов. |
seed | Целочисленный тензор формы [2]. Начальное значение для генерации случайных чисел. |
rng_alg | Алгоритм, используемый для генерации случайных чисел (по умолчанию "auto_select"). Допустимые значения см. в описании аргумента alg функции tf.random.stateless_uniform. |
noise_shape | Одномерный целочисленный Tensor, представляющий форму флагов случайной генерации для сохранения или отбрасывания элементов. |
name | Имя этой операции. |
| Возвращает | |
|---|---|
Тензор той же формы и того же типа данных, что и x. |
| Вызывает исключения | |
|---|---|
ValueError | Если rate не входит в [0, 1) или если x не является тензором с числами с плавающей точкой. Значение rate=1 запрещено, поскольку в этом случае выходные данные будут состоять только из нулей, что, скорее всего, не соответствует ожидаемому результату. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/nn/experimental/stateless_dropout