2016-05-30 2 views
0

Я обучил модель LSTM в TensowFlow и сохранил ее с помощью класса tf.train.Saver в соответствии с instructions on saving and loading variables. Теперь я хочу загрузить две копии этой модели и создать более крупный RNN, который их объединяет, для дальнейшего обучения. К сожалению, насколько я вижу, нет возможности загружать переменные из одной области в другую. Есть какой-либо способ сделать это?Загрузите две копии модели в TensorFlow

В качестве простого примера предположим, что у меня была простая модель:

with tf.variable_scope("model", reuse=None, initializer=initializer): 
     W = tf.get_variable("W", [input_size, output_size]) 
     b = tf.get_variable("b", [input_size]) 

     inputs = tf.placeholder(tf.float32, [batch_size, input_size]  
     outputs = tf.matmul(inputs, W) + b 

И я тренировал эту модель по некоторым данным и сохраняются переменные с помощью:

saver = tf.train.Saver() 
    saved.save(session, "model") 

Позже я хотел создать комбинированная модель:

with tf.variable_scope("combinedl", reuse=None, initializer=initializer): 
    with tf.variable_scope("model0" , reuse=None, initializer=initializer): 
     W0 = tf.get_variable("W", [input_size, output_size]) 
     b0 = tf.get_variable("b", [input_size]) 

     inputs0 = tf.placeholder(tf.float32, [batch_size, input_size]  
     outputs0 = tf.matmul(inputs, W0) + b0 

    with tf.variable_scope("model1" , reuse=None, initializer=initializer): 
     W1 = tf.get_variable("W", [input_size, output_size]) 
     b1 = tf.get_variable("b", [input_size]) 

     inputs1 = tf.placeholder(tf.float32, [batch_size, input_size]  
     outputs1 = tf.matmul(inputs, W1) + b1 

    output = outputs1 + outputs2 

Можно ли загрузить обученные значения для W и b в t он исходная модель в переменные W0, b0 и W1, b1? Можно ли было бы самостоятельно обучать эти новые переменные?

ответ

0

Одним из возможных ответов, по-видимому, было бы перезагрузить исходную модель, а затем присвоить значениям W0, b0, W1, b1 исходным W и b.

with tf.Session() as session: 
    session.run(W0.assign(W)) 
    session.run(b0.assign(b)) 
    session.run(W1.assign(W)) 
    session.run(b1.assign(b)) 

Однако для этого требуется просмотр внутри модели и знание всех соответствующих переменных, которые необходимо скопировать.

Изменить: Hacky способ скопировать все переменные, не зная внутренние детали модели, при условии, что они имеют те же имена:

with tf.variable_scope("old_model", reuse=None, initializer=initializer) as scope: 
    old_model = Model() 
    saver = tf.train.Saver() 
    saver.restore(session, "saved_model") 

    # create a dictionary of variables in this scope indexed by name 
    old_vars = {v.name.split('/')[-1] : v 
       for v in tf.trainable_variables() 
       if v.name.startswith(scope.name + "/")} 

with tf.variable_scope("new_model", reuse=None, initializer=initializer) as scope: 
    new_model = Model() 
    assignments = [vNew.assign(old_vars[vNew.name.split('/')]) 
        for v in tf.trainable_variables() 
        if v.name.startswith(scope.name + "/")] 
Смежные вопросы