Spec-Zone.ru › TensorFlow 2.9

tf.io.decode_proto

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

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

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

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

tf.compat.v1.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

Spec-Zone.ru

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