Ответ 1
Вы получили бы tf.errors.NotFoundError
, если бы попытались использовать заставку (по умолчанию представляющую все шесть переменных) для восстановления с контрольной точки, которая не содержит всех переменных, которые представляет заставка. (Обратите внимание, однако, что вы можете называть Saver.restore()
несколько раз в одном сеансе для любого подмножества переменных, если все запрошенные переменные присутствуют в соответствующем файле.)
Канонический подход заключается в определении двух отдельных tf.train.Saver
экземпляров, охватывающих все подмножества переменных, которые полностью содержатся в одной контрольной точке. Например:
saver_a = tf.train.Saver([a1])
saver_b = tf.train.Saver([b1])
saver_a.restore(session, ckptA_location)
saver_b.restore(session, ckptB_location)
В зависимости от того, как создается ваш код, если у вас есть указатели на tf.Variable
объекты с именем a1
и b1
в локальной области, вы можете здесь остановиться.
С другой стороны, если переменные a1
и b1
определены в отдельных файлах, вам может понадобиться сделать что-то творческое для получения указателей на эти переменные. Хотя это и не идеально, обычно люди используют общий префикс, например, следующим образом (при условии, что имена переменных "a1:0"
и "b1:0"
соответственно):
saver_a = tf.train.Saver([v for v in tf.all_variables() if v.name == "a1:0"])
saver_b = tf.train.Saver([v for v in tf.all_variables() if v.name == "b1:0"])
Последнее замечание: вам не нужно предпринимать героические усилия, чтобы переменные имели одинаковые имена в и C. Вы можете передать словарь name-to- Variable
в качестве первого аргумента в tf.train.Saver
и, таким образом, переназначить имена в файле контрольной точки на Variable
объекты в вашем коде. Это помогает, если A.py
и B.py
имеют аналогично названные переменные, или если в C.py
вы хотите упорядочить код модели из этих файлов в tf.name_scope()
.