tf.io.decode_proto
Операция извлекает поля из сериализованного сообщения протобуффера в тензоры.
tf.io.decode_proto(
bytes,
message_type,
field_names,
output_types,
descriptor_source='local://',
message_format='binary',
sanitize=False,
name=None
)
Примечание: Этот API разработан для ортогональности, а не для удобства использования человеком. Его можно использовать для ручного разбора входных прото, но он предназначен для использования в сгенерированном коде.
Операция decode_proto извлекает поля из сериализованного сообщения протобуффера в тензоры. Поля в field_names декодируются и преобразуются в соответствующие типы output_types при возможности.
Необходимо указать имя message_type, чтобы предоставить контекст для имен полей. Фактический дескриптор сообщения можно найти либо в связанном пуле дескрипторов, либо в имени файла, предоставленном вызывающей стороной с помощью атрибута descriptor_source.
Каждый выходной тензор — это плотный тензор. Это означает, что он дополняется до максимального количества повторяющихся элементов, встречающихся в входном минибаче. (Размерность также дополняется на единицу, чтобы предотвратить размерность нулевой величины). Фактическое количество повторений для каждого примера в минибаче можно найти в выходных данных sizes. Во многих случаях выход decode_proto сразу же подаётся в tf.squeeze, если пропущенные значения не представляют проблемы. При использовании tf.squeeze всегда явно передавайте размерность сжатия, чтобы избежать неожиданностей.
В основном отображение между типами полей прото и типами данных TensorFlow прямое. Однако есть несколько особых случаев:
Поле прото, содержащее подсообщение или группу, может быть преобразовано только в
DT_STRING(сериализованное подсообщение). Это делается для уменьшения сложности API. Результирующую строку можно использовать в качестве входных данных для другой экземпляра операции decode_proto.TensorFlow не поддерживает целые числа без знака. Операции представляют типы uint64 в виде
DT_INT64с тем же битовым шаблоном с дополнением до двух (очевидный способ). Значения целых чисел без знака int32 можно точно представить, указав типDT_INT64, или используя дополнение до двух, если вызывающая сторона укажетDT_INT32в атрибутеoutput_types.Поля типа
mapне декодируются напрямую. Они обрабатываются как поля типаrepeatedсоответствующего типа записи. Компилятор прото определяет типы записей для каждого поля отображения. Имя типа — это имя поля, преобразованное в «CamelCase» с добавленным «Entry». Сообщениеtf.train.Features.FeatureEntry— это пример одного из этих неявных типовEntry.Поля типа
enumследует читать как int32.
Поддерживаются бинарная и текстовая сериализация прото, которые можно выбрать с помощью атрибута format.
Атрибут descriptor_source выбирает источник прото-дескрипторов для консультации при поиске message_type. Это может быть:
Пустая строка или "local://", в этом случае прото-дескрипторы создаются для определений прото C++ (не Python), связанных с бинарным файлом.
Файл, в этом случае прото-дескрипторы создаются из файла, который должен содержать сериализованный
FileDescriptorSetв виде строки. ПРИМЕЧАНИЕ: Вы можете создать файлdescriptor_sourceс помощью опций--descriptor_set_outи--include_importsдля компилятора протоprotoc.«bytes://
», в этом случае прото-дескрипторы создаются из <bytes>, который должен быть сериализованнымFileDescriptorSetв виде строки.
Вот пример:
Внутренний прото Summary.Value содержит oneof {float simple_value; Image image; ...}
from google.protobuf import text_format
# A Summary.Value contains: oneof {float simple_value; Image image}
values = [
"simple_value: 2.2",
"simple_value: 1.2",
"image { height: 128 width: 512 }",
"image { height: 256 width: 256 }",]
values = [
text_format.Parse(v, tf.compat.v1.Summary.Value()).SerializeToString()
for v in values]
Следующее может декодировать оба поля из сериализованных строк:
sizes, [simple_value, image] = tf.io.decode_proto( values, tf.compat.v1.Summary.Value.DESCRIPTOR.full_name, field_names=['simple_value', 'image'], output_types=[tf.float32, tf.string])
Результат sizes имеет ту же размерность, что и вход, с дополнительной осью по полям, которые были декодированы. Здесь первый столбец sizes представляет размер декодированного поля simple_value:
print(sizes) tf.Tensor( [[1 0] [1 0] [0 1] [0 1]], shape=(4, 2), dtype=int32)
Результирующие тензоры имеют на один индекс больше, чем входные байтовые строки. Действительные элементы каждого результирующего тензора указываются соответствующим столбцом sizes. Недействительные элементы дополняются значением по умолчанию:
print(simple_value) tf.Tensor( [[2.2] [1.2] [0. ] [0. ]], shape=(4, 1), dtype=float32)
Вложенные прото извлекаются как строковые тензоры:
print(image.dtype) <dtype: 'string'> print(image.shape.as_list()) [4, 1]
Для преобразования в представление tf.RaggedTensor используйте:
tf.RaggedTensor.from_tensor(simple_value, lengths=sizes[:, 0]).to_list() [[2.2], [1.2], [], []]
| Аргументы | |
|---|---|
bytes |
Tensor типа string. Тензор сериализованных прото с размерностью batch_shape. |
message_type |
string. Имя типа сообщения прото для декодирования. |
field_names |
Список strings. Список строк, содержащих имена полей прото. Поле расширения можно декодировать, используя полное имя, например EXT_PACKAGE.EXT_FIELD_NAME. |
output_types |
Список tf.DTypes. Список типов TF для использования для соответствующего поля в field_names. |
descriptor_source |
Необязательный string. По умолчанию "local://". Либо специальное значение local://, либо путь к файлу, содержащему сериализованный FileDescriptorSet. |
message_format |
Необязательный string. По умолчанию "binary". Либо binary, либо text. |
sanitize |
Необязательный bool. По умолчанию False. Требуется ли очистка результата. |
name |
Имя операции (необязательно). |
| Возвращаемые значения | |
|---|---|
Кортеж объектов Tensor (размеры, значения). |
|
sizes |
Tensor типа int32 |
values |
Список объектов Tensor типа output_types |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/io/decode_proto