如何将张量流中的辍学应用于多维张量?

时间:2018-02-08 19:07:29

标签: tensorflow dimensions tensor

我有一个名为X的3D张量,形状如[2,20,300],我想将辍学仅应用于第三维。但是,我希望被删除的元素对于20个实例(第二维)是相同的,但不一定是第一维。

以下行为是什么:

tf.nn.dropout(X[0], keep_prob=p)

它只会对我想要的维度采取行动吗?如果是这样,那么对于多个第一维,我可以循环它们并应用上面的行。

1 个答案:

答案 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#