【问题标题】:How to get the dropout mask in Tensorflow如何在 Tensorflow 中获取 dropout 掩码
【发布时间】:2016-05-26 14:32:54
【问题描述】:

我已经通过 Tensorflow 构建了一个带有 dropout 的回归类型的神经网络 (NN)。我想知道是否可以在输出文件中找到从前一层删除的隐藏单元。因此,我们可以通过 C++ 或 Matlab 来实现 NN 结果。

以下是 Tensorflow 模型的示例。有三个隐藏层和一个输出层。在第 3 个 sigmoid 层之后,有一个概率等于 0.9 的 dropout。我想知道是否有可能知道第三个 sigmoid 层中的哪些隐藏单元被删除了。

def multilayer_perceptron(_x, _weights, _biases):
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(_x, _weights['h1']), _biases['b1']))
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2']))
    layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, _weights['h3']), _biases['b3']))
    layer_d = tf.nn.dropout(layer_3, 0.9)
return tf.matmul(layer_d, _weights['out']) + _biases['out']

非常感谢!

【问题讨论】:

  • 答案是“是的,这是可能的,是的,在 Matlab 中绝对是可能的,但在 Python 中也是可能的”。在 TensorFlow 之前,大部分 DNN 都是在 Matlab 上模拟的,你可能会得到一些可以运行的代码,但问题是你可能无法复制 TensorFlow - 因此你的模拟可能会给你不同的结果,然后用 TensorFlow 运行。

标签: c++ matlab tensorflow


【解决方案1】:

有一种方法可以得到由tf.nn.dropout()产生的0和1的掩码,形状为layer_3.get_shape()

诀窍是为你的 dropout 操作命名:

layer_d = tf.nn.dropout(layer_3, 0.9, name='my_dropout')

那么就可以通过TensorFlow图得到想要的mask了:

graph = tf.get_default_graph()
mask = graph.get_tensor_by_name('my_dropout/Floor:0')

张量mask 将与layer_d 具有相同的形状和类型,并且只有01 的值。 0 对应丢弃的神经元。

【讨论】:

  • 感谢您的快速回复。我试试你的代码,我想知道如何打印“面具”。我尝试print mask,但它给了我Tensor("my_dropout/Floor:0", shape=(?, ?), dtype=float32)
  • 你必须使用sess = tf.Session()sess.run(mask) 来获得它的价值。 警告,由于随机化,每次调用的值都会不同。
  • 当我使用sess.run(mask)时,它需要我输入feed_dict的值。我可以知道我应该在这里输入什么吗?
  • 您应该在代码中输入与tf.placeholder() 对应的值。我建议您阅读一些教程,例如 this one,以更好地了解 TensorFlow 的工作原理。
  • 非常感谢!我误解了 NN 中 dropout 的定义。现在该模型完美运行!
【解决方案2】:

简单而惯用的解决方案(虽然可能比 Oliver 的稍慢):

# generate mask
mask = tf.nn.dropout(tf.ones_like(layer),rate)

# apply mask
dropped_layer = layer * mask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多