tf.Tensor
A tf.Tensor представляет собой многомерный массив элементов.
Все элементы имеют один и тот же известный тип данных.
При написании программы TensorFlow основным объектом, с которым манипулируют и передают, является tf.Tensor.
У tf.Tensor есть следующие свойства:
- один тип данных (например, float32, int32 или string)
- форма
TensorFlow поддерживает выполнение в режиме eager и в режиме построения графа. При выполнении в режиме eager операции вычисляются немедленно. При выполнении в режиме построения графа создается вычислительный граф для последующего вычисления.
TensorFlow по умолчанию выполняется в режиме eager. В приведенном ниже примере результаты умножения матриц вычисляются немедленно.
# Compute some values using a Tensor c = tf.constant([[1.0, 2.0], [3.0, 4.0]]) d = tf.constant([[1.0, 1.0], [0.0, 1.0]]) e = tf.matmul(c, d) print(e) tf.Tensor( [[1. 3.] [3. 7.]], shape=(2, 2), dtype=float32)
Обратите внимание, что во время выполнения в режиме eager вы можете обнаружить, что ваши Tensors на самом деле являются объектами типа EagerTensor. Это внутренняя деталь, но она предоставляет доступ к полезной функции numpy:
type(e) <class '...ops.EagerTensor'> print(e.numpy()) [[1. 3.] [3. 7.]]
В TensorFlow tf.function — это распространённый способ определения выполнения графа.
Форма тензора (то есть ранг тензора и размерность каждого измерения) не всегда может быть полностью известна. В определениях tf.function форма может быть известна лишь частично.
Большинство операций производят тензоры с полностью известными формами, если формы их входных данных также полностью известны, но в некоторых случаях форму тензора можно определить только во время выполнения.
Доступны несколько специализированных тензоров: см. tf.Variable, tf.constant, tf.placeholder, tf.sparse.SparseTensor и tf.RaggedTensor.
a = np.array([1, 2, 3]) b = tf.constant(a) a[0] = 4 print(b) # tf.Tensor([4 2 3], shape=(3,), dtype=int64)
Примечание: это деталь реализации, которая может быть изменена, и пользователи не должны полагаться на это поведение.
Дополнительную информацию о тензорах см. в руководстве.
| Атрибуты | |
|---|---|
dtype | Количество элементов в этом тензоре. |
name | |
ndim | |
shape | Возвращает tf.TensorShape, представляющий форму этого тензора.
t = tf.constant([1,2,3,4,5]) t.shape TensorShape([5])
В
См. |
Методы
eval
eval(
feed_dict=None, session=None
)
Вычисляет этот тензор в Session.
Примечание: Если вы не используете библиотекиcompat.v1, вам не нужно это (илиfeed_dictилиSession). При выполнении в режиме eager (или внутриtf.function) вам не нужно вызыватьeval.
Вызов этого метода выполнит все предыдущие операции, необходимые для получения входных данных для операции, производящей этот тензор.
Примечание: Прежде чем вызватьTensor.eval(), его граф должен быть запущен в сессии, и либо должна быть доступна стандартная сессия, либоsessionдолжна быть явно указана.
| Аргументы | |
|---|---|
feed_dict | Словарь, сопоставляющий объекты Tensor с значениями подстановки. См. tf.Session.run для описания допустимых значений подстановки. |
session | (Необязательно.) Сессия Session, используемая для вычисления этого тензора. Если не указано, будет использоваться стандартная сессия. |
| Возвращаемое значение | |
|---|---|
| Массив NumPy, соответствующий значению этого тензора. |
experimental_ref
experimental_ref()
УСТАРЕВШАЯ ФУНКЦИЯ
get_shape
get_shape() -> tf.TensorShape
Возвращает tf.TensorShape, представляющий форму этого тензора.
При выполнении в режиме eager форма всегда полностью известна.
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) print(a.shape) (2, 3)
tf.Tensor.get_shape() эквивалентно tf.Tensor.shape.
При выполнении в tf.function или при построении модели с помощью tf.keras.Input, Tensor.shape может вернуть частичную форму (включая None для неизвестных измерений). См. tf.TensorShape для получения дополнительной информации.
inputs = tf.keras.Input(shape = [10]) # Unknown batch size print(inputs.shape) (None, 10)
Форма вычисляется с помощью функций вывода формы, зарегистрированных для каждой tf.Operation.
Возвращаемый tf.TensorShape определяется на стадии построения, без выполнения базового ядра. Это не tf.Tensor. Если вам нужен тензор формы, либо преобразуйте tf.TensorShape в tf.constant, либо используйте функцию tf.shape(tensor), которая возвращает форму тензора на стадии выполнения.
Это полезно для отладки и выдачи ранних ошибок. Например, при прослеживании tf.function операции не выполняются, формы могут быть неизвестны (см. Руководство по конкретным функциям для получения дополнительных сведений).
@tf.function
def my_matmul(a, b):
result = a@b
# the `print` executes during tracing.
print("Result shape: ", result.shape)
return resultФункции вывода формы распространяют формы по возможности:
f = my_matmul.get_concrete_function( tf.TensorSpec([None,3]), tf.TensorSpec([3,5])) Result shape: (None, 5)
Прослеживание может завершиться неудачей, если будет обнаружено несовпадение форм:
cf = my_matmul.get_concrete_function( tf.TensorSpec([None,3]), tf.TensorSpec([4,5])) Traceback (most recent call last): ValueError: Dimensions must be equal, but are 3 and 4 for 'matmul' (op: 'MatMul') with input shapes: [?,3], [4,5].
В некоторых случаях, выведенная форма может иметь неизвестные размеры. Если вызывающий объект имеет дополнительную информацию о значениях этих размеров, tf.ensure_shape или Tensor.set_shape() можно использовать для дополнения выведенной формы.
@tf.function
def my_fun(a):
a = tf.ensure_shape(a, [5, 5])
# the `print` executes during tracing.
print("Result shape: ", a.shape)
return acf = my_fun.get_concrete_function( tf.TensorSpec([None, None])) Result shape: (5, 5)
| Возвращает | |
|---|---|
A tf.TensorShape представляющий форму этого тензора. |
ref
ref()
Возвращает хешируемый объект ссылки на этот тензор.
Основной сценарий использования этого API — размещение тензоров в наборе/словаре. Мы не можем поместить тензоры в набор/словарь, так как tensor.__hash__() больше недоступен, начиная с Tensorflow 2.0.
Следующее будет вызывать исключение, начиная с версии 2.0
x = tf.constant(5)
y = tf.constant(10)
z = tf.constant(10)
tensor_set = {x, y, z}
Traceback (most recent call last):
TypeError: Tensor is unhashable. Instead, use tensor.ref() as the key.
tensor_dict = {x: 'five', y: 'ten'}
Traceback (most recent call last):
TypeError: Tensor is unhashable. Instead, use tensor.ref() as the key.Вместо этого мы можем использовать tensor.ref().
tensor_set = {x.ref(), y.ref(), z.ref()}
x.ref() in tensor_set
True
tensor_dict = {x.ref(): 'five', y.ref(): 'ten', z.ref(): 'ten'}
tensor_dict[y.ref()]
'ten'Кроме того, объект ссылки предоставляет .deref() функцию, которая возвращает исходный тензор.
x = tf.constant(5) x.ref().deref() <tf.Tensor: shape=(), dtype=int32, numpy=5>
set_shape
set_shape(
shape
)
Обновляет форму этого тензора.
Примечание: Рекомендуется использоватьtf.ensure_shapeвместоTensor.set_shape, так какtf.ensure_shapeобеспечивает лучшую проверку ошибок программирования и может создавать гарантии для оптимизации компилятора.
При использовании жадного исполнения это работает как утверждение формы. Здесь формы совпадают:
t = tf.constant([[1,2,3]]) t.set_shape([1, 3])
Передача None в новой форме позволяет любое значение для этой оси:
t.set_shape([1,None])
Если передана несовместимая форма, генерируется ошибка.
t.set_shape([1,5]) Traceback (most recent call last): ValueError: Tensor's shape (1, 3) is not compatible with supplied shape [1, 5]
При выполнении в tf.function или построении модели с использованием tf.keras.Input, Tensor.set_shape будет сливать заданную shape с текущей формой этого тензора и устанавливать форму тензора в объединённое значение (см. tf.TensorShape.merge_with для получения подробностей):
t = tf.keras.Input(shape=[None, None, 3]) print(t.shape) (None, None, None, 3)
Размеры, установленные на None, не обновляются:
t.set_shape([None, 224, 224, None]) print(t.shape) (None, 224, 224, 3)
Основной сценарий использования — предоставление дополнительной информации о форме, которую нельзя вывести только из графа.
Например, если вам известно, что все изображения в наборе данных имеют форму [28,28,3], вы можете установить её с помощью tf.set_shape:
@tf.function
def load_image(filename):
raw = tf.io.read_file(filename)
image = tf.image.decode_png(raw, channels=3)
# the `print` executes during tracing.
print("Initial shape: ", image.shape)
image.set_shape([28, 28, 3])
print("Final shape: ", image.shape)
return imageОтслеживайте функцию, см. Руководство по конкретным функциям для получения подробностей.
cf = load_image.get_concrete_function(
tf.TensorSpec([], dtype=tf.string))
Initial shape: (None, None, 3)
Final shape: (28, 28, 3)Аналогично, функция tf.io.parse_tensor могла бы возвращать тензор с любой формой, даже если tf.rank неизвестна. Если вы знаете, что все ваши сериализованные тензоры будут 2d, установите её с помощью set_shape:
@tf.function
def my_parse(string_tensor):
result = tf.io.parse_tensor(string_tensor, out_type=tf.float32)
# the `print` executes during tracing.
print("Initial shape: ", result.shape)
result.set_shape([None, None])
print("Final shape: ", result.shape)
return resultОтслеживайте функцию
concrete_parse = my_parse.get_concrete_function(
tf.TensorSpec([], dtype=tf.string))
Initial shape: <unknown>
Final shape: (None, None)Убедитесь, что это работает:
t = tf.ones([5,3], dtype=tf.float32) serialized = tf.io.serialize_tensor(t) print(serialized.dtype) <dtype: 'string'> print(serialized.shape) () t2 = concrete_parse(serialized) print(t2.shape) (5, 3)
# Serialize a rank-3 tensor t = tf.ones([5,5,5], dtype=tf.float32) serialized = tf.io.serialize_tensor(t) # The function still runs, even though it `set_shape([None,None])` t2 = concrete_parse(serialized) print(t2.shape) (5, 5, 5)
| Аргументы | |
|---|---|
shape | A TensorShape представляющий форму этого тензора, a TensorShapeProto, список, кортеж или None. |
| Возбуждает | |
|---|---|
ValueError | Если shape несовместима с текущей формой этого тензора. |
__abs__
__abs__(
name=None
)
__add__
__add__(
y
)
__and__
__and__(
y
)
__array__
__array__(
dtype=None
)
__bool__
__bool__()
Метод-заглушка для предотвращения использования тензора в качестве Python bool.
Эта перегрузка вызывает TypeError, когда пользователь непреднамеренно рассматривает Tensor как булеву (чаще всего в операторе if или while), в коде, который не был преобразован AutoGraph. Например:
if tf.constant(True): # Will raise. # ... if tf.constant(5) < tf.constant(7): # Will raise. # ...
| Возбуждает | |
|---|---|
TypeError. |
__div__
__div__(
y
)
__eq__
__eq__(
other
)
__floordiv__
__floordiv__(
y
)
__ge__
__ge__(
y: Annotated[Any, tf.raw_ops.Any],
name=None
) -> Annotated[Any, tf.raw_ops.Any]
Возвращает истинное значение (x >= y) поэлементно.
Примечание: math.greater_equal поддерживает вещание. Подробнее о вещании здесь
Пример:
x = tf.constant([5, 4, 6, 7]) y = tf.constant([5, 2, 5, 10]) tf.math.greater_equal(x, y) ==> [True, True, True, False] x = tf.constant([5, 4, 6, 7]) y = tf.constant([5]) tf.math.greater_equal(x, y) ==> [True, False, True, True]
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одним из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor типа bool. |
__getitem__
__getitem__(
slice_spec, var=None
)
Перегрузка для Tensor.getitem.
Эта операция извлекает указанный фрагмент из тензора. Запись похожа на NumPy с ограничением, что в настоящее время поддерживается только базовая индексация. Это означает, что в настоящее время использование нескалярного тензора в качестве входных данных не допускается.
Некоторые полезные примеры:
# Strip leading and trailing 2 elements foo = tf.constant([1,2,3,4,5,6]) print(foo[2:-2]) # => [3,4] # Skip every other row and reverse the order of the columns foo = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) print(foo[::2,::-1]) # => [[3,2,1], [9,8,7]] # Use scalar tensors as indices on both dimensions print(foo[tf.constant(0), tf.constant(2)]) # => 3 # Insert another dimension foo = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) print(foo[tf.newaxis, :, :]) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[:, tf.newaxis, :]) # => [[[1,2,3]], [[4,5,6]], [[7,8,9]]] print(foo[:, :, tf.newaxis]) # => [[[1],[2],[3]], [[4],[5],[6]], [[7],[8],[9]]] # Ellipses (3 equivalent operations) foo = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) print(foo[tf.newaxis, :, :]) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[tf.newaxis, ...]) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[tf.newaxis]) # => [[[1,2,3], [4,5,6], [7,8,9]]] # Masks foo = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) print(foo[foo > 2]) # => [3, 4, 5, 6, 7, 8, 9]
| Примечания | |
|---|---|
|
| Цель в API | |
|---|---|
Этот метод представлен в API TensorFlow, чтобы разработчики библиотек могли зарегистрировать обработку для Tensor.getitem, чтобы разрешить ему обрабатывать пользовательские составные тензоры и другие пользовательские объекты. Символ API не предназначен для прямого вызова пользователями и отображается в документации, сгенерированной TensorFlow. |
| Аргументы | |
|---|---|
tensor | Объект tensor.Tensor. |
slice_spec | Аргументы для Tensor.getitem. |
var | В случае присваивания среза переменной, объект Variable, по которому выполняется срез (т.е. тензор — это только для чтения представление этой переменной). |
| Возвращаемое значение | |
|---|---|
| Соответствующий срез "tensor", основанный на "slice_spec". |
| Исключения | |
|---|---|
ValueError | Если диапазон среза имеет отрицательную длину. |
TypeError | Если индексы среза не являются целыми числами, слайсами, эллипсами, tf.newaxis или скалярными тензорами int32/int64. |
__gt__
__gt__(
y: Annotated[Any, tf.raw_ops.Any],
name=None
) -> Annotated[Any, tf.raw_ops.Any]
Возвращает истинностное значение (x > y) поэлементно.
Примечание: math.greater поддерживает векторизацию. Подробнее о векторизации см. здесь
Пример:
x = tf.constant([5, 4, 6]) y = tf.constant([5, 2, 5]) tf.math.greater(x, y) ==> [False, True, True] x = tf.constant([5, 4, 6]) y = tf.constant([5]) tf.math.greater(x, y) ==> [False, False, True]
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor типа bool. |
__invert__
__invert__(
name=None
)
__iter__
__iter__()
__le__
__le__(
y: Annotated[Any, tf.raw_ops.Any],
name=None
) -> Annotated[Any, tf.raw_ops.Any]
Возвращает истинностное значение (x <= y) поэлементно.
Примечание: math.less_equal поддерживает векторизацию. Подробнее о векторизации см. здесь
Пример:
x = tf.constant([5, 4, 6]) y = tf.constant([5]) tf.math.less_equal(x, y) ==> [True, True, False] x = tf.constant([5, 4, 6]) y = tf.constant([5, 6, 6]) tf.math.less_equal(x, y) ==> [True, True, True]
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor типа bool. |
__len__
__len__()
__lt__
__lt__(
y: Annotated[Any, tf.raw_ops.Any],
name=None
) -> Annotated[Any, tf.raw_ops.Any]
Возвращает истинностное значение (x < y) поэлементно.
Примечание: math.less поддерживает векторизацию. Подробнее о векторизации см. здесь
Пример:
x = tf.constant([5, 4, 6]) y = tf.constant([5]) tf.math.less(x, y) ==> [False, True, False] x = tf.constant([5, 4, 6]) y = tf.constant([5, 6, 7]) tf.math.less(x, y) ==> [False, True, True]
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor типа bool. |
__matmul__
__matmul__(
y
)
__mod__
__mod__(
y
)
__mul__
__mul__(
y
)
__ne__
__ne__(
other
)
__neg__
__neg__(
name=None
) -> Annotated[Any, tf.raw_ops.Any]
Вычисляет численное отрицательное значение поэлементно.
То есть, \(y = -x\).
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: bfloat16, half, float32, float64, int8, int16, int32, int64, complex64, complex128. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor. Имеет тот же тип, что и x. Если |
__nonzero__
__nonzero__()
Метод-заглушка, чтобы предотвратить использование тензора как Python-объекта.
Это аналог метода Python 2.x __bool__().
| Исключения | |
|---|---|
TypeError. |
__or__
__or__(
y
)
__pow__
__pow__(
y
)
__radd__
__radd__(
x
)
__rand__
__rand__(
x
)
__rdiv__
__rdiv__(
x
)
__rfloordiv__
__rfloordiv__(
x
)
__rmatmul__
__rmatmul__(
x
)
__rmod__
__rmod__(
x
)
__rmul__
__rmul__(
x
)
__ror__
__ror__(
x
)
__rpow__
__rpow__(
x
)
__rsub__
__rsub__(
x
)
__rtruediv__
__rtruediv__(
x
)
__rxor__
__rxor__(
x
)
__sub__
__sub__(
y
)
__truediv__
__truediv__(
y
)
__xor__
__xor__(
y
)
| Переменные класса | |
|---|---|
| OVERLOADABLE_OPERATORS |
{
'__abs__',
'__add__',
'__and__',
'__div__',
'__eq__',
'__floordiv__',
'__ge__',
'__getitem__',
'__gt__',
'__invert__',
'__le__',
'__lt__',
'__matmul__',
'__mod__',
'__mul__',
'__ne__',
'__neg__',
'__or__',
'__pow__',
'__radd__',
'__rand__',
'__rdiv__',
'__rfloordiv__',
'__rmatmul__',
'__rmod__',
'__rmul__',
'__ror__',
'__rpow__',
'__rsub__',
'__rtruediv__',
'__rxor__',
'__sub__',
'__truediv__',
'__xor__'
}
|
© 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/Tensor