使用带有tensorflow和随机网络元素的外部优化器

使用带有tensorflow和随机网络元素的外部优化器,tensorflow,Tensorflow,我一直在openopt的l-bfgs优化器中使用Tensorflow。设置回调以允许Tensorflow计算l-BFG的梯度和损失评估非常容易,但是,我在弄清楚如何在训练过程中引入诸如辍学之类的随机因素时遇到了一些困难 在线路搜索过程中,l-bfgs对损失函数进行多次评估,需要在与先前梯度评估相同的网络上进行操作。然而,对于tf.nn.dropout函数的每次评估,似乎都会创建一组新的dropout。我正在寻找一种方法来修复损失函数多次评估中的缺失,然后允许它在l-bfgs的梯度步骤之间变化。我

我一直在openopt的l-bfgs优化器中使用Tensorflow。设置回调以允许Tensorflow计算l-BFG的梯度和损失评估非常容易,但是,我在弄清楚如何在训练过程中引入诸如辍学之类的随机因素时遇到了一些困难

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


谢谢你的帮助

退出依赖于uses
random\u uniform
,这是一个有状态的操作,我看不到重置它的方法。但是,您可以通过替换您自己的随机数并将它们输入到与
random\u 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\u uniform
的连接位置

您可以看到
dropout
通过
Add
op输入
random\u uniform/(random\u uniform)
,其名称为
mydropout/random\u uniform/(random\u uniform)
。实际上,
/(random\u uniform)
后缀是出于用户界面的原因而存在的,真实名称是
mydropout/random\u uniform
,您可以通过打印
tf.get\u default\u graph().as\u graph\u def()
看到。这给了你一个缩短的张量名称。现在添加
:0
以获得实际的张量名称。(旁注:操作可能会产生多个张量,对应于后缀
:0
:1
等。由于最常见的情况是有一个输出,
:0
在GraphDef中是隐式的,
节点
输入相当于
节点:0
。但是
:0
在使用
提要dict
时不是隐式的因此,您必须显式地编写
节点:0

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

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, name="mydropout")
random_numbers = np.random.random(a.get_shape()).astype(dtype=np.float32)
sess = tf.Session()
print sess.run(b, feed_dict={"mydropout/random_uniform:0":random_numbers})
print sess.run(b, feed_dict={"mydropout/random_uniform:0":random_numbers})
您应该在2次运行呼叫中看到相同的号码集