Когда следует использовать tf.train .Список байтов, tf.train.FloatList и tf.train.Int64List для хранения данных в tf.train.Функция?

#python #tensorflow #dataformat

#python #тензорный поток #формат данных

Вопрос:

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:

Потому что список байтов потребует больше памяти. Он предназначен для хранения строковых данных или, например, массивов 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 он выведет 24 байта, наименьшее значение. Однако вы не можете перейти int к tf.train.FloatList . int dtype в этом случае будет занимать 28 байт, в то время как 41 байт будет недекодирован (до применения np.fromstring ) и еще больше после.

Комментарии:

1. Отлично, спасибо @Sharky. То, что список байтов займет больше памяти и предназначен для хранения строковых данных, отвечает на вопрос и имеет большой смысл. Код был особенно полезен.

2. Если позволите, почему список байтов занимает больше памяти? Я всегда считал байты удобочитаемыми и компактными…

3. Вы правы насчет байтов, но это справедливо только при работе с числами. строка или байты хранят дополнительную информацию, такую как длина, длина в байтах, тип кодировки, хэш и, возможно, некоторые другие. Взгляните jakevdp.github.io/PythonDataScienceHandbook /…

4. Ах, я понимаю, итак, в моем случае, если я хотел бы сохранить двумерный список значений с плавающей запятой, мне, возможно, следует использовать float_list, поскольку преобразование в байты означало бы, что я сохраняю информацию о типе и количество ссылок в байтах? Эта ссылка была действительно очень полезной, спасибо.