使用 Tensorflow 从 csv 文件加载图像和标签
Loading images and labels from csv file using Tensorflow
今天早上我一直在努力让 TensorFlow io api 正常工作。
经过一番研究,我设法读入了数据,但在出队时无法正确绑定图像和标签。
这是我写的代码:
# load csv content
csv_path = tf.train.string_input_producer(['list1.csv', 'list2.csv'])
textReader = tf.TextLineReader()
_, csv_content = textReader.read(csv_path)
im_name, label = tf.decode_csv(csv_content, record_defaults=[[""], [1]])
# load images
im_content = tf.read_file(im_dir+im_name)
image = tf.image.decode_png(im_content, channels=3)
image = tf.cast(image, tf.float32) / 255.
image = tf.image.resize_images(image, 640, 640)
# make batches
im_batch, lb_batch = tf.train.batch([image, label], batch_size=batch)
im_batch
和 lb_batch
顺序乱了(图片绑定了随机标签)。
知道发生了什么事吗?谢谢
你列出的代码没有问题。
im_batch, lb_batch = tf.train.batch([image, label], batch_size=batch)
上面这行将图像和标签绑定到同一个队列,所以每当你对im_batch或lb_batch进行操作时,队列将从中弹出一批数据单元另一个。
所以一个常见的错误可能是分别调用 im_batch.eval() 和 lb_batch.eval():
# this is wrong
images = im_batch.eval()
labels = lb_batch.eval()
在调用 im_batch.eval() 之后,lb_batch 也会弹出相同数量的数据单元,因为它们绑定在一个队列中。所以当接下来调用 lb_batch.eval() 时,它实际上给出了下一批的标签。
正确的做法是将im_batch和lb_batch放入一个单元操作中,可以是图或者sess.run()操作列表:
这是正确的
损失 = your_network_model(im_batch, lb_batch)
loss.eval()
2.
# this is correct
images, labels = sess.run([im_batch, lb_batch])
今天早上我一直在努力让 TensorFlow io api 正常工作。
经过一番研究,我设法读入了数据,但在出队时无法正确绑定图像和标签。
这是我写的代码:
# load csv content
csv_path = tf.train.string_input_producer(['list1.csv', 'list2.csv'])
textReader = tf.TextLineReader()
_, csv_content = textReader.read(csv_path)
im_name, label = tf.decode_csv(csv_content, record_defaults=[[""], [1]])
# load images
im_content = tf.read_file(im_dir+im_name)
image = tf.image.decode_png(im_content, channels=3)
image = tf.cast(image, tf.float32) / 255.
image = tf.image.resize_images(image, 640, 640)
# make batches
im_batch, lb_batch = tf.train.batch([image, label], batch_size=batch)
im_batch
和 lb_batch
顺序乱了(图片绑定了随机标签)。
知道发生了什么事吗?谢谢
你列出的代码没有问题。
im_batch, lb_batch = tf.train.batch([image, label], batch_size=batch)
上面这行将图像和标签绑定到同一个队列,所以每当你对im_batch或lb_batch进行操作时,队列将从中弹出一批数据单元另一个。 所以一个常见的错误可能是分别调用 im_batch.eval() 和 lb_batch.eval():
# this is wrong
images = im_batch.eval()
labels = lb_batch.eval()
在调用 im_batch.eval() 之后,lb_batch 也会弹出相同数量的数据单元,因为它们绑定在一个队列中。所以当接下来调用 lb_batch.eval() 时,它实际上给出了下一批的标签。
正确的做法是将im_batch和lb_batch放入一个单元操作中,可以是图或者sess.run()操作列表:
这是正确的
损失 = your_network_model(im_batch, lb_batch) loss.eval()
2.
# this is correct
images, labels = sess.run([im_batch, lb_batch])