Я думаю, вы все перепутали. Но позвольте мне сначала ответить на вопрос:
Вам нужно будет создать модель несколько раз в разных областях. Тогда должно быть возможно усреднить эти переменные.
Допустим, вы создали 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)]
как и ожидалось. Теперь вы можете делать с вашей моделью все, что захотите.
Но это не , как работают ансамблевые предсказания! В ансамблевых моделях вы обычно усредняете прогнозы только . Таким образом, вы можете запустить свой сценарий несколько раз с разными моделями, а затем усреднить прогнозы.
Если вы действительно хотите усреднить веса вашей модели, рассмотрите возможность сброса весов как python-dict, используя numpy.