#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, поскольку преобразование в байты означало бы, что я сохраняю информацию о типе и количество ссылок в байтах? Эта ссылка была действительно очень полезной, спасибо.