Spec-Zone.ru › TensorFlow

tf.experimental.StructuredTensor

Многомерное множество структур с одинаковой схемой.

Наследует от: BatchableExtensionType, ExtensionType

Псевдонимы

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

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

tf.compat.v1.experimental.StructuredTensor

tf.experimental.StructuredTensor(
    fields: Mapping[str, _FieldValue],
    ragged_shape: tf.experimental.DynamicRaggedShape
)

StructuredTensor — это многомерное множество структур с одинаковой схемой, где:

  • Схема — это набор полей, каждое из которых имеет имя и тип.
  • Структура сопоставляет каждое поле в схеме с тензорным значением (которое может быть вложенным StructuredTensor).

В качестве важного частного случая, одномерный StructuredTensor кодирует двумерную таблицу, где столбцы являются гетерогенными Tensor, а строки — выровненные элементы в каждом из этих Tensor.

Внутренне StructuredTensors используют кодирование «поля-главное»: для каждого листового поля существует один тензор, который хранит значение этого поля для всех структур в StructuredTensor.

Примеры

# A scalar StructuredTensor describing a single person.
s1 = tf.experimental.StructuredTensor.from_pyval(
    {"age": 82, "nicknames": ["Bob", "Bobby"]})
s1.shape
TensorShape([])
s1["age"]
<tf.Tensor: shape=(), dtype=int32, numpy=82>
# A vector StructuredTensor describing three people.
s2 = tf.experimental.StructuredTensor.from_pyval([
    {"age": 12, "nicknames": ["Josaphine"]},
    {"age": 82, "nicknames": ["Bob", "Bobby"]},
    {"age": 42, "nicknames": ["Elmo"]}])
s2.shape
TensorShape([3])
s2[0]["age"]
<tf.Tensor: shape=(), dtype=int32, numpy=12>

Пути полей

Путь полей — это кортеж имён полей, определяющий путь к вложенному полю.

Атрибуты
rank Ранг этого StructuredTensor. Гарантируется, что он не None.
row_partitions Кортеж RowPartition, определяющий форму этого StructuredTensor.

Если self.rank <= 1, этот кортеж будет пустым.

Если self.rank > 1, эти RowPartitions определяют форму StructuredTensor, описывая, как плоский (одномерный) список структур можно многократно разбить, чтобы сформировать объект более высокой размерности. В частности, плоский список сначала разбивается на подсписки с помощью row_partitions[-1], а затем эти подсписки разбиваются с помощью row_partitions[-2] и т. д. Приведённые ниже примеры показывают разбиения строк, используемые для описания нескольких различных StructuredTensor, каждый из которых содержит 8 копий одной структуры (x):

x = {'a': 1, 'b': ['foo', 'bar', 'baz']}       # shape = [] (scalar)
s1 = [[x, x, x, x], [x, x, x, x]]              # shape = [2, 4]
tf.experimental.StructuredTensor.from_pyval(s1).row_partitions
(tf.RowPartition(row_splits=[0 4 8]),)
s2 = [[x, x], [x, x], [x, x], [x, x]]          # shape = [4, 2]
tf.experimental.StructuredTensor.from_pyval(s2).row_partitions
(tf.RowPartition(row_splits=[0 2 4 6 8]),)
s3 = [[x, x, x], [], [x, x, x, x], [x]]        # shape = [2, None]
tf.experimental.StructuredTensor.from_pyval(s3).row_partitions
(tf.RowPartition(row_splits=[0 3 3 7 8]),)
s4 = [[[x, x], [x, x]], [[x, x], [x, x]]]      # shape = [2, 2, 2]
tf.experimental.StructuredTensor.from_pyval(s4).row_partitions
(tf.RowPartition(row_splits=[0 2 4]),
 tf.RowPartition(row_splits=[0 2 4 6 8]))
s5 = [[[x, x], [x]], [[x, x]], [[x, x], [x]]]  # shape = [3, None, None]
tf.experimental.StructuredTensor.from_pyval(s5).row_partitions
(tf.RowPartition(row_splits=[0 2 3 5]),
 tf.RowPartition(row_splits=[0 2 3 5 7 8]))

