如何使用tf.data读取tfrecords数据集

tfrecords有一个问题就是如果数据集图片数量太大了,使用传统的方法tf.train.string_input_producer,就会报OutOfRangeError这个错误,至今我不知道怎么解决,找了无数方法也不知道怎么解决,不过引起的原因大部分是因为数据格式不一致,比如图片有一部分unit8的灰度图,但是你其实在制作RGB三通道的数据集,这样图片格式不一致就会报错,具体原因可以看我其他博客,有一个就是介绍可能引起来的各种方法。

 

  1. 在制作数据集之前,首先要检查数据集的格式,查看是否一致,图片的格式主要有RGB,RGBA,L,P,
import os
import tensorflow as tf
from PIL import Image

cwd = r'/home/hehe/python/deeplearning/pan/'
num=0
for img_name in os.listdir(cwd):
    img_path = cwd + img_name
    img = Image.open(img_path)
    print(num,img_name ,img )

将输出结果粘贴到word里面,然后查找model=RGBA,找到所有非RGB的图片删除,这一步很关键,如果不删除后面的数据集很可能就不能用。

如果你的文件夹和你的标签对应得上,那么使用这种方式也可以的

#下面的代码是为了生成list.txt , 把不同文件夹下的图片和 数字label对应起来
import os

path=r"/user/huanglong/jiao/"

output_path = 'list.txt'
fd = open(output_path, 'w')
cate = [path + x for x in os.listdir(path) if os.path.isdir(path + x)]
# os.path.splitext(DATA_URL.split("/")[-1])[0]
for index, folder in enumerate(cate):
    name=os.path.splitext(folder.split("/")[-1])[0]
    for im in os.listdir(folder):
        fd.write('{}/{} {}\n'.format(name, im, name))
fd.close()
print('finish task')

这样的方法就不需要你刚刚那样每次还需要修改,只需要更改文件路径就好了。

### 回答1: 你可以使用 `tf.python_io.tf_record_iterator` 来迭代读取 `tf.records` 中的每一条记录。 下面是一个示例代码: ```python import tensorflow as tf # 创建一个读取器 reader = tf.TFRecordReader() # 打开要读取tfrecord 文件 filename_queue = tf.train.string_input_producer(['path/to/your.tfrecord']) # 解码 _, serialized_example = reader.read(filename_queue) features = tf.parse_single_example(serialized_example, features={ 'feature1': tf.FixedLenFeature([], tf.int64), 'feature2': tf.FixedLenFeature([], tf.string), # ... }) # 在使用的时候,你可以通过调用 sess.run(features) 来查看每一条记录的内容 ``` 这样你就可以解码 `tf.records` 文件中的每一条记录了。 ### 回答2: 要查看tf.records中记录的内容,可以使用TensorFlow的Dataset API来读取和解析tf.records文件。 首先,我们需要创建一个tf.data.TFRecordDataset对象来加载tf.records文件。例如: ``` python dataset = tf.data.TFRecordDataset(filename) ``` 其中,`filename`是包含tf.records文件路径的字符串。 然后,我们需要定义一个解析tf.records文件的函数,用于从每个记录中恢复原始数据。这个函数应该使用tf.io.parse_single_example方法来解析单个记录,并通过指定每个feature的名称、类型和形状来恢复原始数据。例如,假设tf.records文件包含一个包含图像和标签的记录,可以这样解析: ``` python def parse_record(serialized_example): feature_description = { 'image': tf.io.FixedLenFeature([], tf.string), 'label': tf.io.FixedLenFeature([], tf.int64), } example = tf.io.parse_single_example(serialized_example, feature_description) image = tf.image.decode_jpeg(example['image'], channels=3) # 从字节串解码图像 label = example['label'] return image, label ``` 接下来,我们可以使用map方法将解析函数应用于dataset,并通过iterator迭代获取tf.records文件中的每个记录的内容。 ``` python parsed_dataset = dataset.map(parse_record) iterator = parsed_dataset.make_one_shot_iterator() next_record = iterator.get_next() with tf.Session() as sess: while True: try: image, label = sess.run(next_record) # 对图像和标签进行处理或显示 except tf.errors.OutOfRangeError: break # 数据集读取完成 ``` 通过上述步骤,我们可以成功地查看tf.records文件中记录的内容。 ### 回答3: tf.records是TensorFlow中的一种文件格式,常用于存储大量训练数据。我们可以使用tf.data.TFRecordDataset类来读取tf.records文件,并查看记录的内容。 首先,我们需要导入TensorFlow库: ``` import tensorflow as tf ``` 然后,我们可以使用tf.data.TFRecordDataset类来创建一个数据集对象,并指定要读取tf.records文件的路径,例如: ``` dataset = tf.data.TFRecordDataset('path/to/your/tfrecords/file.tfrecords') ``` 接下来,我们可以使用Python迭代器来遍历数据集,并逐个查看记录的内容。首先,我们需要定义tf.records中记录的数据类型和格式。假设我们的tf.records文件中每条记录由一个字符串和一个整数组成,可以使用tf.FixedLenFeature类来定义读取的格式。例如: ``` feature_description = { 'string_feature': tf.FixedLenFeature([], tf.string), 'int_feature': tf.FixedLenFeature([], tf.int64), } ``` 然后,我们可以使用map()方法将每条记录解析为定义好的格式,并输出解析后的数据。例如: ``` def _parse_function(example_proto): parsed_example = tf.parse_single_example(example_proto, feature_description) string_value = parsed_example['string_feature'] int_value = parsed_example['int_feature'] return string_value, int_value parsed_dataset = dataset.map(_parse_function) for string_value, int_value in parsed_dataset: print(string_value.numpy(), int_value.numpy()) ``` 这样,我们就可以遍历所有记录,并逐个打印出记录中的字符串和整数值。 综上所述,要查看tf.records中记录的内容,我们可以使用tf.data.TFRecordDataset类读取tf.records文件,并使用Python迭代器遍历每条记录,使用tf.parse_single_example()函数解析记录的格式,然后查看记录中的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值