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

Python 如何在TensorFlow中恢复多个神经网络模型?,python,tensorflow,neural-network,save,restore,Python,Tensorflow,Neural Network,Save,Restore,我正在设计一个带有3个简单前馈神经网络的集成神经网络。现在我面临着一个问题,就是为了测试目的而恢复这3个神经网络。到目前为止,通过saver功能创建并保存了3个NN模型 saver = tf.train.Saver() saver.save(sess, save_path=get_save_path(i), global_step=1000) 我已经成功地将它们保存到“.checkpoint”、“.meta”、“.index”和“.data文件中,如下所示 我尝试使用以下代码还原它们

我正在设计一个带有3个简单前馈神经网络的集成神经网络。现在我面临着一个问题,就是为了测试目的而恢复这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))
但是它只恢复了第三个NN,即
network2
,用于测试。这影响了我的结果,因为该算法只需要1个模型(
network2
),并且假设所有三个NNs模型在集成功能上相同

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

我理想的合奏功能:

ensemble = (network0 + network1 + network2) / 3
实际结果:

ensemble = (network2 + network2 + network2) / 3

如何使TF同时恢复所有3个NN模型?

我认为您弄错了。但首先让我回答这个问题:

您需要在不同的作用域下多次创建模型,然后才能对这些变量求平均值

假设您通过以下方式创建了3个网络:

将tensorflow导入为tf
#保存3个版本
对于范围(3)中的i:
tf.reset_default_graph()
a=tf.get_变量('test',[1])
分配(i)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
sess.run(分配操作)
打印a.name、sess.run(a)
saver=tf.train.saver(tf.global_variables())
saver.save(sess,。/型号/版本%i'%i)
这里,每个网络都有相同的图形结构,只包含一个参数/权重名称“test”

然后您需要多次创建同一个图,但是在不同的变量范围下,如

#加载不同范围内的所有版本
tf.reset_default_graph()
a_集合=[]
对于范围(3)中的i:
#使用不同的var作用域
使用tf.variable\u scope('scope\u%0i'%i]:
#创建相同的网络
a=tf.get_变量('test',[1])
a_集合。追加(a)
现在,每个恢复程序都需要知道应该使用哪个作用域或变量名映射

将tf.Session()作为sess的
:
sess.run(tf.global\u variables\u initializer())
打印zip(sess.run(a_集合),[n.name表示a_集合中的n])
对于范围(3)中的i:
loader=tf.train.Saver({“test”:a_集合[i]})
loader=loader.restore(sess'./型号/版本%i'%i)
打印sess.run(一个集合)
这会给你

 [array([0.], dtype=float32), array([1.], dtype=float32), array([2.], dtype=float32)]
正如所料。现在你可以用你的模型做任何你想做的事情

但这不是集成预测的工作方式!在集成模型中,通常仅对预测进行平均。因此,可以使用不同的模型多次运行脚本,然后对预测进行平均


如果你真的想要平均模型的权重,考虑使用NUMPY将Pothon DICT倾倒为Python DIt。< /P>我在代码中发现了这个错误:<代码> AtditError:'Nuppy.NDARRAY ''对象没有属性“赋值”< /COD> >代码> A= TF.GETYVALIABLE()/Type >是TysRoFoW对象。不要将它与NUMPY-ARYS混合。