如何在 Tensorflow 中获取 dropout mask

How to get the dropout mask in Tensorflow

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

下面是Tensorflow模型的一个例子。有三个隐藏层和一个输出层。在第 3 个 sigmoid 层之后,有一个概率等于 0.9 的 dropout。我想知道是否有可能知道第 3 个 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']

非常感谢!

有一种方法可以获取由 tf.nn.dropout() 生成的 0 和 1 形状 layer_3.get_shape() 的掩码。

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

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

然后就可以通过TensorFlow graph得到想要的mask了:

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

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

简单且惯用的解决方案(尽管可能比 Oliver 的稍慢):

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

# apply mask
dropped_layer = layer * mask