tf.raw_ops.DecodeProtoV2
Операция извлекает поля из сериализованного сообщения Protocol Buffers в тензоры.
tf.raw_ops.DecodeProtoV2(
bytes,
message_type,
field_names,
output_types,
descriptor_source='local://',
message_format='binary',
sanitize=False,
name=None
)
Примечание: Этот API разработан с учетом ортогональности, а не удобства для человека. Его можно использовать для ручного анализа входных протобуферов, но он предназначен для использования в сгенерированном коде.
Операция decode_proto извлекает поля из сериализованного сообщения Protocol Buffers в тензоры. Поля в field_names декодируются и, если возможно, преобразуются в соответствующие output_types.
Чтобы задать контекст для имен полей, необходимо указать имя message_type. Дескриптор сообщения можно найти либо в связанном пуле дескрипторов, либо в файле, указанном вызывающим кодом с помощью атрибута descriptor_source.
Каждый выходной тензор является плотным тензором. Это означает, что он дополнен до размера, достаточного для хранения наибольшего количества повторяющихся элементов, встречающихся во входном мини-пакете. (Форма также дополнена на единицу, чтобы избежать измерений нулевого размера.) Фактическое количество повторений для каждого примера в мини-пакете можно найти в выходном значении sizes. Во многих случаях выходные данные decode_proto сразу передаются в tf.squeeze, если отсутствие значений не представляет проблемы. При использовании tf.squeeze всегда явно указывайте размерность сжатия, чтобы избежать неожиданностей.
В большинстве случаев соответствие между типами полей Proto и типами данных TensorFlow очевидно. Однако есть несколько особых случаев:
Поле proto, содержащее подсообщение или группу, можно преобразовать только в
DT_STRING(сериализованное подсообщение). Это позволяет упростить API. Полученную строку можно использовать как входные данные для другого экземпляра операции decode_proto.TensorFlow не поддерживает беззнаковые целые числа. Операции представляют типы uint64 как
DT_INT64с тем же битовым шаблоном в дополнительном коде (самый очевидный способ). Значения uint32 можно представить точно, указав типDT_INT64либо используя дополнительный код, если вызывающий код укажетDT_INT32в атрибутеoutput_types.Поля
mapнапрямую не декодируются. Они обрабатываются как поляrepeatedсоответствующего типа записи. Компилятор proto определяет типы записей для каждого поля map. Имя типа образуется из имени поля, преобразованного в CamelCase, с добавлением «Entry». Сообщениеtf.train.Features.FeatureEntry— пример одного из этих неявных типовEntry.Поля
enumследует считывать как int32.
Поддерживаются бинарная и текстовая сериализации proto; нужный формат можно выбрать с помощью атрибута format.
Атрибут descriptor_source выбирает источник дескрипторов протокола, используемый для поиска message_type. Это может быть:
Пустая строка или «local://». В этом случае дескрипторы протокола создаются для определений proto на C++ (но не на Python), связанных с двоичным файлом.
Файл. В этом случае дескрипторы протокола создаются из файла, который, как ожидается, содержит сериализованный в виде строки
FileDescriptorSet. ПРИМЕЧАНИЕ: файлdescriptor_sourceможно создать с помощью параметров--descriptor_set_outи--include_importsкомпилятора протоколовprotoc.«bytes://
». В этом случае дескрипторы протокола создаются из <bytes>, который, как ожидается, представляет собой сериализованный в виде строкиFileDescriptorSet.
Пример:
Внутренний proto 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)
Вложенные proto извлекаются как строковые тензоры:
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 | string типа Tensor. Тензор сериализованных proto с формой batch_shape. |
message_type | string. Имя типа сообщения proto для декодирования. |
field_names | Список strings. Список строк, содержащих имена полей proto. Поле расширения можно декодировать, указав его полное имя, например 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/api_docs/python/tf/raw_ops/DecodeProtoV2