Обратите внимание, что формы вложенных полей (например, x['b'] в приведённом выше примере) не считаются частью формы StructuredTensor и не включаются в row_partitions.

Если у этого StructuredTensor есть разряженная форма (то есть, если любой из row_partitions не имеет одинакового размера), то все поля будут закодированы как RaggedTensor или StructuredTensor с этими RowPartition, используемыми для определения внешних self.rank измерений.

shape Статическая форма этого StructuredTensor.

Возвращаемая TensorShape гарантированно имеет известный ранг, но отдельные размеры измерений могут быть неизвестными.

Подклассы

class Spec

Методы

field_names

Просмотреть исходный код

field_names()

Возвращает строковые имена полей для этого StructuredTensor.

field_value

Просмотреть исходный код

field_value(
    field_name
)

Возвращает тензорное значение для указанного поля или пути.

Если field_name является string, то оно напрямую указывает на поле, принадлежащее этому StructuredTensor. Если у этого StructuredTensor форма [D1...DN], то возвращаемый тензор будет иметь форму [D1...DN, V1...VM], где срез result[d1...dN] содержит значение поля для структуры в позиции self[d1...dN].

Если field_name является tuple из string, то оно определяет путь к полю, принадлежащему вложенному StructuredTensor. В частности, struct.field_value((f1, f2, ..., fN)) эквивалентно struct.field_value(f1).field_value(f2)....field_value(fN)

Аргументы
field_name string или tuple из string: поле, значения которого следует вернуть.
Возвращает
Tensor, StructuredTensor или RaggedTensor.
Исключения
KeyError Если заданное поле_имя не найдено.

from_fields

Просмотреть исходный код

@classmethod
from_fields(
    fields, shape=(), nrows=None, row_partitions=None, validate=False
)

Создаёт StructuredTensor из словаря полей.

Аргументы
fields Словарь, сопоставляющий строку с Tensor, RaggedTensor или StructuredTensor, предоставляющий значения для отдельных полей в каждой структуре. Если shape.rank > 0, то каждый тензор в fields должен иметь одинаковую форму в первых shape.rank измерениях; эта форма должна быть совместима с shape; и result[i1...iN][key] = fields[key][i1...iN] (где N==shape.rank).
shape TensorShape: статическая информация о форме StructuredTensor. Должна иметь известный rank. По умолчанию форма скалярная (т.е. rank=0).
nrows скалярный целочисленный тензор, содержащий количество строк в этом StructuredTensor. Следует указывать только если shape.rank > 0. Значение по умолчанию определяется по значениям fields. Если fields пусто, то это значение должно быть указано.
row_partitions Список RowPartition, описывающий (возможно, разряженную) форму этого StructuredTensor. Следует указывать только если shape.rank > 1. Значение по умолчанию определяется по значениям fields. Если fields пусто, то это значение должно быть указано.
validate Если True, то добавляются операторы проверки на соответствие типов значений полей во внешних shape.rank измерениях.
Возвращает
StructuredTensor.
Примеры
>>> tf.experimental.StructuredTensor.from_fields({'x': 1, 'y': [1, 2, 3]})
<StructuredTensor(
  fields={
    "x": tf.Tensor(1, shape=(), dtype=int32),
    "y": tf.Tensor([1 2 3], shape=(3,), dtype=int32)},
  shape=())>
tf.experimental.StructuredTensor.from_fields(
    {'foo': [1, 2], 'bar': [3, 4]}, shape=[2])
<StructuredTensor(
  fields={
    "bar": tf.Tensor([3 4], shape=(2,), dtype=int32),
    "foo": tf.Tensor([1 2], shape=(2,), dtype=int32)},
  shape=(2,))>

from_fields_and_rank

Просмотреть исходный код

@classmethod
from_fields_and_rank(
    fields: Mapping[str, _FieldValue],
    rank: int,
    validate: bool = False,
    dtype: Optional[tf.dtypes.DType] = None
) -> 'StructuredTensor'

Создаёт StructuredTensor из непустого словаря полей.

Обратите внимание, что если тип формы не задан, он будет определен по любому полю, имеющему тип формы. Если поля отличаются, то int64 будет предпочтительнее int32, потому что преобразование из int32 в int64 безопаснее, чем из int64 в int32.

