代码之家  ›  专栏  ›  技术社区  ›  Tom

如何将tensorflow中的dropout应用于多维张量?

  •  1
  • Tom  · 技术社区  · 8 年前

    我有一个称为X的三维张量,形状是[2,20300],我想只对第三维应用衰减。但是,我希望删除的元素对于20个实例(第二维度)是相同的,但对于第一维度不一定相同。

    以下行为是什么:

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Patwie    8 年前

    请参阅的文档 tf.nn.dropout :

    默认情况下,每个元素都是独立保留或删除的。如果 指定了noise\u形状,它必须可以广播到x的形状, 只有具有noise\u 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#