如何在Tensorflow中获取dropout掩码

时间:2016-05-26 14:32:55

标签: c++ matlab tensorflow

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

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

非常感谢!

2 个答案:

答案 0 :(得分:5)

有一种方法可以获得由layer_3.get_shape()生成的0和1以及tf.nn.dropout()形状的蒙版。

诀窍是为你的辍学行动命名:

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

然后你可以通过TensorFlow图获得想要的掩码:

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

张量masklayer_d形状和类型相同,并且只有01的值。 0对应于丢弃的神经元。

答案 1 :(得分:1)

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

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

# apply mask
dropped_layer = layer * mask