使用具有张量流和随机网络元素的外部优化器

时间:2016-05-04 17:25:29

标签: tensorflow

我一直在使用Tensorflow和openopt的l-bfgs优化器。很容易设置回调以允许Tensorflow计算l-bfgs的渐变和损失评估,但是,我在如何将诸如辍学等随机元素引入训练过程中时遇到了一些麻烦。

在线搜索期间,l-bfgs执行损失函数的多个评估,这需要在与先前梯度评估相同的网络上操作。但是,对于tf.nn.dropout函数的每个评估,似乎都会创建一组新的丢失。我正在寻找一种方法来修复丢失函数的多个评估中的丢失,然后允许它在l-bfgs的梯度步骤之间进行更改。我假设这与张量流中的控制流操作有关,但是对于如何使用它们并不是一个很好的教程,它们对我来说有点神秘。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

Drop-out依赖于使用random_uniform这是一个有状态操作,我没有看到重置它的方法。但是,您可以通过替换您自己的随机数并将它们馈送到与random_uniform相同的输入点来替换生成的值

采用以下代码:

tf.reset_default_graph()
a = tf.constant([1, 1, 1, 1, 1], dtype=tf.float32)
graph_level_seed = 1
operation_level_seed = 1
tf.set_random_seed(graph_level_seed)
b = tf.nn.dropout(a, 0.5, seed=operation_level_seed)

可视化图表以查看random_uniform的连接位置

visualization of dropout

您可以看到dropout通过名称为random_uniform的{​​{1}}操作输入Add。实际上,mydropout/random_uniform/(random_uniform)后缀是出于用户界面的原因,真正的名称是/(random_uniform),您可以通过打印mydropout/random_uniform看到。这样可以缩短张量名称。现在,您附加tf.get_default_graph().as_graph_def()以获取实际的张量名称。 (侧注:操作可以产生多个张量,对应于后缀:0:0等。由于有一个输出是最常见的情况,:1隐含在GraphDef和{{1 }}输入相当于:0。但是node在使用node:0时并不隐含,因此您必须明确写:0

所以现在你可以通过生成自己的随机数(与传入张量相同的形状)来修复种子,并在调用之间重用它们。

feed_dict

你应该看到同一组数字,包含2次跑步。