Spec-Zone.ru › TensorFlow

tf.io.decode_proto

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

Псевдонимы

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

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

tf.compat.v1.io.decode_proto

tf.io.decode_proto(
    bytes: Annotated[Any, _atypes.String],
    message_type: str,
    field_names,
    output_types,
    descriptor_source: str = 'local://',
    message_format: str = 'binary',
    sanitize: bool = 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/api_docs/python/tf/io/decode_proto

Spec-Zone.ru

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