2017-08-06 7 views
0

Tensorflowモデルを保存して再利用しようとしています。Tensorflowで保存されたモデルをロードすると、非常に高いコスト値が得られます

この問題をはっきりと理解するために、10個の要素で構成されるバイナリデータセットを作成し、この10個の要素に対して繰り返しトレーニングを実行しますが、100回の繰り返しごとにモデルを保存します。 その後、同じセットでテストを実行します。理想的には、モデルが保存されるまでに同じコストを試すことが期待されます。 は、しかし、おそらく私が何かを欠場し、訓練されたモデルをロードすると予想されるコスト値与えるものではありません:私は300番目の反復中に保存されたモデルを読み込む場合は今

Step 0, cost 1.10902 
Step 100, cost 0.83170 
Step 200, cost 0.00003 
Step 300, cost 0.00000   

def model(X, w1, w2, w3, w4, wo, p_keep_conv, p_keep_hidden): 
    l1 = tf.nn.relu(tf.nn.conv2d(X, w1, strides=[1, 1, 1, 1], padding='SAME')) 
    l1 = tf.nn.max_pool(l1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 
    l1 = tf.nn.dropout(l1, p_keep_conv) 
    # ... other layer def.s 
    l4 = tf.nn.relu(tf.matmul(l3, w4)) 
    l4 = tf.nn.dropout(l4, p_keep_hidden)  
    return tf.matmul(l4, wo, name="pyx") 

X = tf.placeholder("float", [None, size1, size2, size3], name="X") 
Y = tf.placeholder("float", [None, 1], name="Y") 
py_x = model(X, wo, p_keep_conv, p_keep_hidden) 
cost = tf.reduce_mean(tf.nn.weighted_cross_entropy_with_logits(logits=py_x, targets=Y, pos_weight=POS_WEIGHT)) 
train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost) 

with tf.Session() as sess: 
    batch_x, batch_y = read_file('train.dat', 10) 
    sess.run(tf.global_variables_initializer()) 
    saver = tf.train.Saver(tf.global_variables()) 

    for step in range(NUM_TRAIN_BATCHES): 
     x, y = sess.run([batch_x, batch_y]) 
     _, costval = sess.run([train_op, cost], feed_dict={X: x, Y: y, p_keep_conv: 0.8, p_keep_hidden: 0.5}) 
     if step % 100 == 0 
      print("Step %d, cost %1.5f" % (step, cost_value)) 
      saver.save(sess, './train.model', global_step=step) 

上記のコードを印刷下記を

model_no = 300 
with tf.Session() as sess: 
    saver = tf.train.import_meta_graph('./train.model-%d.meta' % (model_no)) 
    saver.restore(sess, tf.train.latest_checkpoint('./')) 
    batch_x, batch_y = read_file('train.dat', 10) 
    sess.run(tf.global_variables_initializer()) 
    x, y = sess.run([batch_x, batch_y]) 
    cost_value = sess.run(cost, feed_dict={"X:0": x, "Y:0": y, p_keep_conv: 0.8, p_keep_hidden: 0.5}) 
    print("cost %1.5f" % (cost_value)) 

そして、上記プリント:

と同じデータに適用してみてください3210
cost loss 1.10895 

これは、モデルトレーニングの最初の反復に非常に近いです。それはどのように支援し、どのようなチェックポイントが唯一のパスが含まれている場合saver.restore(sess, tf.train.latest_checkpoint('./'))を呼び出すの背後にある考え方だん

model_checkpoint_path: "train.model-300" 
all_model_checkpoint_paths: "train.model-0" 
all_model_checkpoint_paths: "train.model-100" 
all_model_checkpoint_paths: "train.model-200" 
all_model_checkpoint_paths: "train.model-300" 

また、私は周りに私の頭を取得することはできません別のものにのみ以下含まれているチェックポイントファイルであり、モデルファイルと私は明示的に特定のモデルを読み込みますか?

答えて

0

あなたの問題はここにある:

with tf.Session() as sess: 
    saver = tf.train.import_meta_graph('./train.model-%d.meta' % (model_no)) 
    saver.restore(sess, tf.train.latest_checkpoint('./')) 
    batch_x, batch_y = read_file('train.dat', 10) 
    sess.run(tf.global_variables_initializer()) # <------ 

あなたは再びランダムな重みを持つロードされたウェイトを上書きしていることを意味すべての変数を、再初期化されています。最初に何かを読み込んだり、ゼロから始めたり、最初に初期化してから読み込んだりしてください。または、あなたのために簿記をしているTFの上司のようなものを使用してください。

+0

テストでは、通常、すべてのドロップアウトレイヤーの保持確率を1に設定したいと考えています。 – aseipel

+0

OK、私はsaver = ..の前にsess.run(tf.global_variables_initializer())を移動しました。コストは依然として1.10919 –

+0

トレーニング中の無作為抽出の欠点を除いて、他には明白なことはありません。あなたのデータが適切にランダム化されていますか? – etarion

関連する問題