我一直在使用Tensorflow和openopt的l-bfgs优化器。很容易设置回调以允许Tensorflow计算l-bfgs的渐变和损失评估,但是,我在如何将诸如辍学等随机元素引入训练过程中时遇到了一些麻烦。
在线搜索期间,l-bfgs执行损失函数的多个评估,这需要在与先前梯度评估相同的网络上操作。但是,对于tf.nn.dropout函数的每个评估,似乎都会创建一组新的丢失。我正在寻找一种方法来修复丢失函数的多个评估中的丢失,然后允许它在l-bfgs的梯度步骤之间进行更改。我假设这与张量流中的控制流操作有关,但是对于如何使用它们并不是一个很好的教程,它们对我来说有点神秘。
感谢您的帮助!
答案 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
的连接位置
您可以看到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次跑步。