时间:2019-03-16 20:47:07

标签: python tensorflow dataformat

TensorFlow为要存储在tf.train.Feature中的数据提供了3种不同的格式。这些是:

tf.train.BytesList
tf.train.FloatList
tf.train.Int64List

我经常很难在tf.train.Int64List / tf.train.FloatListtf.train.BytesList之间进行选择。

我在网上看到一些示例,这些示例将int / floats转换为字节,然后将其存储在tf.train.BytesList中。这比使用其他格式之一更好吗?如果是这样,为什么当您仅将TensorFlow转换为字节并使用tf.train.Int64List时,为什么甚至提供tf.train.FloatListtf.train.BytesList作为可选格式?

谢谢。

1 个答案:

答案 0 :(得分:1)

因为字节列表将需要更多内存。它旨在存储字符串数据,例如存储为转换为单个字节字符串的numpy数组。考虑示例:

def int64_feature(value):
    if type(value) != list:
        value = [value]
    return tf.train.Feature(int64_list=tf.train.Int64List(value=value))

def float_feature(value):
    if type(value) != list:
        value = [value]
    return tf.train.Feature(float_list=tf.train.FloatList(value=value))

def bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

writer = tf.python_io.TFRecordWriter('file.tfrecords')
bytes = np.array(1.1).tostring() 
int = 1
float = 1.1
example = tf.train.Example(features=tf.train.Features(feature={'1': float_feature(float)}))
writer.write(example.SerializeToString())
writer.close()

for str_rec in tf.python_io.tf_record_iterator('file.tfrecords'):
    example = tf.train.Example()
    example.ParseFromString(str_rec)
    str = (example.features.feature['1'].float_list.value[0])
    print(getsizeof(str))

对于dtype float in将输出24个字节(最小值)。但是,您不能将int传递给tf.train.FloatList。在这种情况下,int dtype将占用28个字节,而字节将被解码为41个字节(在应用np.fromstring之前),之后甚至更多。