如何在多个神经网络模型中恢复张量流?

2024-05-15 07:50:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个具有3个简单前馈神经网络的集成神经网络。现在我面临着一个问题,恢复这3个神经网络的测试目的。到目前为止,3个NN模型是由saver函数创建和保存的。在

saver = tf.train.Saver()    
saver.save(sess, save_path=get_save_path(i), global_step=1000)

我已经成功地将它们保存到“.checkpoint”、“.meta”、“.index”和“.data”文件中,如下所示。在

enter image description here

我试着用这个代码恢复它们:

^{pr2}$

但它只恢复第三个NN network2进行测试。由于算法只取1个模型(network2),并且假设三个NNs模型在系综函数上是相同的,这影响了我的结果。在

仅供参考:

我理想的系综函数:

ensemble = (network0 + network1 + network2) / 3

实际结果:

ensemble = (network2 + network2 + network2) / 3

如何使TF一起恢复所有3个NN模型?在


Tags: path函数模型目的savetftrain神经网络
1条回答
网友
1楼 · 发布于 2024-05-15 07:50:26

我觉得你把事情搞混了。但让我先回答这个问题:

您需要在不同的作用域下多次创建模型。然后就可以平均这些变量。在

假设你通过

import tensorflow as tf

# save 3 version
for i in range(3):
    tf.reset_default_graph()

    a = tf.get_variable('test', [1])

    assign_op = a.assign([i])

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        sess.run(assign_op)
        print a.name, sess.run(a)

        saver = tf.train.Saver(tf.global_variables())
        saver.save(sess, './model/version_%i' % i)

这里每个网络都有相同的图结构,只包含一个参数/权重名称“test”。在

然后您将需要多次创建相同的图,但在不同的变量范围下,例如

^{pr2}$

现在,每个恢复程序都需要知道应该使用哪个范围或变量名映射。这可以通过

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print zip(sess.run(a_collection), [n.name for n in a_collection])

    for i in range(3):
        loader = tf.train.Saver({"test": a_collection[i]})
        loader = loader.restore(sess, './model/version_%i' % i)

    print sess.run(a_collection)

这会给你

 [array([0.], dtype=float32), array([1.], dtype=float32), array([2.], dtype=float32)]

一如预期。现在你可以对你的模型做任何你想做的事情。在

但这不是集合预测的工作原理!在系综模型中,通常只对预测进行平均化。因此,您可以使用不同的模型多次运行脚本,然后平均预测结果。在

如果您真的想平均模型的权重,可以考虑使用numpy将权重作为python dict进行转储。在

相关问题 更多 >