Tensor flow和RandomShuffleQueue"元素不足(请求64,当前大小0)"

时间:2017-12-13 15:13:09

标签: python tensorflow deep-learning training-data

我目前正在玩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

2 个答案:

答案 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我会注意到以后的事情!