《tensorflow》那本书以上来就是这个,刚看的时候一下子还没理解它:
message Example{
Features features = 1; #Features是一个字典,key是string类型的,value是Feature。Feature的取值有好几种,下面列出来了。
};
message Features{
map<string,Feature> feature = 1; #看,map:<string,Feature>。 feature这里取了值1.
};
#这个就是feature的可能取值了。
message Feature{
oneof kind{
BytesList bytes_list = 1; #上面的 feature = 1,也就是把数据存为bytes类型了。。。这个后面会细讲,别急。
FloatList float_list = 2;
Int64List int64_list = 3;
}
};
这样理解吧:这个Example里弄个字典,key是你所存数据的名字,比如:image、label啊之类的,名字是string类型的,这很好理解啊,看像这样:‘image’ ‘label’ 这可不是string嘛。。。然后value给的是存进数据来,被转化为的格式的情况:1代表 BytesList、2代表 FloatList 。。。就是这样了。
实际的存储栗子:
#生成整数型的属性(feature)
def _int64_feature(value): #(注意这个函数,下面有用到的。。。)
return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
#生成字符串型的属性(feature)
def _bytes_feature(value): #(注意这个函数,下面有用到的。。。)
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
def convert(images,labels,name):
#获取要转换为TFRecord文件的图片数目
num = images.shape[0]
#输出TFRecord文件的文件名
filename = name+'.tfrecords'
print('Writting',filename)
writer = tf.python_io.TFRecordWriter(filename) #创建一个writer来写TFRecord文件
for i in range(num):
#将图像矩阵转化为一个字符串 tostring()函数。
img_raw = images[i].tostring() #img_raw是转成string的编码后的图像。
#将一个样例转化为Example Protocol Buffer,并将所有需要的信息写入数据结构
example = tf.train.Example(features=tf.train.Features(feature={
'label': _int64_feature(int(labels[i])), #调用上面的_int64_feature()函数。
'image_raw': _bytes_feature(img_raw)})) #调用上面的_bytes_feature()函数。
#将example写入TFRecord文件
writer.write(example.SerializeToString())
writer.close()
print('Writting End')
嗯,以上是存成tfrecord,然后是读取:
def read_and_decode(filename_queue):
reader = tf.TFRecordReader() #创建一个reader来读取TFRecord文件中的样例
#从文件中读出一个样例
_,serialized_example = reader.read(filename_queue)
#解析读入的一个样例
features = tf.parse_single_example(serialized_example,features={
'label':tf.FixedLenFeature([],tf.int64),
'image_raw':tf.FixedLenFeature([],tf.string)
})
#将字符串解析成图像对应的像素数组
image = tf.decode_raw(features['image_raw'],tf.uint8) #tf.decode_raw()函数,解码图像,转为数组形式。
label = tf.cast(features['label'],tf.int32) #tf.cast()函数,类型转换,转换成tf.int32.
image.set_shape([IMG_PIXELS])
image = tf.reshape(image,[IMG_HEIGHT,IMG_WIDTH,IMG_CHANNELS])
image = tf.cast(image, tf.float32) * (1. / 255) - 0.5
return image,label
ok,以上,有了新的理解会再来补充,欢迎大家指正。。。
今天的文章tfrecord 格式理解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/5803.html