tf.nn.experimental.stateless_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 с одним и тем же значением seed будет получен другой результат.
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. Как указано в руководстве, устаревшие состоятельные операторы генерации случайных чисел, такие как tf.random.uniform и tf.nn.dropout, пока не устарели, но их использование сильно не рекомендуется, так как их состояния трудно контролировать.
По умолчанию каждый элемент сохраняется или отбрасывается независимо. Если noise_shape указано, оно должно быть совместимым с трансляцией с формой 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]. Значение seed для генерации случайных чисел. |
rng_alg | Алгоритм, используемый для генерации случайных чисел (по умолчанию "auto_select"). См. аргумент alg функции tf.random.stateless_uniform для поддерживаемых значений. |
noise_shape | Целочисленный тензор размерности 1, представляющий форму для случайно сгенерированных флагов сохранения/отбрасывания. |
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