Я использую этот вид разделения для подготовки и проверки целей, когда я создаю специальные входные и выходные трубопроводы, но разделяю зарождение часть графика, хотя я использую тот же граф (по состоянию на tf.Graph()
), но разные (не связанные) подграфы внутри него.
В одном tf.Graph()
общая концепция variable sharing которой можно достичь с помощью tf.variable_scope()
группировать переменные концепции и их создания и refetching их с помощью tf.get_variable()
(вместо использования tf.Variable()
непосредственно). В первый раз, когда он называется, он будет создавать переменные, во второй раз он будет их повторно использовать, если имя переменной останется прежним.
Однако я нашел намного проще использовать tf.make_template()
, который будет обертывать функцию, которая полностью создает подграф, и каждый вызов создает новый экземпляр графа при совместном использовании всех его переменных. Пример документации, что является
def my_op(x, scalar_name):
var1 = tf.get_variable(scalar_name,
shape=[],
initializer=tf.constant_initializer(1))
return x * var1
create_instance = tf.make_template('scale_by_y', my_op, scalar_name='y')
z = create_instance(input1)
w = create_instance(input2)
Здесь каждый вызов create_instance
создаст новый узел под названием scale_by_y
в графе, который выполняет операцию, определенную my_op()
, разделяя ее внутренние переменные. (В примере параметр scalar_name
статически связан со значением y
, что приводит к созданию (и повторному использованию) переменной scale_by_y/y
. Я считаю, что это более запутанно, чем полезно.) Он не заботится о родительском таким образом,
with tf.variable_scope('training'):
z1 = create_instance(input1)
with tf.variable_scope('validation'):
z2 = create_instance(input2)
Работы. Он также может работать или не работать в разных случаях tf.Graph()
, хотя я сомневаюсь.