Spec-Zone.ru › TensorFlow 2.9

tf.raw_ops.DecodeProtoV2

Оператор извлекает поля из сериализованного сообщения протобуфера в тензоры.

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.raw_ops.DecodeProtoV2

tf.raw_ops.DecodeProtoV2(
    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 соответствующего типа записи. Компилятор протобуфера определяет типы записей для каждого поля типа map. Имя типа — это имя поля, преобразованное в «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. Список типов TensorFlow, которые следует использовать для соответствующего поля в 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/raw_ops/DecodeProtoV2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API