Если нет полей с разряженной формой, то по умолчанию это будет int64, но в будущем это будет изменено на int32.

Аргументы
fields Словарь, сопоставляющий строки с Tensor, RaggedTensor или StructuredTensor, предоставляя значения для отдельных полей в каждой структуре. Если rank > 0, то каждый тензор в fields должен иметь одинаковую форму в первых rank измерениях. Не может быть пустым.
rank Ранг результирующего структурированного тензора.
validate Если True, то добавляются операторы проверки во время выполнения, которые проверяют, что значения полей имеют совместимые формы во внешних rank измерениях.
dtype Если указано, то принудительно устанавливает тип dtype формы.
Возвращаемое значение
StructuredTensor.
Примеры
>>> tf.experimental.StructuredTensor.from_fields_and_rank(
...     {'x': 1, 'y': [1, 2, 3]}, 0)
<StructuredTensor(
  fields={
    "x": tf.Tensor(1, shape=(), dtype=int32),
    "y": tf.Tensor([1 2 3], shape=(3,), dtype=int32)},
  shape=())>
>>> StructuredTensor.from_fields_and_rank({'foo': [1, 2], 'bar': [3, 4]},
...                              1)
<StructuredTensor(
  fields={
    "bar": tf.Tensor([3 4], shape=(2,), dtype=int32),
    "foo": tf.Tensor([1 2], shape=(2,), dtype=int32)},
  shape=(2,))>

from_pyval

Просмотреть исходный код

@classmethod
from_pyval(
    pyval, typespec=None
)

Создает StructuredTensor из вложенной структуры Python.

tf.experimental.StructuredTensor.from_pyval(
    {'a': [1, 2, 3], 'b': [[4, 5], [6, 7]]})
<StructuredTensor(
    fields={
      "a": tf.Tensor([1 2 3], shape=(3,), dtype=int32),
      "b": <tf.RaggedTensor [[4, 5], [6, 7]]>},
    shape=())>

Обратите внимание, что StructuredTensor.from_pyval(pyval).to_pyval() == pyval.

Аргументы
pyval Вложенная структура Python, которая должна быть использована для создания нового StructuredTensor.
typespec StructuredTensor.Spec, определяющий ожидаемый тип для каждого поля. Если не указано, то все вложенные словари преобразуются в StructuredTensors, а все вложенные списки — в Tensors (если ранг < 2) или RaggedTensors (если ранг >= 2).
Возвращаемое значение
StructuredTensor.

from_shape

Просмотреть исходный код

@classmethod
from_shape(
    ragged_shape: tf.experimental.DynamicRaggedShape
) -> 'StructuredTensor'

Создает StructuredTensor без полей и ragged_shape.

Аргументы
ragged_shape форма структурированного тензора.
Возвращаемое значение
StructuredTensor без полей и ragged_shape.

merge_dims

Просмотреть исходный код

merge_dims(
    outer_axis, inner_axis
)

Объединяет outer_axis...inner_axis в одно измерение.

Возвращает копию этого RaggedTensor с указанным диапазоном измерений, сжатым в одно измерение, с элементами в порядке следования строк.

st = tf.experimental.StructuredTensor.from_pyval(
    [[{'foo': 12}, {'foo': 33}], [], [{'foo': 99}]])
st.merge_dims(0, 1)
<StructuredTensor(
  fields={
    "foo": tf.Tensor([12 33 99], shape=(3,), dtype=int32)},
  shape=(3,))>
Аргументы
outer_axis int: Первое измерение в диапазоне измерений для объединения. Может быть отрицательным (для индексирования с последнего измерения).
inner_axis int: Последнее измерение в диапазоне измерений для объединения. Может быть отрицательным (для индексирования с последнего измерения).
Возвращаемое значение
Копия этого тензора с объединенными указанными измерениями в одно измерение. Форма возвращаемого тензора будет self.shape[:outer_axis] + [N] + self.shape[inner_axis + 1:], где N — общее число срезов в объединенных измерениях.

nrows

Просмотреть исходный код

nrows()

Количество строк в этом StructuredTensor (если ранг > 0).

Это означает длину внешнего измерения StructuredTensor.

