2

AE を生成するコード

x = tf.placeholder(tf.float32, [None, 784])
keep_prob = tf.placeholder("float")

for step in range(2000):
    batch_xs, batch_ys = mnist.train.next_batch(BATCH_SIZE)
    sess.run(train_step, feed_dict={x: batch_xs, keep_prob: (1 - DROP_OUT_RATE) }) # feed_dict 
    if step % 10 == 0:
        summary_op = tf.merge_all_summaries()
        summary_str = sess.run(summary_op, feed_dict={x: batch_xs, keep_prob: 1.0})
        summary_writer.add_summary(summary_str, step)
    if step % 100 == 0:
        print(loss,eval(session=sess, feed_dict={x: batch_xs, keep_prob: 1.0}))

エラーメッセージとして得たもの

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float
     [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

ログに

 File "<ipython-input-9-c70541b6146b>", line 18, in <module>
    x = tf.placeholder(tf.float32, [None, 784])

私は何をする必要があるのか​​ わかりません。コードが有効であるように私には思えます。

4

1 に答える 1

1

ここでの問題は、ほぼ間違いなく への呼び出しtf.merge_all_summaries()であり、対話型 (IPython など) の使用法ではうまく機能しません。おそらく直感に反して、同じグラフで作成されたすべてのtf.merge_all_summaries()集計に依存する新しい操作をグラフに追加します。IPython を使用している場合、同じセルを以前に実行した場合でも、作成したすべての集計がグラフに記憶されます。これにより、セルの以前の実行で作成された に依存するテンソルが作成される可能性があります。tf.merge_all_summaries()tf.placeholder()

別の回答で説明したように、これには主な回避策が 2 つあります。

  1. を使用して、計算する集計を明示的にマージしますtf.merge_summary([summary_1, summary_2, summary_3])

  2. 明示的なブロックでグラフを作成します。with tf.Graph().as_default():これにより、そのブロック内で作成された集計のみがマージに含まれるようになります。

また、実行するたびに新しい op がグラフにtf.merge_all_summaries() 追加されることにも注意してください。これは、トレーニング ループにわずかなメモリ リークがあり、同じ op の 200 個のコピーがグラフに追加されることを意味します。これを回避するにはtf.merge_all_summaries()、トレーニング ループの外で呼び出し、結果のテンソルをキャッシュする必要があります。その後、トレーニング ループ内でそのテンソルを使用して、同じ結果を得ることができます。

于 2016-02-11T17:19:21.020 に答える