0

私は png ファイルを使って mnist のチュートリアルを実行しようとしてきました。

コードの要点はここにありますが、コードの機能と問題が発生している場所について説明します。

私は、slice_input_producer に与えることができるファイル名を生成する関数を持っています。

def gen_file_names_and_labels(rootDir):

"""goes through the directory structure and extracts images and labels from each image."""
file_names = []
labels = []
for file_name in glob.glob(rootDir+'/*/*'):

    file_type_removed = file_name.split('.')[0]
    split_by_dir = file_type_removed.split('/')
    file_names.append(file_name)
    labels.append(int(split_by_dir[2])) #getting the folder it's in, turning into an int, and using as label
return file_names, labels

これは期待どおりに動作します。

本文では、トレーニングとテストのためにこの関数を実行し、それらをテンソルに変換して、それらのテンソルを slice_input_producer に渡します。

sess = tf.InteractiveSession()

#THERE A PIPELINE FOR BOTH TESTING AND TRAINING. THEY COME IN PAIRS    
image_list_train,   label_list_train    = gen_file_names_and_labels('mnist_png/training')
image_list_test,    label_list_test     = gen_file_names_and_labels('mnist_png/testing')

images_train    = tf.convert_to_tensor(image_list_train,dtype=tf.string)    
images_test     = tf.convert_to_tensor(image_list_test,dtype=tf.string)    

#remember that these aren't the actual images, just file_names
labels_train    = tf.convert_to_tensor(label_list_train,dtype=tf.int32)
labels_test     = tf.convert_to_tensor(label_list_test,dtype=tf.int32)

input_queue_train   = tf.train.slice_input_producer([images_train   ,labels_train]  , shuffle=True)
input_queue_test    = tf.train.slice_input_producer([images_train   ,labels_train]  , shuffle=True)

この部分も正常に動作します。

これは物事が奇妙になるところです。

asdf = tf.placeholder(tf.int32)
input_queue = tf.cond( asdf>0, lambda: input_queue_train, lambda: input_queue_test)
# input_queue = input_queue_test
image, label = read_images_from_disk(input_queue)
image_reshaped = tf.reshape( image, [28,28,1])
image_batch, label_batch = tf.train.batch([image_reshaped,label],batch_size=50)

変数 asdf は、悪いニュースの担い手だったので、怒って名前が変更されました。ここでの計画は、トレーニングとテストに異なるキューを使用することでした。2 つを切り替えるためのアドホック ブール値として機能する単一の int を feed_dict することを計画しました。

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
sess.run(tf.initialize_all_variables())
print(label_batch.eval(feed_dict={asdf:0,keep_prob:1.0}))
for i in range(500):
    # batch = mnist.train.next_batch(50)

    if i%20 ==0:
        train_accuracy = accuracy.eval(feed_dict={keep_prob:1.0,asdf:0})
        print("step %d, training accuracy %g"%(i, train_accuracy))

    train_step.run(feed_dict={keep_prob:0.9,asdf:0})

ただし、実行すると、「dtype int32を使用してプレースホルダーテンソル 'Placeholder'の値をフィードする必要があります」というエラーが表示されます。これは、フィードしているため奇妙です。

"print(foo.eval(feed_dict={asdf:0,keep_prob:1.0))" を使用すると、いくつかの興味深い現象に気付くことができました。"image, label" と宣言された個々の変数を評価すると、切り替えが正常に機能するようです。 「read_images_from_disk(input_queue)」から出てくる

ただし、直後のバッチ処理を評価しようとすると、前述のエラーが発生します。

これを実現するためにバッチ処理で何が間違っていますか? このテスト セットとトレーニング セットの切り替えを行うためのより良い方法はありますか? 宇宙とすべての生命の意味は何ですか?StackOverflow を頼りにしています。あなたは私の唯一の希望です。

4

1 に答える 1

1

「テスト セットとトレーニング セットの切り替えを行うためのより良い方法はありますか?」という質問への回答として、はい、あります。tf.cond()各ステップで両方の関数を評価するため (こちらを参照)、両方のキューに不必要にアクセスします。この SO の議論と関連するリンクは、いくつかのより良い代替手段を提供します。

  • tf.placeholder_with_default()テストデータに使用
  • 使用するmake_template
于 2016-09-30T13:52:23.643 に答える