【问题标题】:How to apply dropout in tensorflow to multidimensional tensors?如何将 tensorflow 中的 dropout 应用于多维张量?
【发布时间】:2018-02-08 19:07:29
【问题描述】:

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

以下行为是什么:

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

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

【问题讨论】:

    标签: tensorflow dimensions tensor


    【解决方案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#
    

    【讨论】:

    • 感谢您的回答。这就是我所追求的行为。但这确实在数据中增加了噪音,对吗?当我从您的代码中打印时,这些值来自 np.arrange(300) + 一些噪音。
    • Dropout-Documentation:“在概率 x 的情况下,输出按1 / keep_prob 放大,否则输出0。缩放是为了使预期总和保持不变。”原始总和是 1794000,所以输出应该有大约。相同的金额。
    • 顺便说一句,我更喜欢使用tf.layers.dropout而不是tf.nn.dropout,因为第一个层的接口与其他层一致。
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多