tf.TensorShape
Представляет форму Tensor.
Наследуется от: TraceType
tf.TensorShape(
dims
)
Используется в блокнотах
| Используется в руководстве | Используется в учебных материалах |
|---|---|
t = tf.constant([[1,2,3],[4,5,6]]) t.shape TensorShape([2, 3])
TensorShape — это статическое представление формы тензора. При выполнении в eager-режиме форма тензора всегда полностью определена, но при трассировке tf.function она может быть одной из следующих:
-
Полностью известная форма: известно число измерений и размер каждого измерения. Например,
TensorShape([16, 256]) -
Частично известная форма: известно число измерений, но размер одного или нескольких измерений неизвестен. Например,
TensorShape([None, 256]) -
Неизвестная форма: неизвестно число измерений и размер всех измерений. Например,
TensorShape(None)
Во время трассировки функции t.shape вернет объект TensorShape, представляющий форму тензора в том виде, в каком она известна во время трассировки. Это статическое представление будет определено лишь частично в случаях, когда точная форма зависит от значений внутри тензоров. Чтобы получить динамическое представление, используйте tf.shape(t), которая вернет тензор, представляющий полностью определенную форму t. Так можно выразить логику, изменяющую формы тензоров, создавая другие тензоры, зависящие от динамической формы t.
Примечание:tf.RaggedTensor.shapeтакже возвращаетtf.TensorShape; длины любых неоднородных измерений неизвестны (None).
Например, эта функция выводит TensorShape' (t.shape), when you trace the function, and returns a tensor <a href="../tf/shape"><code>tf.shape(t)</code></a> for given inputt`:
@tf.function
def get_dynamic_shape(t):
print("tracing...")
print(f"static shape is {t.shape}")
return tf.shape(t)Простой вызов функции трассирует ее с полностью заданной статической формой:
result = get_dynamic_shape(tf.constant([[1, 1, 1], [0, 0, 0]])) tracing... static shape is (2, 3) result.numpy() array([2, 3], dtype=int32)
Однако tf.function также может трассировать функцию с частично заданной (или даже не заданной) формой:
cf1 = get_dynamic_shape.get_concrete_function(tf.TensorSpec(
shape=[None, 2]))
tracing...
static shape is (None, 2)
cf1(tf.constant([[1., 0],[1, 0],[1, 0]])).numpy()
array([3, 2], dtype=int32)cf2 = get_dynamic_shape.get_concrete_function(tf.TensorSpec(shape=None)) tracing... static shape is <unknown> cf2(tf.constant([[[[[1., 0]]]]])).numpy() array([1, 1, 1, 1, 2], dtype=int32)
Если тензор создан операцией типа "Foo", его форма может быть выведена, если для "Foo" зарегистрирована функция формы. Подробную информацию о функциях формы и их регистрации см. в разделе Функции формы. Кроме того, можно явно задать форму с помощью tf.Tensor.ensure_shape.
| Аргументы | |
|---|---|
dims | Список измерений или None, если форма не задана. |
| Исключения | |
|---|---|
TypeError | Если dims нельзя преобразовать в список измерений. |
| Атрибуты | |
|---|---|
dims | Устарело. Возвращает список измерений этой формы. Рекомендуется использовать |
ndims | Устаревший метод доступа к rank. |
rank | Возвращает ранг этой формы или None, если он не задан. |
Методы
as_list
as_list()
Возвращает список целых чисел или None для каждого измерения.
| Возвращает | |
|---|---|
Список целых чисел или None для каждого измерения. |
| Исключения | |
|---|---|
ValueError | Если self — неизвестная форма с неизвестным рангом. |
as_proto
as_proto()
Возвращает эту форму в виде TensorShapeProto.
assert_has_rank
assert_has_rank(
rank
)
Вызывает исключение, если self несовместима с заданным rank.
| Аргументы | |
|---|---|
rank | Целое число. |
| Исключения | |
|---|---|
ValueError | Если self не представляет форму с заданным rank. |
assert_is_compatible_with
assert_is_compatible_with(
other
)
Вызывает исключение, если self и other не представляют одну и ту же форму.
Этот метод можно использовать, чтобы проверить, существует ли форма, которую представляют и self, и other.
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Исключения | |
|---|---|
ValueError | Если self и other не представляют одну и ту же форму. |
assert_is_fully_defined
assert_is_fully_defined()
Вызывает исключение, если self определена не полностью во всех измерениях.
| Исключения | |
|---|---|
ValueError | Если для self неизвестно значение хотя бы одного измерения. |
assert_same_rank
assert_same_rank(
other
)
Вызывает исключение, если ранги self и other несовместимы.
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Исключения | |
|---|---|
ValueError | Если self и other представляют формы с разными рангами. |
concatenate
concatenate(
other
)
Возвращает результат объединения измерений в self и other.
Примечание: Еслиselfилиotherполностью неизвестна, при объединении информация о другой форме будет потеряна. В будущем мы, возможно, добавим поддержку объединения с сохранением этой информации для использования при срезах.
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Возвращает | |
|---|---|
TensorShape, измерения которой являются результатом объединения измерений в self и other. |
experimental_as_proto
experimental_as_proto() -> tensor_shape_pb2.TensorShapeProto
Возвращает представление экземпляра TensorShape в формате proto.
experimental_from_proto
@classmethod
experimental_from_proto(
proto: tensor_shape_pb2.TensorShapeProto
) -> 'TensorShape'
Возвращает экземпляр TensorShape на основе сериализованного proto.
experimental_type_proto
@classmethod experimental_type_proto() -> Type[tensor_shape_pb2.TensorShapeProto]
Возвращает тип proto, используемый для сериализации TensorShape.
is_compatible_with
is_compatible_with(
other
)
Возвращает True тогда и только тогда, когда self совместима с other.
Две формы, возможно определенные не полностью, совместимы, если существует полностью определенная форма, которую могут представлять обе формы. Благодаря этому отношение совместимости позволяет коду вывода форм работать с частично определенными формами. Например:
TensorShape(None) совместима со всеми формами.
TensorShape([None, None]) совместима со всеми двумерными формами, например TensorShape([32, 784]), а также с TensorShape(None). Она несовместима, например, с TensorShape([None]) или TensorShape([None, None, None]).
TensorShape([32, None]) совместима со всеми двумерными формами, у которых размер нулевого измерения равен 32, а также с TensorShape([None, None]) и TensorShape(None). Она несовместима, например, с TensorShape([32]), TensorShape([32, None, 1]) или TensorShape([64, None]).
TensorShape([32, 784]) совместима с самой собой, а также с TensorShape([32, None]), TensorShape([None, 784]), TensorShape([None, None]) и TensorShape(None). Она несовместима, например, с TensorShape([32, 1, 784]) или TensorShape([None]).
Отношение совместимости рефлексивно и симметрично, но не транзитивно. Например, TensorShape([32, 784]) совместима с TensorShape(None), а TensorShape(None) совместима с TensorShape([4, 4]), но TensorShape([32, 784]) несовместима с TensorShape([4, 4]).
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Возвращает | |
|---|---|
True тогда и только тогда, когда self совместима с other. |
is_fully_defined
is_fully_defined()
Возвращает True тогда и только тогда, когда self полностью определена во всех измерениях.
is_subtype_of
is_subtype_of(
other: tf.types.experimental.TraceType
) -> bool
Возвращает True тогда и только тогда, когда self является подтипом other.
Форма A является подтипом формы B, если форма B может ее корректно представлять:
TensorShapeлюбого ранга является подтипомTensorShape(None).-
TensorShape одинакового ранга ковариантны, то есть
TensorShape([A1, A2, ..])является подтипомTensorShape([B1, B2, ..])тогда и только тогда, когда An является подтипом Bn.An является подтипом Bn тогда и только тогда, когда An == Bn или Bn равно None.
Между TensorShape с разными заданными рангами нет отношения подтипов.
Отношение подтипов рефлексивно и транзитивно, но не симметрично.
Некоторые примеры:
TensorShape([32, 784])является подтипомTensorShape(None), аTensorShape([4, 4])также является подтипомTensorShape(None), ноTensorShape([32, 784])иTensorShape([4, 4])не являются подтипами друг друга.Все двумерные формы являются подтипами
TensorShape([None, None]), напримерTensorShape([32, 784]). Например, сTensorShape([None])илиTensorShape([None, None, None])отношения подтипов нет.TensorShape([32, None])также является подтипомTensorShape([None, None])иTensorShape(None). Она не является подтипом, например,TensorShape([32]),TensorShape([32, None, 1]),TensorShape([64, None])илиTensorShape([None, 32]).TensorShape([32, 784])является подтипом самой себя, а такжеTensorShape([32, None]),TensorShape([None, 784]),TensorShape([None, None])иTensorShape(None). Например, сTensorShape([32, 1, 784])илиTensorShape([None])отношения подтипов нет.
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Возвращает | |
|---|---|
True тогда и только тогда, когда self является подтипом other. |
merge_with
merge_with(
other
)
Возвращает TensorShape, объединяющую сведения из self и other.
Измерения в self и other объединяются поэлементно согласно следующим правилам:
Dimension(n).merge_with(Dimension(None)) == Dimension(n) Dimension(None).merge_with(Dimension(n)) == Dimension(n) Dimension(None).merge_with(Dimension(None)) == Dimension(None) # raises ValueError for n != m Dimension(n).merge_with(Dimension(m))
ts = tf.TensorShape([1,2]) ot1 = tf.TensorShape([1,2]) ts.merge_with(ot).as_list() [1,2]
ot2 = tf.TensorShape([1,None]) ts.merge_with(ot2).as_list() [1,2]
ot3 = tf.TensorShape([None, None]) ot3.merge_with(ot2).as_list() [1, None]
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Возвращает | |
|---|---|
TensorShape, содержащая объединенные сведения из self и other. |
| Исключения | |
|---|---|
ValueError | Если self и other несовместимы. |
most_specific_common_supertype
most_specific_common_supertype(
others: Sequence[tf.types.experimental.TraceType]
) -> Optional['TensorShape']
Возвращает наиболее конкретный общий супертип TensorShape для self и others.
TensorShape([None, 1])— наиболее конкретныйTensorShape, являющийся супертипом иTensorShape([2, 1]), иTensorShape([5, 1]). Обратите внимание, чтоTensorShape(None)также является супертипом, но не самым конкретным.-
TensorShape([1, 2, 3])— наиболее конкретныйTensorShape, являющийся супертипом иTensorShape([1, 2, 3]), иTensorShape([1, 2, 3]). Существуют и другие, менее конкретные TensorShape, являющиеся супертипами указанных выше TensorShape, напримерTensorShape([1, 2, None]),TensorShape(None).TensorShape([None, None])— наиболее конкретныйTensorShape, являющийся супертипом иTensorShape([2, None]), иTensorShape([None, 3]). Как и всегда,TensorShape(None)также является супертипом, но не самым конкретным.TensorShape(None) — единственныйTensorShape, являющийся супертипом иTensorShape([1, 2, 3]), иTensorShape([1, 2]). В общем случае для любых двух форм с разными рангами единственным общим супертипом будетTensorShape(None).TensorShape(None)— единственныйTensorShape, являющийся супертипом иTensorShape([1, 2, 3]), иTensorShape(None). В общем случае общим супертипом любой формы сTensorShape(None)будетTensorShape(None).
| Аргументы | |
|---|---|
others | Последовательность TensorShape. |
| Возвращает | |
|---|---|
TensorShape, являющуюся наиболее конкретной формой-супертипом для self и others. None, если такой формы не существует. |
most_specific_compatible_shape
most_specific_compatible_shape(
other
) -> 'TensorShape'
Возвращает наиболее конкретную TensorShape, совместимую с self и other.
TensorShape([None, 1]) — наиболее конкретная TensorShape, совместимая и с TensorShape([2, 1]), и с TensorShape([5, 1]). Обратите внимание, что TensorShape(None) также совместима с указанными выше TensorShape.
TensorShape([1, 2, 3]) — наиболее конкретная TensorShape, совместимая и с TensorShape([1, 2, 3]), и с TensorShape([1, 2, 3]). С указанными выше TensorShape совместимы и менее конкретные формы, например TensorShape([1, 2, None]) и TensorShape(None).
| Аргументы | |
|---|---|
other | Другая TensorShape. |
| Возвращает | |
|---|---|
TensorShape, являющуюся наиболее конкретной совместимой формой для self и other. |
num_elements
num_elements()
Возвращает общее число элементов или none для неполных форм.
with_rank
with_rank(
rank
)
Возвращает форму на основе self с указанным рангом.
Этот метод преобразует полностью неизвестную форму в форму с известным рангом.
| Аргументы | |
|---|---|
rank | Целое число. |
| Возвращает | |
|---|---|
Форму, которая не менее конкретна, чем self, и имеет указанный ранг. |
| Исключения | |
|---|---|
ValueError | Если self не представляет форму с заданным rank. |
with_rank_at_least
with_rank_at_least(
rank
)
Возвращает форму на основе self, ранг которой не меньше заданного.
| Аргументы | |
|---|---|
rank | Целое число. |
| Возвращает | |
|---|---|
Форму, которая не менее конкретна, чем self, и ранг которой не меньше заданного. |
| Исключения | |
|---|---|
ValueError | Если self не представляет форму с рангом не меньше заданного rank. |
with_rank_at_most
with_rank_at_most(
rank
)
Возвращает форму на основе self, ранг которой не больше заданного.
| Аргументы | |
|---|---|
rank | Целое число. |
| Возвращает | |
|---|---|
Форму, которая не менее конкретна, чем self, и ранг которой не больше заданного. |
| Исключения | |
|---|---|
ValueError | Если self не представляет форму с рангом не больше заданного rank. |
__add__
__add__(
other
)
__bool__
__bool__()
Возвращает True, если эта форма содержит ненулевую информацию.
__concat__
__concat__(
other
)
__eq__
__eq__(
other
)
Возвращает True, если self эквивалентна other.
Сначала выполняется попытка преобразовать other в TensorShape. Если преобразование не удается, возникает исключение TypeError. В противном случае сравнивается каждый элемент измерений TensorShape.
- Две полностью известные формы: возвращает True, только если каждый элемент равен соответствующему элементу.
>>> t_a = tf.TensorShape([1,2]) >>> a = [1, 2] >>> t_b = tf.TensorShape([1,2]) >>> t_c = tf.TensorShape([1,2,3]) >>> t_a.__eq__(a) True >>> t_a.__eq__(t_b) True >>> t_a.__eq__(t_c) False
- Две частично известные формы: возвращает True, только если каждый элемент равен соответствующему элементу.
>>> p_a = tf.TensorShape([1,None]) >>> p_b = tf.TensorShape([1,None]) >>> p_c = tf.TensorShape([2,None]) >>> p_a.__eq__(p_b) True >>> t_a.__eq__(p_a) False >>> p_a.__eq__(p_c) False
- Две неизвестные формы: возвращает True.
>>> unk_a = tf.TensorShape(None) >>> unk_b = tf.TensorShape(None) >>> unk_a.__eq__(unk_b) True >>> unk_a.__eq__(t_a) False
| Аргументы | |
|---|---|
other | TensorShape или тип, который можно преобразовать в TensorShape. |
| Возвращает | |
|---|---|
| True, если все размеры равны. |
| Вызывает исключение | |
|---|---|
TypeError, если other нельзя преобразовать в TensorShape. |
__getitem__
__getitem__(
key
)
Возвращает значение измерения или форму в зависимости от ключа.
| Аргументы | |
|---|---|
key | Если key — целое число, возвращает измерение по этому индексу; если же key — срез, возвращает TensorShape, размеры которой выбраны из self с помощью этого среза. |
| Возвращает | |
|---|---|
Целое число, если key — целое число, или TensorShape, если key — срез. |
| Вызывает исключение | |
|---|---|
ValueError | Если key — срез, self полностью неизвестна, а шаг задан. |
__iter__
__iter__()
Возвращает self.dims, если ранг известен, в противном случае вызывает ValueError.
__len__
__len__()
Возвращает ранг этой формы или вызывает ValueError, если он не задан.
__nonzero__
__nonzero__()
Возвращает True, если эта форма содержит ненулевую информацию.
__radd__
__radd__(
other
)
© 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/TensorShape