2017-02-04 5 views
2

Я пытаюсь выполнить две задачи (А и В), которые имеют входы inp_A и inp_B и соответствующие выходы out_A, out_B.двухэтапного обучения для различных зависимых графиков в tensorflow

Задача A должна быть достигнута сначала графиком g_A. После завершения задачи A я хочу использовать весы g_A в новый график g_B, который является более крупным графиком (надмножество g_A).

Я не уверен, как это сделать в тензорном потоке.

ответ

1

Я использую этот вид разделения для подготовки и проверки целей, когда я создаю специальные входные и выходные трубопроводы, но разделяю зарождение часть графика, хотя я использую тот же граф (по состоянию на 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(), хотя я сомневаюсь.