私は 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 を頼りにしています。あなたは私の唯一の希望です。