如何在 TensorFlow 中恢复多个神经网络模型?

Posted

技术标签:

【中文标题】如何在 TensorFlow 中恢复多个神经网络模型?【英文标题】:How to restore multiple neural network models in TensorFlow? 【发布时间】:2018-05-02 13:53:42 【问题描述】:

我正在设计一个具有 3 个简单前馈 NN 的集成神经网络。现在我面临着恢复这 3 个神经网络以进行测试的问题。至此,saver 函数创建并保存了 3 个 NN 模型。

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

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

我尝试使用以下编码恢复它们:

 saver = tf.train.import_meta_graph(get_save_path(i) + '-1000.meta')
 saver.restore(sess,tf.train.latest_checkpoint(save_dir))

但它只恢复第三个神经网络network2 进行测试。它影响了我的结果,因为该算法仅采用 1 个模型 (network2) 并假设所有三个 NN 模型在集成函数中都是相同的。

仅供参考:

我理想的集成函数:

ensemble = (network0 + network1 + network2) / 3

实际结果:

ensemble = (network2 + network2 + network2) / 3

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

【问题讨论】:

【参考方案1】:

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

您需要在不同的范围内多次创建模型。然后应该可以对这些变量进行平均。

假设您创建了 3 个网络

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”。

然后你需要多次创建相同图,但是在不同 variable_scopes下,比如

# load all versions in different scopes
tf.reset_default_graph()

a_collection = []

for i in range(3):
    # use different var-scopes
    with tf.variable_scope('scope_%0i' % i):
        # create same network
        a = tf.get_variable('test', [1])
        a_collection.append(a)

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

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 转储。

【讨论】:

我在我的代码中发现了这个错误:AttributeError: 'numpy.ndarray' object has no attribute 'assign' a = tf.get_variable() 是一个 TensorFow 对象。不要将其与 numpy-arys 混淆。

以上是关于如何在 TensorFlow 中恢复多个神经网络模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 tensorflow 中使用 softmax-output-layer 来并行确定多个标签(在神经网络中)?

Tensorflow 如何使用多个 GPU 进行单独训练?

Tensorflow - 从恢复的模型中平均模型权重

TensorFlow 在忽略范围名称或进入新范围名称时恢复

Tensorflow:如何使用恢复的模型?

如何使用tensorflow的retrain.py重新训练多个初始实例