Когда следует использовать tf.train.BytesList, tf.train.FloatList и tf.train.Int64List для хранения данных в tf.train.Feature? - PullRequest
2 голосов
/ 16 марта 2019

TensorFlow предоставляет 3 различных формата для хранения данных в tf.train.Feature.Это:

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

Мне часто приходится выбирать между tf.train.Int64List / tf.train.FloatList и tf.train.BytesList.

В Интернете я вижу несколько примеров, когда они конвертируют целые / плавающие числа в байты изатем сохраните их в tf.train.BytesList.Является ли это предпочтительным для использования одного из других форматов?Если это так, почему TensorFlow даже предоставляет tf.train.Int64List и tf.train.FloatList в качестве необязательных форматов, когда вы можете просто преобразовать их в байты и использовать tf.train.BytesList?

Спасибо.

1 Ответ

1 голос
/ 17 марта 2019

Поскольку список байтов потребует больше памяти. Он предназначен для хранения строковых данных или, например, массивов-пустышек, преобразованных в одну строку байтов. Рассмотрим пример:

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))

Для типа d float in будет выводиться 24 байта, самое низкое значение. Однако вы не можете передать int на tf.train.FloatList. В этом случае Int dtype будет занимать 28 байтов, тогда как байты будут 41 не закодированы (до применения np.fromstring) и даже больше после.

...