2017-12-08 1 views
0

私は事前にモデルを読み込み、このモデルでトレーニングを続けます。
モデル(pretrain.py)を保存するための標準的なコードスニペット:テンソルフローモデルをロードしてトレーニングを続ける方法

tf.reset_default_graph() 

# tf Graph input 
X = tf.placeholder("float", [None, n_input]) 
Y = tf.placeholder("float", [None, n_classes]) 

mlp_layer_name = ['h1', 'b1', 'h2', 'b2', 'h3', 'b3', 'w_o', 'b_o'] 
logits = multilayer_perceptron(X, n_input, n_classes, mlp_layer_name) 

loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y), name='loss_op') 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op, name='train_op') 

saver = tf.train.Saver() 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    # Training cycle 
    for epoch in range(training_epochs): 
     avg_cost = 0. 

     # Loop over all batches 
     for i in range(total_batch): 
      batch_x, batch_y = next(train_generator) 

      # Run optimization op (backprop) and cost op (to get loss value) 
      _, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, 
                  Y: batch_y}) 
      # Compute average loss 
      avg_cost += c/total_batch 

     print("Epoch: {:3d}, cost = {:.6f}".format(epoch+1, avg_cost)) 

    print("Optimization Finished!") 
    saver.save(sess, 'model') 
    print("Model saved") 

は今pretrainedモデルをロードし、(continue.py)それでトレーニングを続けます。

# tf Graph input 
X = tf.placeholder("float", [None, n_input]) 
Y = tf.placeholder("float", [None, n_classes]) 
mlp_layer_name = ['h1', 'b1', 'h2', 'b2', 'h3', 'b3', 'w_o', 'b_o'] 
logits = multilayer_perceptron(X, n_input, n_classes, mlp_layer_name) 
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y), name='loss_op') 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op, name='train_op') 

with tf.Session() as sess: 
    saver = tf.train.import_meta_graph('model.meta') 
    saver.restore(sess, tf.train.latest_checkpoint('./')) # search for checkpoint file 

    graph = tf.get_default_graph() 

    for epoch in range(training_epochs): 
     avg_cost = 0. 

     # Loop over all batches 
     for i in range(total_batch): 
      batch_x, batch_y = next(train_generator) 

      # Run optimization op (backprop) and cost op (to get loss value) 
      _, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, 
                  Y: batch_y}) 
      # Compute average loss 
      avg_cost += c/total_batch 

     print("Epoch: {:3d}, cost = {:.6f}".format(epoch+1, avg_cost)) 

しかし、それは次のようなエラーが表示されます。ここでは

tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value h1 [[Node: h1/read = IdentityT=DT_FLOAT, _class=["loc:@h1"], _device="/job:localhost/replica:0/task:0/cpu:0"]]

は私の質問は以下のとおりです。
1.多くのtensorflowのチュートリアルでは、それは重みとバイアスをロードするためにget_tensor_by_name()を使用しています。ここでは、私は体重と偏見を得たくありません。私はただモデルをロードし、それを使ってトレーニングを続けたいだけです。
2.テンソルが初期化されていないことがエラーによって示されました。しかし、私はsaver.restore(sess, tf.train.latest_checkpoint('./'))が重みと偏りをうまく読み込んでいるはずだと思います。
ここにmultilayer_perceptron()は私のクエストインの説明に役立ちます。

def multilayer_perceptron(x, n_input, n_classes, name): 
    n_hidden_1 = 512 
    n_hidden_2 = 256 
    n_hidden_3 = 128 
    # Store layers weight & bias 
    weights = { 
     'h1' : tf.get_variable(name[0], initializer=tf.random_normal([n_input, n_hidden_1])), 
     'h2' : tf.get_variable(name[2], initializer=tf.random_normal([n_hidden_1, n_hidden_2])), 
     'h3' : tf.get_variable(name[4], initializer=tf.random_normal([n_hidden_2, n_hidden_3])), 
     'w_o': tf.get_variable(name[6], initializer=tf.random_normal([n_hidden_3, n_classes])) 
    } 
    biases = { 
     'b1' : tf.get_variable(name[1], initializer=tf.random_normal([n_hidden_1])), 
     'b2' : tf.get_variable(name[3], initializer=tf.random_normal([n_hidden_2])), 
     'b3' : tf.get_variable(name[5], initializer=tf.random_normal([n_hidden_3])), 
     'b_o': tf.get_variable(name[7], initializer=tf.random_normal([n_classes])) 
    } 

    layer_1 = tf.nn.relu(tf.add(tf.matmul(x  , weights['h1']), biases['b1'])) 
    layer_1 = tf.layers.dropout(layer_1, rate=0.5, training=True) 
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])) 
    layer_2 = tf.layers.dropout(layer_2, rate=0.3, training=True) 
    layer_3 = tf.nn.relu(tf.add(tf.matmul(layer_2, weights['h3']), biases['b3'])) 
    layer_3 = tf.layers.dropout(layer_3, rate=0.1, training=True) 
    out_layer = tf.matmul(layer_3, weights['w_o']) + biases['b_o'] 
    return out_layer 

答えて

0

私は答えを見つけたと思います。重要な点は、既にsaver.restore(sess, tf.train.latest_checkpoint('./'))を使用している場合は、tf.train.import_meta_graph()に電話する必要がないことです。ここに私のコードです。

# tf Graph input 
X = tf.placeholder("float", [None, n_input]) 
Y = tf.placeholder("float", [None, n_classes]) 
mlp_layer_name = ['h1', 'b1', 'h2', 'b2', 'h3', 'b3', 'w_o', 'b_o'] 
logits = multilayer_perceptron(X, n_input, n_classes, mlp_layer_name) 
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y), name='loss_op') 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) 
train_op = optimizer.minimize(loss_op, name='train_op') 

with tf.Session() as sess: 
    saver = tf.train.Saver() 
    saver.restore(sess, tf.train.latest_checkpoint('./')) # search for checkpoint file 

    graph = tf.get_default_graph() 

    for epoch in range(training_epochs): 
     avg_cost = 0. 

     # Loop over all batches 
     for i in range(total_batch): 
      batch_x, batch_y = next(train_generator) 

      # Run optimization op (backprop) and cost op (to get loss value) 
      _, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, 
                  Y: batch_y}) 
      # Compute average loss 
      avg_cost += c/total_batch 

     print("Epoch: {:3d}, cost = {:.6f}".format(epoch+1, avg_cost)) 
0

あなたにもcontinue.pyで変数を初期化する必要があります。

with tf.Session() as sess: 
    saver = tf.train.Saver() 
    saver = tf.train.import_meta_graph('model.meta') 
    saver.restore(sess, tf.train.latest_checkpoint('./')) # search for checkpoint file 

    graph = tf.get_default_graph() 

+0

いいえ、私は 'sess.run(tf.global_variables_initializer())'を追加できません。すべての変数を再初期化します。 –

関連する問題