tf.experimental.StructuredTensor
Многомерная коллекция структур с одной и той же схемой.
Наследует от: BatchableExtensionType, ExtensionType
tf.experimental.StructuredTensor(
fields: Mapping[str, _FieldValue],
ragged_shape: tf.experimental.DynamicRaggedShape
)
StructuredTensor — это многомерная коллекция структур с одной и той же схемой, где:
- Схема — это набор полей, каждое из которых имеет имя и тип.
- Структура сопоставляет каждому полю в схеме значение тензора (которое может быть вложенным StructuredTensor).
Важный частный случай: одномерный StructuredTensor кодирует двумерную таблицу, в которой столбцы представлены гетерогенными Tensor, а строки — соответствующими элементами каждого из этих Tensor.
Внутри StructuredTensor использует кодирование «сначала поля»: для каждого листового поля существует один тензор, в котором хранятся значения этого поля для всех структур в 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. Если Если 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])) Обратите внимание: формы вложенных полей (например, Если у этого |
shape | Статическая форма этого StructuredTensor. Гарантируется, что возвращаемый |
Дочерние классы
Методы
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 | Если указанное field_name не найдено. |
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 | Если задано, принудительно устанавливает этот тип данных для формы. |
| Возвращает | |
|---|---|
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, задающий ожидаемый тип для каждого поля. Если не указан, все вложенные словари преобразуются в StructuredTensor, а все вложенные списки — в Tensor (если ранг<2) или RaggedTensor (если ранг>=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, где внешнее измерение разбито на два (возможно, ragged) измерения. Требуется, чтобы у этого 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 | путь к повышаемому полю или подструктуре; должен содержать не менее двух элементов. |
new_name | имя нового поля (должно быть строкой). |
| Возвращает | |
|---|---|
| изменённый структурированный тензор, в котором новое поле является дочерним элементом родителя второго уровня поля source_path. |
| Вызывает исключение | |
|---|---|
ValueError | если source_path не является списком или кортежем либо содержит меньше двух элементов, new_name не является строкой или ранг source_path неизвестен и необходим. |
to_pyval
to_pyval()
Возвращает этот StructuredTensor в виде вложенного словаря Python или списка словарей.
Преобразует этот StructuredTensor во вложенное значение Python:
-
StructTensorsсrank=0преобразуются в словарь с записью для каждого поля. Имена полей используются в качестве ключей, а значения полей преобразуются в значения Python. В частности:- Скалярные поля Tensor преобразуются в простые значения (например,
int,floatилиstring) - Нескалярные поля Tensor и поля RaggedTensor преобразуются во вложенные списки простых значений.
- Поля StructuredTensor рекурсивно преобразуются с помощью
to_pyval.
- Скалярные поля Tensor преобразуются в простые значения (например,
StructTensorsсrank>0преобразуются во вложенныеlistPython, содержащие по одному словарю для каждой структуры (словарь каждой структуры определяется, как описано выше).
Требуется, чтобы все поля были тензорами 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 (но формы вложенных StructuredTensor могут измениться при обновлении новыми значениями).
| Аргументы | |
|---|---|
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', :] вернёт (возможно, ragged) матрицу имён с формой [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