Python Tensorflow代码中断

Python Tensorflow代码中断,python,python-2.7,tensorflow,Python,Python 2.7,Tensorflow,我正在修改cifar multi-GPU tensorflow代码以读取Imagenet数据集 我所做的编辑是: Cifar10.py: 1) 更改了tf.app.flags.DEFINE_字符串('data_dir',…) 2) 删除了data_dir=os.path.join(FLAGS.data_dir,'cifar-10-batches-bin'中的后面部分) 3) 从下载和摘录()中删除了下载部分 cifar10\u input.py: 1) 图像大小=227 2) result.he

我正在修改cifar multi-GPU tensorflow代码以读取Imagenet数据集

我所做的编辑是:

Cifar10.py:

1) 更改了tf.app.flags.DEFINE_字符串('data_dir',…)

2) 删除了data_dir=os.path.join(FLAGS.data_dir,'cifar-10-batches-bin'中的后面部分)

3) 从下载和摘录()中删除了下载部分

cifar10\u input.py:

1) 图像大小=227

2) result.height=256,result.width=256

3) 改变

但这是一个丑陋的错误: tensorflow.python.framework.errors.OutOfRangeError:RandomShuffleQueue“\u 1\u tower\u 0/shuffle\u batch/Randomy\u shuffle\u queue”已关闭,元素不足(请求的128个,当前大小为0)

[[Node:tower\u 0/shuffle\u batch=QueuedQueueMany[component\u types=[DT\u FLOAT,DT\u INT32],timeout\u ms=-1,\u device=“/job:localhost/replica:0/task:0/cpu:0”](tower\u 0/shuffle\u batch/random\u shuffle\u queue,tower\u 0/shuffle\u batch/n/\u 775)]]

[[Node:tower\u 1/shuffle\u batch/n/\u 664=\u HostSendT=DT\u INT32,client\u terminated=false,recv\u device=“/job:localhost/replica:0/cpu:0”,send\u device=“/job:localhost/replica:0/task:0/gpu:1”,send\u device\u化身=1,tensor\u name=“edge\u 170\u tower\u\u/shuffle\u batch/n”,\u device=“/job:localhost/replica:0/task:0/gpu:1”] 由op u“塔楼0/洗牌批次”引起,定义为:

文件“lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10_multi-gpu_train.py”,第224行,在

tf.app.run()
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/platform/default/_app.py”,第30行,运行中

sys.exit(main(sys.argv))
文件“lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10_multi-gpu_train.py”,主目录第222行

train()
文件“lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10_multi-gpu_train.py”,第150行,列车中

loss = tower_loss(scope)
文件“lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10_multi-gpu_train.py”,第65行,塔内

images, labels = cifar10.distorted_inputs()
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10.py”,第119行,输入失真

batch_size=FLAGS.batch_size)
min_queue_examples, batch_size)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10_input.py”,第153行,输入失真

batch_size=FLAGS.batch_size)
min_queue_examples, batch_size)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/models/image/cifar10/cifar10\u input.py”,第104行,在“生成图像”和“标签”批处理中

min_after_dequeue=min_queue_examples)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/training/input.py”,第496行,在shuffle_批处理中 return queue.dequeue\u many(批大小,name=name)

文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/ops/data\u flow\u ops.py”,第287行,在队列中

self._queue_ref, n, self._dtypes, name=name)
timeout_ms=timeout_ms, name=name)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/ops/gen_data_flow_ops.py”,第319行,在队列中

self._queue_ref, n, self._dtypes, name=name)
timeout_ms=timeout_ms, name=name)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/ops/op_def_library.py”,第664行,在apply_op op_def=op_def)

文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/framework/ops.py”,第1834行,在create_op中

original_op=self._default_original_op, op_def=op_def)
文件“/home/saoni.m/tensorflow/lib/python2.7/site packages/tensorflow/python/framework/ops.py”,第1043行,在init

self._traceback = _extract_stack()
当我追溯到调用shuffle_batch()的那一行时:

images, label_batch = tf.train.shuffle_batch(
      [image, label],
      batch_size=batch_size,
      num_threads=num_preprocess_threads,
      capacity=min_queue_examples + 3 * batch_size,
      min_after_dequeue=min_queue_examples)
传递给它的值是:
批量大小128,线程数16,容量20384,20000次后的最小值看起来您没有从读卡器获得任何数据输入

你改变了:

[os.path.join(data_dir, i) for i in os.listdir(data_dir)]
数据_dir/中实际包含什么?(您确定正在使用正确的目录名吗,等等?)

我的建议是在执行开始时打印文件名,这在tensorflow中没有任何作用,只是python,所以您会得到一个即时的易于阅读的答案。如果它看起来有效,我们将从那里开始工作。:)


第二个问题是,您所做的更改不足以开始在imagenet上工作。
read_cifar10
函数专门用于cifar输入格式,但ImageNet数据(大部分)为JPEG格式,有一个单独的文件指定标签。您可以使用
tf.image.decode\u jpeg对jpeg进行解码,但是您还需要将synset标签合并到中。

我遇到了类似的问题,我尝试更改python列表,如 [os.path.join(data\u dir,i)for i in os.listdir(data\u dir)] 到 files=tf.train.match_filenames_一次(“/path/to/data.tfrecords-*”), filequeue=tf.train.input\u string\u input\u producer(文件)。
它对我有用,你可以试试。

谢谢你的回答。关于第一个问题,我已经打印了
len(文件名)
,它有1300个文件(imagenet的其中一个文件夹是我正在测试的。我在第二个文件夹上,但它看起来很复杂。你能再详细说明一下吗?你已经获取了,例如,NXXXXXX的内容,这是data_dir?内容都是NXXXXXX YYYY-.JPG,对吗?对,这就是评论2的内容:cifar10示例中的管道预期输入文件为cifar10二进制格式。根据,cifar文件是固定长度的二进制记录文件,每个固定长度记录中都包含元数据和图像数据。ImageNet数据的表示方式完全不同-单个JPEG文件和单独的元数据。