我一直在尝试使用png文件进行mnist教程,并且已经将大多数事情发展到了有意义的地步。
代码的要点是here但是我要介绍它的作用以及问题发生的地方。
我有一个生成文件名的函数,我可以给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在愤怒中被重命名,因为它是坏消息的承载者。 看这里的计划是使用不同的队列进行培训和测试。 我计划在feed_dict中使用一个int作为ad-hoc布尔值,用于在两者之间进行切换。
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" 这很奇怪,因为我正在喂它。
使用" print(foo.eval(feed_dict = {asdf:0,keep_prob:1.0))我能够注意到一些有趣的现象。当我评估声明的各个变量" image,label"时,似乎切换工作正常。来自" read_images_from_disk(input_queue)"
但是,如果我尝试评估之后的批处理,我会收到上述错误。
我为实现这一目标而进行批处理有什么问题?有没有更好的方法在测试和训练集之间进行切换?宇宙生命和一切生命的意义是什么?我指望你StackOverflow。你是我唯一的希望。
答案 0 :(得分:1)
在回答你的问题时,"有没有更好的方法在测试和训练集之间切换?"是的。 tf.cond()
评估每个步骤的两个函数(请参阅here),因此不必要地访问这两个队列。 This SO discussion以及相关链接提供了几个更好的选择:
tf.placeholder_with_default()
作为测试数据make_template