我目前正在玩tensorFlow,甚至认为教程有点简单,当我们尝试输入我们自己的数据时,真正的工作就开始了。
我使用了一个非常基本的动物和背景数据集作曲家。
我创建了3个tfrecords(train / val / test)。 然后我尝试阅读它们并训练一个简单的模型(Alexnet在这里)。 我尝试使用" FLAGS.num_iter"确保我没有超出迭代范围。
这段代码处理给我一个很好的RandomShuffleQueue"元素不足(请求64,当前大小0)"错误。
我试图挖掘网络,但我找不到答案。他们在这里:我们如何解决这个问题?我们如何检查我们的tfrecord是否包含任何错误?我们可以写任何条件来确保我们有足够的元素吗? 如果您对我的代码有任何进一步的问题,我会留下来!
致以最诚挚的问候,
Sub newsub()
Dim currentday As Date
Dim cd As String
currentday = Format(WorskheetFunction.WorkDay(today, -1), dd / mm / aaaa)
cd = currentday
MsgBox cd
End Sub
答案 0 :(得分:2)
不建议使用I / O的队列运行程序API。相反,我建议使用tf.data
API。以下是AlexNet数据输入函数的详细示例,可与Estimator
一起使用:
def input_fn(params):
"""Passes data to the estimator as required."""
batch_size = params["batch_size"]
def parser(serialized_example):
"""Parses a single tf.Example into a 224x224 image and label tensors."""
final_image = None
final_label = None
if FLAGS.preprocessed:
features = tf.parse_single_example(
serialized_example,
features={
"image": tf.FixedLenFeature([], tf.string),
"label": tf.FixedLenFeature([], tf.int64),
})
image = tf.decode_raw(features["image"], tf.float32)
image.set_shape([224 * 224 * 3])
final_label = tf.cast(features["label"], tf.int32)
else:
features = tf.parse_single_example(
serialized_example,
features={
"image/encoded": tf.FixedLenFeature([], tf.string),
"image/class/label": tf.FixedLenFeature([], tf.int64),
})
image = tf.image.decode_jpeg(features["image/encoded"], channels=3)
image = tf.image.resize_images(
image,
size=[224, 224])
final_label = tf.cast(features["image/class/label"], tf.int32)
final_image = (tf.cast(image, tf.float32) * (1. / 255)) - 0.5
return final_image, final_label
file_pattern = os.path.join(FLAGS.data_dir, "train-*")
dataset = tf.data.Dataset.list_files(file_pattern)
if FLAGS.filename_shuffle_buffer_size > 0:
dataset = dataset.shuffle(buffer_size=FLAGS.filename_shuffle_buffer_size)
dataset = dataset.repeat()
def prefetch_map_fn(filename):
dataset = tf.data.TFRecordDataset(
filename, buffer_size=FLAGS.dataset_reader_buffer_size)
if FLAGS.prefetch_size is None:
dataset = dataset.prefetch(batch_size)
else:
if FLAGS.prefetch_size > 0:
dataset = dataset.prefetch(FLAGS.prefetch_size)
return dataset
if FLAGS.use_sloppy_interleave:
dataset = dataset.apply(
tf.contrib.data.sloppy_interleave(
prefetch_map_fn, cycle_length=FLAGS.cycle_length))
else:
dataset = dataset.interleave(
prefetch_map_fn, cycle_length=FLAGS.cycle_length)
if FLAGS.element_shuffle_buffer_size > 0:
dataset = dataset.shuffle(buffer_size=FLAGS.element_shuffle_buffer_size)
dataset = dataset.map(
parser,
num_parallel_calls=FLAGS.num_parallel_calls).prefetch(batch_size)
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)
images, labels = dataset.make_one_shot_iterator().get_next()
return (
tf.reshape(images, [batch_size, 224, 224, 3]),
tf.reshape(labels, [batch_size])
)
您可以在此API中详细了解tf.data
programmer's guide。
答案 1 :(得分:0)
我实际上弄清楚了为什么我会收到这个错误。 事实上,我发送的一些图像大小不是64 * 64。因此,他们无法重塑为1 64 64 3.我不知道为什么这里没有错误,我只能在洗牌图像上得到它。
我在重塑之前调整了一张图片,现在一切都很好了!
另外,感谢jsimsa我会注意到以后的事情!