TFRecord 是谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。
tfreocrd的核心是其包含一系列的example,每个example可以认为是一条样本。example是tensorflow中的对象类型,用法是tf.train.example。
tf.train.example 只有一个属性features。features也是tensorflow的一个对象类型tf.train.Features,tf.train.Features也只有一个属性feature(后面还会出现一个feature,为了区分,tf.train.Features的属性feature会写成“属性feature”)。属性feature本质上是一个dict,该dict的内容是{"string": tf.train.Feature}。其中string表示特征名。tf.train.Feature同样是tensorflow的一个对象,tf.train.Feature的一个类就表示一个特征,特征的值就保存在tf.train.Feature 中。
对于类型繁多的特征值,tf.train.Feature是怎么保存的呢?tf.train.Feature有三个属性:
byte_list,用于保存string类型的特征值,比如:某人7天内浏览过的店铺id组成的list,或者某人所在的城市,如果只有一个值那就是长度是1的list。
属性byte_list的格式应该是 tf.train.BytesList,tf.train.BytesList只接受bytes类型的入参,不接受string类型。应该注意的是
我们定义一个bytes的时候,注意中英文,例如name = b"taobao" 是合法的,但是 name = b"淘宝" 是非法的,因为用b"string"的方法只接受ascii码的字符串。如果有汉语可以用 name = u'淘宝'.encode('utf-8') 来定义。
float_list :用于保存float类型的特征值,是一个list,类型是tf.train.FloatList
int64_list:用于保存int,long,boolean类型的特征值,是一个list,类型是tf.train.Int64List
综合上面的说法
下面是一个样例:
用户A,年龄:25,城市:北京,最近7天中打开淘宝的天数:4,最近7天在淘宝上消费:289.4元。,最近7天浏览过的淘宝店铺id:123,456,789。
把上面的信息做成一条样本就是
value_city = u"北京".encode('utf-8') # 城市
value_use_day = 7 #最近7天打开淘宝次数
value_pay = 289.4 # 最近7 天消费金额
value_poi = [b"123", b"456", b"789"] #最近7天浏览电铺
'''
下面生成ByteList,Int64List和FloatList
'''
bl_city = tf.train.BytesList(value = [value_city]) ## tf.train.ByteList入参是list,所以要转为list
il_use_day = tf.train.Int64List(value = [value_use_day])
fl_pay = tf.train.FloatList(value = [value_pay])
bl_poi = tf.train.BytesList(value = value_poi)
'''
下面生成tf.train.Feature
'''
feature_city = tf.train.Feature(bytes_list = bl_city)
feature_use_day = tf.train.Feature(int64_list = il_use_day)
feature_pay = tf.train.Feature(float_list = fl_pay)
feature_poi = tf.train.Feature(bytes_list = bl_poi)
'''
下面定义tf.train.Features
'''
feature_dict = {"city":feature_city,"use_day":feature_use_day,"pay":feature_pay,"poi":feature_poi}
features = tf.train.Features(feature = feature_dict)
'''
下面定义tf.train.example
'''
example = tf.train.Example(features = features)
print(example)
上面的代码的运行结果为:
features {
feature {
key: "city"
value {
bytes_list {
value: "\345\214\227\344\272\254"
}
}
}
feature {
key: "pay"
value {
float_list {
value: 289.3999938964844
}
}
}
feature {
key: "poi"
value {
bytes_list {
value: "123"
value: "456"
value: "789"
}
}
}
feature {
key: "use_day"
value {
int64_list {
value: 7
}
}
}
}
把若干个example组合起来,然后转化为二进制文件,就是tfrecord。