Tensorflow:如何使用来自 cifar10 的 tf.train.batch 绘制小批量?

Posted

技术标签:

【中文标题】Tensorflow:如何使用来自 cifar10 的 tf.train.batch 绘制小批量?【英文标题】:Tensorflow: how to draw mini-batch using tf.train.batch from cifar10? 【发布时间】:2017-08-30 10:03:38 【问题描述】:

我正在尝试从 cifar10 二进制文件中提取小批量。 在实现下面显示的代码(参见 [source code])时,机器(python 3.6)不断显示消息(参见 [console])并停止。

谁能告诉我我的源代码有什么问题?

附:我是张量流的新手..

[源代码]------------------------------------------- ------------------ 将张量流导入为 tf 将 numpy 导入为 np 导入操作系统 将 matplotlib.pyplot 导入为 plt

def _get_image_and_label():

# directory where binary files are stored
data_dir = '/tmp/cifar10_data/cifar-10-batches-bin'

# Step1) make filename Queue
filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i) for i in range(1, 6)]
filename_queue = tf.train.string_input_producer(filenames)

# Step2) read files
label_bytes = 1  # 2 for CIFAR-100
height = 32
width = 32
depth = 3
image_bytes = height * width * depth
record_bytes = label_bytes + image_bytes

reader = tf.FixedLengthRecordReader(record_bytes=record_bytes)
key, value = reader.read(filename_queue)

# Step3) decode the file in a unit of 1 byte
record_bytes = tf.decode_raw(value, tf.uint8)

# The first bytes represent the label, which we convert from uint8->int32.
label = tf.cast(tf.strided_slice(record_bytes, [0], [label_bytes]), tf.int32)

# The remaining bytes after the label represent the image, which we reshape from [depth * height * width] to [depth, height, width].
depth_major = tf.reshape(tf.strided_slice(record_bytes, [label_bytes], [label_bytes + image_bytes]),
                         [depth, height, width])

# Convert from [depth, height, width] to [height, width, depth].
uint8image = tf.transpose(depth_major, [1, 2, 0])

# set shape ( image: tf.float32, label: tf.int32 )
image = tf.cast(uint8image, tf.float32)
image.set_shape([height, width, 3])
label.set_shape([1])

# collect batch from the files
# train_x_batch, train_y_batch = tf.train.batch([image, label], batch_size=1)
# return train_x_batch, train_y_batch

return image, label

使用 tf.Session() 作为 sess: sess.run(tf.global_variables_initializer())

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

image, label = _get_image_and_label()

for i in range(10):
    image_batch, lable_batch = tf.train.batch([image, label], batch_size=1)
    image_batch_uint8 = tf.cast(image_batch, tf.uint8)
    final_image = sess.run(image_batch_uint8)
    imgplot = plt.imshow(final_image[0])

coord.request_stop()
coord.join(threads)

sess.close()

[控制台]-------------------------------------------------------- ---------------------/home/dooseop/anaconda3/bin/python /home/dooseop/pycharm-community-2016.3.3/helpers/pydev/pydevd。 py --multiproc --qt-support --client 127.0.0.1 --port 40623 --file /home/dooseop/PycharmProjects/Tensorflow/CIFAR10_main.py 警告:未找到使用 cython 的调试器加速。运行 '"/home/dooseop/anaconda3/bin/python" "/home/dooseop/pycharm-community-2016.3.3/helpers/pydev/setup_cython.py" build_ext --inplace' 进行构建。 连接到 pydev 调试器(内部版本 163.15188.4) pydev 调试器:进程 10992 正在连接

I tensorflow/stream_executor/dso_loader.cc:135] 本地成功打开CUDA库libcublas.so.8.0 我tensorflow/stream_executor/dso_loader.cc:135]本地成功打开CUDA库libcudnn.so.5 我tensorflow/stream_executor/dso_loader.cc:135]本地成功打开CUDA库libcufft.so.8.0 我tensorflow/stream_executor/dso_loader.cc:135]本地成功打开CUDA库libcuda.so.1 我tensorflow/stream_executor/dso_loader.cc:135]本地成功打开CUDA库libcurand.so.8.0 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE3 指令,但这些指令可在您的机器上使用,并且可以加快 CPU 计算速度。 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.1 指令,但这些可在您的机器上使用,并且可以加快 CPU 计算速度。 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.2 指令,但这些可在您的机器上使用,并且可以加快 CPU 计算速度。 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 AVX 指令,但这些可在您的机器上使用,并且可以加快 CPU 计算速度。 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 AVX2 指令,但这些指令可在您的机器上使用,并且可以加快 CPU 计算速度。 W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 FMA 指令,但这些可在您的机器上使用,并且可以加快 CPU 计算速度。 我 tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] 从 SysFS 读取的成功 NUMA 节点为负值(-1),但必须至少有一个 NUMA 节点,因此返回 NUMA 节点为零 我 tensorflow/core/common_runtime/gpu/gpu_device.cc:885] 找到具有属性的设备 0: 名称:GeForce GTX 1070 主要:6 次要:1 memoryClockRate (GHz) 1.683 pciBusID 0000:01:00.0 总内存:7.92GiB 可用内存:7.17GiB 我 tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 我 tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0: Y I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] 创建 TensorFlow 设备 (/gpu:0) -> (设备:0,名称:GeForce GTX 1070,pci 总线 ID:0000:01:00.0)

进程以退出代码 137 结束(被信号 9:SIGKILL 中断)

【问题讨论】:

其中大部分是警告说一些编译器优化没有打开。不确定是什么触发了程序退出。 给张耀。消息“进程以退出代码完成......”是由我的“按下调试停止按钮”引起的。对不起,我错了!反正问题解决了:) 【参考方案1】:

只有在有人明确终止程序时才会发生 Sigkill。这里的问题是在创建队列运行器之前调用 start_queue_runners(因为它们是由 tf.train.batch 创建的)。为了获得更好的性能,构建图一次并在循环中运行它,如下所示:

image, label = _get_image_and_label()
image_batch, lable_batch = tf.train.batch([image, label], batch_size=1)
image_batch_uint8 = tf.cast(image_batch, tf.uint8)

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
for i in range(10):
    final_image = sess.run(image_batch_uint8)
    imgplot = plt.imshow(final_image[0])

coord.request_stop()
coord.join(threads)

【讨论】:

以上是关于Tensorflow:如何使用来自 cifar10 的 tf.train.batch 绘制小批量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow 上测试自己的图像到 Cifar-10 教程?

CIFAR-10 图像识别

利用Tensorflow读取二进制CIFAR-10数据集

Tensorflow之CIFAR-10介绍

Logistic Regression Cifar10- 使用 tensorflow 1.x 的图像分类

github/tensorflow/models/tutorials/image/cifar10/cifar10_input.py