Обратите внимание, что если self.rank > 1, то это равно количеству строк первой части строки. То есть self.nrows() == self.row_partitions[0].nrows().

В противном случае self.nrows() будет первым измерением значений поля.

Возвращаемое значение
Скалярное целое число Tensor (или None, если self.rank == 0).

partition_outer_dimension

Просмотреть исходный код

partition_outer_dimension(
    row_partition
)

Разделяет внешнее измерение этого StructuredTensor.

Возвращает новый StructuredTensor с теми же значениями, что и self, где внешнее измерение разделено на два (возможно, разрозненных) измерения. Требуется, чтобы у этого StructuredTensor было внешнее измерение (т. е. self.shape.rank > 0).

st = tf.experimental.StructuredTensor.from_pyval(
    [{'foo': 12}, {'foo': 33}, {'foo': 99}])
partition = RowPartition.from_row_lengths([2, 0, 1])
st.partition_outer_dimension(partition)
<StructuredTensor(
  fields={
    "foo": <tf.RaggedTensor [[12, 33], [], [99]]>},
  shape=(3, None))>
Аргументы
row_partition RowPartition.
Возвращаемое значение
StructuredTensor с рангом values.rank + 1.

promote

Просмотреть исходный код

promote(
    source_path, new_name
)

Повышает поле, объединяя измерения между прародителем и родителем.

d = [
 {'docs': [{'tokens':[1, 2]}, {'tokens':[3]}]},
 {'docs': [{'tokens':[7]}]}]
st = tf.experimental.StructuredTensor.from_pyval(d)
st2 =st.promote(('docs','tokens'), 'docs_tokens')
st2[0]['docs_tokens']
<tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>
st2[1]['docs_tokens']
<tf.Tensor: shape=(1,), dtype=int32, numpy=array([7], dtype=int32)>
Аргументы
source_path путь к полю или подструктуре для повышения; длина должна быть не менее 2.
new_name имя нового поля (должно быть строкой).
Возвращаемое значение
измененный структурированный тензор с новым полем как потомком прародителя исходного пути.
Исключения
ValueError если source_path не является списком или кортежем или имеет длину менее двух, или new_name не является строкой, или ранг source_path неизвестен и он необходим.

to_pyval

Просмотреть исходный код

to_pyval()

Возвращает этот StructuredTensor как вложенный словарь Python или список словарей.

Преобразует этот StructuredTensor в вложенное значение Python:

  • StructTensors с rank=0 преобразуются в словарь с записью для каждого поля. Имена полей используются в качестве ключей, а значения полей преобразуются в значения Python. В частности:

    • Поля тензора скаляра преобразуются в простые значения (такие как int или float или string)
    • Поля тензоров, не являющихся скалярами, и поля RaggedTensor преобразуются во вложенные списки простых значений.
    • Поля StructuredTensor преобразуются рекурсивно с использованием to_pyval.
  • StructTensors с rank>0 преобразуются во вложенные списки Python list, содержащие по одному словарю для каждой структуры (где словарь каждой структуры определяется, как описано выше).

Требуется, чтобы все поля были тензорами Eager.

tf.experimental.StructuredTensor.from_fields(
    {'a': [1, 2, 3]}, [3]).to_pyval()
[{'a': 1}, {'a': 2}, {'a': 3}]

Обратите внимание, что StructuredTensor.from_pyval(pyval).to_pyval() == pyval.

Возвращаемое значение
Вложенный словарь Python или список словарей.

with_shape_dtype

Просмотреть исходный код

with_shape_dtype(
    dtype: tf.dtypes.DType
) -> 'StructuredTensor'

with_updates

Просмотреть исходный код

with_updates(
    updates: Dict[FieldName, Union[_FieldValue, _FieldFn, None]],
    validate: bool = False
) -> 'StructuredTensor'

Создает новый StructuredTensor с обновленными полями.

Если этот StructuredTensor является скаляром, и k — обновляемое FieldName, а v — новое значение, то:

result[k] = v              # If (k, v) is in updates and v is a FieldValue
result[k] = f(self[k])     # If (k, f) is in updates and f is a FieldFn
result[k] = self[k]        # If k is in self.field_names but not in updates

