我有一个名为X的3D张量,形状如[2,20,300],我想将辍学仅应用于第三维。但是,我希望被删除的元素对于20个实例(第二维)是相同的,但不一定是第一维。
以下行为是什么:
tf.nn.dropout(X[0], keep_prob=p)
它只会对我想要的维度采取行动吗?如果是这样,那么对于多个第一维,我可以循环它们并应用上面的行。
答案 0 :(得分:1)
请参阅tf.nn.dropout
的文档:
默认情况下,每个元素都是独立保存或删除的。如果 指定了noise_shape,它必须可以播放为x的形状, 并且只有带有noise_shape [i] == shape(x)[i]的尺寸才能生成 独立决定
所以它很简单:
import tensorflow as tf
import numpy as np
data = np.arange(300).reshape((1, 1, 300))
data = np.tile(data, (2, 20, 1))
data_op = tf.convert_to_tensor(data.astype(np.float32))
data_op = tf.nn.dropout(data_op, 0.5, noise_shape=[2, 1, 300])
with tf.Session() as sess:
data = sess.run(data_op)
for b in range(2):
for c in range(20):
assert np.allclose(data[0, 0, :], data[0, c, :])
assert np.allclose(data[1, 0, :], data[1, c, :])
print((data[0, 0, :] - data[1, 0, :]).sum())
# output something != 0 with high probability#