Если этот StructuredTensor имеет ранг N и форму [D1...DN], то каждое FieldValue v в updates должно иметь форму [D1...DN, ...], т. е. с префиксом той же формы, что и StructuredTensor. Тогда результирующий StructuredTensor будет иметь:

result[i1...iN][k] = v[i1...iN]                        # (k, v) in updates
result[i1...iN][k] = f(self.field_value(k))[i1...iN]   # (k, f) in updates
result[i1...iN][k] = self[i1...iN][k]                  # k not in updates

Обратите внимание, что result.shape всегда равно self.shape (но формы вложенных StructuredTensors могут быть изменены, если они обновляются новыми значениями).

Аргументы
updates Словарь, сопоставляющий FieldName либо с FieldValue для обновления, либо с FieldFn, которая преобразует значение для данного FieldName. FieldName может быть строкой для прямого поля или последовательностью строк для ссылки на вложенное подполе. FieldFn — это функция, принимающая FieldValue в качестве входных данных и возвращающая FieldValue. Все остальные поля копируются в новое StructuredTensor. Можно указать новые FieldName (чтобы добавить новые поля), но только к существующим StructuredTensor; это не создаст автоматически новые вложенные структуры — но можно создать целую вложенную подструктуру StructureTensor и установить её в существующую структуру. Если новое значение устанавливается в None, оно удаляется.
validate Если True, то добавляются операции проверки во время выполнения, которые проверяют, что значения полей имеют совместимые формы во внешних измерениях shape.rank.
Возвращает
StructuredTensor.
Возбуждает
ValueError: Если какой-либо из ключей FieldName указывает на несуществующие подструктуры, если родительские и дочерние узлы обновляются, если формы изменяются, если дано удаление для несуществующего поля или если функция преобразования FieldFn задана для FieldName, которое ещё не существует.

Примеры:

shoes_us = tf.experimental.StructuredTensor.from_pyval([
   {"age": 12, "nicknames": ["Josaphine"],
      "shoes": {"sizes": [8.0, 7.5, 7.5]} },
   {"age": 82, "nicknames": ["Bob", "Bobby"],
       "shoes": {"sizes": [11.0, 11.5, 12.0]} },
   {"age": 42, "nicknames": ["Elmo"],
       "shoes": {"sizes": [9.0, 9.5, 10.0]} }])
def us_to_europe(t):
  return tf.round(t * 2.54 + 17.0)  # Rough approximation.
shoe_sizes_key = ("shoes", "sizes")
shoes_eu = shoes_us.with_updates({shoe_sizes_key: us_to_europe})
shoes_eu.field_value(shoe_sizes_key)
<tf.RaggedTensor [[37.0, 36.0, 36.0], [45.0, 46.0, 47.0],
[40.0, 41.0, 42.0]]>

__eq__

Просмотреть исходный код

__eq__(
    other
)

Возвращает self==value.

__getitem__

Просмотреть исходный код

__getitem__(
    key
)

Возвращает указанную часть этого StructuredTensor.

  • Если struct_tensor скалярно (т. е. одна структура), то struct_tensor[f] возвращает значение поля f (где f должна быть строкой).

  • Если struct_tensor нескалярно (т. е. вектор или многомерный тензор структур), struct_tensor[i] выбирает элемент или срез тензора с помощью стандартной семантики Python (например, отрицательные значения индексируются с конца). i может иметь один из следующих типов:

    • int константа
    • string константа
    • скалярное целое число Tensor
    • slice содержащая целочисленные константы и/или скалярные целые числа Tensor

Многомерная индексация

StructuredTensor поддерживает многомерную индексацию. Т. е. key может быть tuple значений, индексирующих или срезающих несколько измерений одновременно. Например, если people — это вектор структур, каждая из которых имеет векторно-значное поле names, то people[3, 'names', 0] эквивалентно people[3]['names'][0]; и people[:, 'names', :] вернёт (возможно, разреженный) массив имён с формой [num_people, num_names_per_person].

Аргументы
key Указывает, какую часть StructuredTensor нужно вернуть.
Возвращает
Tensor, StructuredTensor или RaggedTensor.

__ne__

Просмотреть исходный код

__ne__(
    other
)

Возвращает self!=value.

© 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/experimental/StructuredTensor

Spec-Zone.ru

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