tf.Tensor
| Просмотреть исходный код на GitHub |
Тензор — это многомерный массив элементов, представленный в
tf.Tensor(
op, value_index, dtype
)
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.
Дополнительную информацию о тензорах см. в руководстве.
| Аргументы | |
|---|---|
op | Operation. Operation вычисления этого тензора. |
value_index | int. Индекс конечной точки операции, которая производит этот тензор. |
dtype | DType. Тип элементов, хранящихся в этом тензоре. |
| Исключения | |
|---|---|
TypeError | Если операция не является Operation. |
| Атрибуты | |
|---|---|
device | Имя устройства, на котором будет произведён этот тензор, или None. |
dtype | DType элементов в этом тензоре. |
graph | Graph, который содержит этот тензор. |
name | Строковое имя этого тензора. |
op | Operation операции, которая производит этот тензор в качестве выходного значения. |
shape | Возвращает tf.TensorShape, который представляет форму этого тензора. t = tf.constant([1,2,3,4,5]) t.shape TensorShape([5])
В
См. |
value_index | Индекс этого тензора в выходных данных его Operation. |
Методы
consumers
consumers()
Возвращает список Operations, которые потребляют этот тензор.
| Возвращает | |
|---|---|
Список Operations. |
eval
eval(
feed_dict=None, session=None
)
Вычисляет этот тензор в Session.
Примечание: Если вы не используете библиотекиcompat.v1, вам это не нужно (илиfeed_dictилиSession). При использовании неявного выполнения (или внутри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, представляющую форму этого тензора.
При неявном выполнении форма всегда полностью известна.
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].
В некоторых случаях выведенная форма может иметь неизвестные размерности. Если у вызывающей стороны есть дополнительная информация о значениях этих размерностей, можно использовать Tensor.set_shape() для дополнения выведенной формы.
@tf.function
def my_fun(a):
a.set_shape([5, 5])
# the `print` executes during tracing.
print("Result shape: ", a.shape)
return a
cf = my_fun.get_concrete_function( tf.TensorSpec([None, None])) Result shape: (5, 5)
| Возвращаемое значение | |
|---|---|
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
)
Обновляет форму этого тензора.
При использовании жадного выполнения это работает как утверждение формы. Здесь формы совпадают:
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 неизвестна. Если вы знаете, что все ваши сериализованные тензоры будут двумерными, установите это с помощью 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 | Представляющий форму этого тензора TensorShape, TensorShapeProto, список, кортеж или None. |
| Исключения | |
|---|---|
ValueError | Если shape не совместима с текущей формой этого тензора. |
__abs__
__abs__(
x, name=None
)
Вычисляет абсолютное значение тензора.
Принимая во внимание тензор целочисленных или дробных значений, эта операция возвращает тензор того же типа, где каждый элемент содержит абсолютное значение соответствующего элемента на входе.
Принимая во внимание тензор x комплексных чисел, эта операция возвращает тензор типа float32 или float64, который представляет собой абсолютное значение каждого элемента в x. Для комплексного числа \(a + bj\), его абсолютное значение вычисляется как \(\sqrt{a^2
- b^2}\). Например:
x = tf.constant([[-2.25 + 4.75j], [-3.25 + 5.75j]])
tf.abs(x)
<tf.Tensor: shape=(2, 1), dtype=float64, numpy=
array([[5.25594901],
[6.60492241]])>
| Аргументы | |
|---|---|
x | Tensor или SparseTensor типа float16, float32, float64, int32, int64, complex64 или complex128. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
Tensor или SparseTensor той же размерности, типа и разреженности, что и x, с абсолютными значениями. Обратите внимание, что для входных данных complex64 или complex128 возвращаемый Tensor будет иметь тип float32 или float64 соответственно. Если |
__add__
__add__(
x, y
)
Операция, вызываемая оператором Tensor.add.
Цель в API:
This method is exposed in TensorFlow's API so that library developers can register dispatching for <a href="../tf/Tensor#__add__"><code>Tensor.__add__</code></a> to allow it to handle custom composite tensors & other custom objects. The API symbol is not intended to be called by users directly and does appear in TensorFlow's generated documentation.
| Аргументы | |
|---|---|
x | Левая часть оператора +. |
y | Правая часть оператора +. |
name | необязательное имя операции. |
| Возвращаемое значение | |
|---|---|
Результат поэлементной операции +. |
__and__
__and__(
x, y
)
Логическая функция И.
Операция работает для следующих типов входных данных:
- Два отдельных элемента типа
bool - Один
tf.Tensorтипаboolи один отдельныйbool, где результат вычисляется путём применения логического И к отдельному элементу каждого элемента в более крупном тензоре. - Два объекта
tf.Tensorтипаboolодинаковой формы. В этом случае результат будет поэлементным логическим И двух входных тензоров.
Использование:
a = tf.constant([True]) b = tf.constant([False]) tf.math.logical_and(a, b) <tf.Tensor: shape=(1,), dtype=bool, numpy=array([False])>
c = tf.constant([True]) x = tf.constant([False, True, True, False]) tf.math.logical_and(c, x) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, True, True, False])>
y = tf.constant([False, False, True, True]) z = tf.constant([False, True, False, True]) tf.math.logical_and(y, z) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, False, False, True])>
| Аргументы | |
|---|---|
x | tf.Tensor типа bool. |
y | tf.Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
tf.Tensor типа bool с размерами, совпадающими с x или y. |
__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__(
x, y
)
Делит x / y поэлементно (используя семантику оператора деления Python 2). (устарело)
Примечание: Предпочтительнее использовать оператор деления тензоров или tf.divide, которые подчиняются семантике оператора деления Python 3.
Эта функция делит x и y, принуждая к семантике Python 2. То есть, если x и y оба являются целыми числами, то результат будет целым числом. Это в отличие от Python 3, где деление с / всегда является числом с плавающей точкой, а деление с // всегда целым числом.
| Аргументы | |
|---|---|
x | Tensor числитель вещественного числового типа. |
y | Tensor знаменатель вещественного числового типа. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
x / y возвращает частное x и y. |
__eq__
__eq__(
other
)
Операция, вызываемая оператором Tensor.eq.
Сравнивает два тензора поэлементно на равенство, если они совместимы с транспонированием; или возвращает False, если они не совместимы с транспонированием. (Обратите внимание, что это поведение отличается от tf.math.equal, который вызывает исключение, если два тензора не совместимы с транспонированием.)
Цель в API:
Этот метод представлен в API TensorFlow, чтобы разработчики библиотек могли зарегистрировать обработку для Tensor.eq, чтобы он мог обрабатывать пользовательские составные тензоры и другие пользовательские объекты.
Символ API не предназначен для прямого вызова пользователями и отображается в сгенерированной документации TensorFlow.
| Аргументы | |
|---|---|
self | Левая часть оператора ==. |
other | Правая часть оператора ==. |
| Возвращаемое значение | |
|---|---|
Результат элементного оператора ==, или False, если аргументы не совместимы для трансляции. |
__floordiv__
__floordiv__(
x, y
)
Делит элементные значения, округляя в сторону наименьшего целого числа.
То же самое, что и tf.compat.v1.div(x,y) для целых чисел, но использует tf.floor(tf.compat.v1.div(x,y)) для аргументов с плавающей точкой, чтобы результат всегда был целым числом (хотя, возможно, целым числом, представленным в виде с плавающей точкой). Этот оператор генерируется x // y операцией целочисленного деления по модулю в Python 3 и в Python 2.7 с from __future__ import division.
x и y должны иметь один и тот же тип, и результат также будет иметь тот же тип.
| Аргументы | |
|---|---|
x | Tensor числитель вещественного числового типа. |
y | Tensor знаменатель вещественного числового типа. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
x / y округлено вниз. |
| Исключения | |
|---|---|
TypeError | Если входные данные комплексные. |
__ge__
__ge__(
x, y, name=None
)
Возвращает значение истины для (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__(
tensor, 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].eval()) # => [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].eval()) # => [[3,2,1], [9,8,7]] # Use scalar tensors as indices on both dimensions print(foo[tf.constant(0), tf.constant(2)].eval()) # => 3 # Insert another dimension foo = tf.constant([[1,2,3], [4,5,6], [7,8,9]]) print(foo[tf.newaxis, :, :].eval()) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[:, tf.newaxis, :].eval()) # => [[[1,2,3]], [[4,5,6]], [[7,8,9]]] print(foo[:, :, tf.newaxis].eval()) # => [[[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, :, :].eval()) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[tf.newaxis, ...].eval()) # => [[[1,2,3], [4,5,6], [7,8,9]]] print(foo[tf.newaxis].eval()) # => [[[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].eval()) # => [3, 4, 5, 6, 7, 8, 9]
Примечания:
-
tf.newaxisэквивалентенNoneкак в NumPy. - Неявное эллипсис ставится в конце
slice_spec - Расширенная индексация NumPy в настоящее время не поддерживается.
Цель в API:
Этот метод представлен в API TensorFlow, чтобы разработчики библиотек могли зарегистрировать обработку для Tensor.getitem, чтобы он мог обрабатывать пользовательские составные тензоры и другие пользовательские объекты.
Символ API не предназначен для прямого вызова пользователями и отображается в документации, сгенерированной TensorFlow.
| Аргументы | |
|---|---|
tensor | Объект ops.Tensor. |
slice_spec | Аргументы для Tensor.getitem. |
var | В случае присваивания срезу переменной, объект Variable, по которому выполняется срезы (т.е. тензор является только для чтения представлением этой переменной). |
| Возвращаемое значение | |
|---|---|
| Соответствующий срез "tensor", основанный на "slice_spec". |
| Исключения | |
|---|---|
ValueError | Если диапазон среза имеет отрицательную длину. |
TypeError | Если индексы среза не являются целыми числами, слайсами, эллипсами, tf.newaxis или скалярными тензорами типа int32/int64. |
__gt__
__gt__(
x, y, name=None
)
Возвращает логическое значение (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__(
x, name=None
)
Возвращает логическое значение NOT x поэлементно.
Пример:
tf.math.logical_not(tf.constant([True, False])) <tf.Tensor: shape=(2,), dtype=bool, numpy=array([False, True])>
| Аргументы | |
|---|---|
x | A Tensor типа bool. A Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor типа bool. |
__iter__
__iter__()
__le__
__le__(
x, y, name=None
)
Возвращает логическое значение (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__(
x, y, name=None
)
Возвращает логическое значение (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__(
x, y
)
Умножает матрицу a на матрицу b, получая a * b.
Входы должны, после любых транспонирований, быть тензорами ранга >= 2, где внутренние 2 измерения задают измерения для умножения матриц, а любые внешние измерения задают размер соответствующей пакетной обработки.
Обе матрицы должны быть одного типа. Поддерживаемые типы: float16, float32, float64, int32, complex64, complex128.
Любую матрицу можно транспонировать или сопрячь и транспонировать на лету, установив соответствующий флаг в True. По умолчанию они равны False.
Если одна или обе матрицы содержат много нулей, можно использовать более эффективный алгоритм умножения, установив соответствующие флаги a_is_sparse или b_is_sparse в True. По умолчанию они равны False.
Оптимизация доступна только для обычных матриц (тензоры ранга 2) с типами данных bfloat16 или float32.
Простое умножение матриц 2-мерного тензора:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
a # 2-D tensor
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)>
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
b # 2-D tensor
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[ 7, 8],
[ 9, 10],
[11, 12]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58, 64],
[139, 154]], dtype=int32)>
Умножение матриц в пакете с формой пакета [2]:
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3])
a # 3-D tensor
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]], dtype=int32)>
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2])
b # 3-D tensor
<tf.Tensor: shape=(2, 3, 2), dtype=int32, numpy=
array([[[13, 14],
[15, 16],
[17, 18]],
[[19, 20],
[21, 22],
[23, 24]]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2, 2), dtype=int32, numpy=
array([[[ 94, 100],
[229, 244]],
[[508, 532],
[697, 730]]], dtype=int32)>
Так как python >= 3.5 поддерживается оператор @ (см. PEP 465). В TensorFlow он просто вызывает функцию tf.matmul(), поэтому следующие строки эквивалентны:
d = a @ b @ [[10], [11]] d = tf.matmul(tf.matmul(a, b), [[10], [11]])
| Аргументы | |
|---|---|
a | tf.Tensor типа float16, float32, float64, int32, complex64, complex128 и ранга > 1. |
b | tf.Tensor с тем же типом и рангом, что и a. |
transpose_a | Если True, a транспонируется перед умножением. |
transpose_b | Если True, b транспонируется перед умножением. |
adjoint_a | Если True, a сопрягается и транспонируется перед умножением. |
adjoint_b | Если True, b сопрягается и транспонируется перед умножением. |
a_is_sparse | Если True, a обрабатывается как разреженная матрица. Обратите внимание, что это не поддерживает tf.sparse.SparseTensor, это просто оптимизации, предполагающие, что большинство значений в a равны нулю. См. tf.sparse.sparse_dense_matmul для некоторой поддержки умножения tf.sparse.SparseTensor. |
b_is_sparse | Если True, b обрабатывается как разреженная матрица. Обратите внимание, что это не поддерживает tf.sparse.SparseTensor, это просто оптимизации, предполагающие, что большинство значений в a равны нулю. См. tf.sparse.sparse_dense_matmul для некоторой поддержки умножения tf.sparse.SparseTensor. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
Объект tf.Tensor того же типа, что и a и b, где каждая внутренняя матрица является произведением соответствующих матриц в a и b, например, если все атрибуты транспонирования или сопряжения равны False:
| |
Note | Это матричное произведение, а не поэлементное произведение. |
| Исключения | |
|---|---|
ValueError | Если transpose_a и adjoint_a, или transpose_b и adjoint_b оба установлены в значение True. |
__mod__
__mod__(
x, y
)
Возвращает остаток от деления по элементам. Когда x < 0 xor y < 0 равно
истине, это соответствует семантике Python, и результат здесь согласуется с округлением вниз. Например, floor(x / y) * y + mod(x, y) = x.
Примечание: math.floormod поддерживает вещание. Подробнее о вещании здесь
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: int32, int64, uint64, bfloat16, half, float32, float64. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
A Tensor. Имеет тот же тип, что и x. |
__mul__
__mul__(
x, y
)
Выполняет поэлементное умножение для "DenseDense" и "DenseSparse".
__ne__
__ne__(
other
)
Операция, вызываемая оператором Tensor.ne.
Сравнивает два тензора поэлементно на неравенство, если они совместимы для векторизации; или возвращает True, если они не совместимы для векторизации. (Обратите внимание, что это поведение отличается от tf.math.not_equal, который вызывает исключение, если два тензора не совместимы для векторизации.)
Цель в API:
Этот метод экспонируется в API TensorFlow, чтобы разработчики библиотек могли регистрировать диспетчеризацию для Tensor.ne, чтобы позволить ему обрабатывать пользовательские составные тензоры и другие пользовательские объекты.
Символ API не предназначен для прямого вызова пользователями и отображается в сгенерированной документации TensorFlow.
| Аргументы | |
|---|---|
self | Левая часть оператора != . |
other | Правая часть оператора != . |
| Возвращаемое значение | |
|---|---|
Результат поэлементной операции !=, или True, если аргументы не совместимы для векторизации. |
__neg__
__neg__(
x, name=None
)
Вычисляет численное отрицание по элементам.
То есть, \(y = -x\).
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: bfloat16, half, float32, float64, int8, int16, int32, int64, complex64, complex128. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. Имеет тот же тип, что и x. Если |
__nonzero__
__nonzero__()
Метод-заглушка, предотвращающий использование тензора в качестве Python bool.
Это аналог Python 2.x для __bool__() выше.
| Возбуждает | |
|---|---|
TypeError. |
__or__
__or__(
x, y
)
Возвращает логическое ИЛИ значений x и y поэлементно.
Примечание: math.logical_or поддерживает векторизацию. Подробнее о векторизации здесь
| Аргументы | |
|---|---|
x | A Tensor типа bool. |
y | A Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor типа bool. |
__pow__
__pow__(
x, y
)
Вычисляет степень одного значения относительно другого.
Даны тензор x и тензор y, эта операция вычисляет \(x^y\) для соответствующих элементов в x и y. Например:
x = tf.constant([[2, 2], [3, 3]]) y = tf.constant([[8, 16], [2, 3]]) tf.pow(x, y) # [[256, 65536], [9, 27]]
| Аргументы | |
|---|---|
x | A Tensor типа float16, float32, float64, int32, int64, complex64, или complex128. |
y | A Tensor типа float16, float32, float64, int32, int64, complex64, или complex128. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. |
__radd__
__radd__(
y, x
)
Операция, вызываемая оператором Tensor.add.
Цель в API:
This method is exposed in TensorFlow's API so that library developers can register dispatching for <a href="../tf/Tensor#__add__"><code>Tensor.__add__</code></a> to allow it to handle custom composite tensors & other custom objects. The API symbol is not intended to be called by users directly and does appear in TensorFlow's generated documentation.
| Аргументы | |
|---|---|
x | Левая часть оператора + . |
y | Правая часть оператора + . |
name | Необязательное имя операции. |
| Возвращает | |
|---|---|
Результат поэлементной операции + . |
__rand__
__rand__(
y, x
)
Функция логического И.
Операция работает для следующих типов ввода:
- Два отдельных элемента типа
bool - Один
tf.Tensorтипаboolи один отдельныйbool, где результат вычисляется путём применения логического И с отдельным элементом к каждому элементу в большем тензоре. - Два объекта
tf.Tensorтипаboolодинаковой формы. В этом случае результат будет элементно-логическим И двух входных тензоров.
Использование:
a = tf.constant([True]) b = tf.constant([False]) tf.math.logical_and(a, b) <tf.Tensor: shape=(1,), dtype=bool, numpy=array([False])>
c = tf.constant([True]) x = tf.constant([False, True, True, False]) tf.math.logical_and(c, x) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, True, True, False])>
y = tf.constant([False, False, True, True]) z = tf.constant([False, True, False, True]) tf.math.logical_and(y, z) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, False, False, True])>
| Аргументы | |
|---|---|
x | Тип bool tf.Tensor. |
y | tf.Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
tf.Tensor типа bool с такими же размерами, как у x или y. |
__rdiv__
__rdiv__(
y, x
)
Делит x / y поэлементно (используя семантику оператора деления Python 2). (устарело)
Примечание: Предпочтительнее использовать оператор деления тензоров или tf.divide, которые следуют семантике оператора деления Python 3.
Эта функция делит x и y, принуждая использовать семантику Python 2. То есть, если x и y являются целыми числами, то результат будет целым числом. Это отличается от Python 3, где деление с / всегда является вещественным числом, а деление с // всегда является целым числом.
| Аргументы | |
|---|---|
x | Tensor числитель вещественного числового типа. |
y | Tensor знаменатель вещественного числового типа. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
x / y возвращает частное от деления x на y. |
__rfloordiv__
__rfloordiv__(
y, x
)
Делит x / y поэлементно, округляя к ближайшему меньшему целому.
То же самое, что и tf.compat.v1.div(x,y) для целых чисел, но использует tf.floor(tf.compat.v1.div(x,y)) для аргументов с плавающей точкой, чтобы результат всегда был целым числом (хотя, возможно, целое число, представленное как число с плавающей точкой). Этот оператор генерируется оператором x // y целочисленного деления с округлением вниз в Python 3 и в Python 2.7 с from __future__ import division.
x и y должны иметь один и тот же тип, и результат также будет иметь тот же тип.
| Аргументы | |
|---|---|
x | Tensor числитель вещественного числового типа. |
y | Tensor знаменатель вещественного числового типа. |
name | Имя операции (необязательно). |
| Возвращаемое значение | |
|---|---|
x / y с округлением вниз. |
| Исключения | |
|---|---|
TypeError | Если входные данные являются комплексными. |
__rmatmul__
__rmatmul__(
y, x
)
Умножает матрицу a на матрицу b, получая a * b.
Входы должны, после любых транспонирований, быть тензорами ранга >= 2, где внутренние 2 измерения задают допустимые размеры матричного умножения, а любые дополнительные внешние измерения задают соответствие размерам пакета.
Обе матрицы должны быть одного типа. Поддерживаемые типы: float16, float32, float64, int32, complex64, complex128.
Любая из матриц может быть транспонирована или сопряжена (с сопряжённым транспонированием) на лету, установив соответствующий флаг в True. По умолчанию они False.
Если одна или обе матрицы содержат много нулей, можно использовать более эффективный алгоритм умножения, установив соответствующий a_is_sparse или b_is_sparse флаг в значение True. По умолчанию они False. Эта оптимизация доступна только для обычных матриц (тензоров ранга 2) с типами данных bfloat16 или float32.
Простое умножение матриц 2-мерного тензора:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
a # 2-D tensor
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)>
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
b # 2-D tensor
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[ 7, 8],
[ 9, 10],
[11, 12]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58, 64],
[139, 154]], dtype=int32)>
Умножение матриц с пакетной формой [2]:
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3])
a # 3-D tensor
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]], dtype=int32)>
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2])
b # 3-D tensor
<tf.Tensor: shape=(2, 3, 2), dtype=int32, numpy=
array([[[13, 14],
[15, 16],
[17, 18]],
[[19, 20],
[21, 22],
[23, 24]]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2, 2), dtype=int32, numpy=
array([[[ 94, 100],
[229, 244]],
[[508, 532],
[697, 730]]], dtype=int32)>
Так как в Python >= 3.5 поддерживается оператор @ (см. PEP 465). В TensorFlow он просто вызывает функцию tf.matmul(), поэтому следующие строки эквивалентны:
d = a @ b @ [[10], [11]] d = tf.matmul(tf.matmul(a, b), [[10], [11]])
| Аргументы | |
|---|---|
a | tf.Tensor типа float16, float32, float64, int32, complex64, complex128 и ранга > 1. |
b | tf.Tensor с тем же типом и рангом, что и a. |
transpose_a | Если True, a транспонируется перед умножением. |
transpose_b | Если True, b транспонируется перед умножением. |
adjoint_a | Если True, a сопрягается и транспонируется перед умножением. |
adjoint_b | Если True, b сопрягается и транспонируется перед умножением. |
a_is_sparse | Если True, a обрабатывается как разреженная матрица. Обратите внимание, что это не поддерживает tf.sparse.SparseTensor, это просто оптимизации, предполагающие, что большинство значений в a равны нулю. См. tf.sparse.sparse_dense_matmul для поддержки умножения tf.sparse.SparseTensor. |
b_is_sparse | Если True, b обрабатывается как разреженная матрица. Обратите внимание, что это не поддерживает tf.sparse.SparseTensor, это просто оптимизации, предполагающие, что большинство значений в a равны нулю. См. tf.sparse.sparse_dense_matmul для поддержки умножения tf.sparse.SparseTensor. |
name | Название операции (необязательно). |
| Возвращаемое значение | |
|---|---|
tf.Tensor того же типа, что и a и b, где каждая внутренняя матрица является произведением соответствующих матриц в a и b, например, если все атрибуты транспонирования или сопряжения False:
| |
Note | Это произведение матриц, а не поэлементное произведение. |
| Исключения | |
|---|---|
ValueError | Если transpose_a и adjoint_a, или transpose_b и adjoint_b оба установлены в значение True. |
__rmod__
__rmod__(
y, x
)
Возвращает остаток от деления по элементам. Когда x < 0 или y < 0 истинно, это соответствует семантике Python, в том что результат здесь согласован с делением с округлением к ближайшему меньшему целому. Например, floor(x / y) * y + mod(x, y) = x.
Примечание: math.floormod поддерживает векторизацию. Подробнее о векторизации здесь
| Аргументы | |
|---|---|
x | А Tensor. Должен быть одного из следующих типов: int32, int64, uint64, bfloat16, half, float32, float64. |
y | А Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. Имеет тот же тип, что и x. |
__rmul__
__rmul__(
y, x
)
Выполняет поэлементное умножение для "DenseDense" и "DenseSparse".
__ror__
__ror__(
y, x
)
Возвращает логическое ИЛИ x и y поэлементно.
Примечание: math.logical_or поддерживает векторизацию. Подробнее о векторизации здесь
| Аргументы | |
|---|---|
x | A Tensor типа bool. |
y | A Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor типа bool. |
__rpow__
__rpow__(
y, x
)
Вычисляет степень одного значения относительно другого.
Даны тензор x и тензор y, эта операция вычисляет \(x^y\) для соответствующих элементов в x и y. Например:
x = tf.constant([[2, 2], [3, 3]]) y = tf.constant([[8, 16], [2, 3]]) tf.pow(x, y) # [[256, 65536], [9, 27]]
| Аргументы | |
|---|---|
x | A Tensor типа float16, float32, float64, int32, int64, complex64, или complex128. |
y | A Tensor типа float16, float32, float64, int32, int64, complex64, или complex128. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. |
__rsub__
__rsub__(
y, x
)
Возвращает x - y поэлементно.
Примечание: Subtract поддерживает векторизацию. Подробнее о векторизации здесь
| Аргументы | |
|---|---|
x | A Tensor. Должен быть одного из следующих типов: bfloat16, half, float32, float64, uint8, int8, uint16, int16, int32, int64, complex64, complex128, uint32. |
y | A Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
A Tensor. Имеет тот же тип, что и x. |
__rtruediv__
__rtruediv__(
y, x
)
Делит x / y поэлементно (используя семантику оператора деления Python 3).
Примечание: Предпочтительно использовать оператор тензора или tf.divide, которые подчиняются семантике оператора деления Python.
Эта функция принудительно устанавливает семантику оператора деления Python 3, где все целочисленные аргументы сначала преобразуются в тип с плавающей точкой. Этот оператор генерируется обычным оператором деления x / y в Python 3 и в Python 2.7 с from __future__ import division. Если вам нужна целочисленная операция деления, которая округляется вниз, используйте x // y или tf.math.floordiv.
x и y должны иметь одинаковый числовой тип. Если входные данные являются числами с плавающей точкой, выходной результат будет иметь тот же тип. Если входные данные являются целыми, входные данные преобразуются в float32 для int8 и int16 и float64 для int32 и int64 (соответствуя поведению Numpy).
| Args | |
|---|---|
x | Tensor числитель числового типа. |
y | Tensor знаменатель числового типа. |
name | Имя операции (необязательно). |
| Returns | |
|---|---|
x / y вычисленное в формате с плавающей точкой. |
| Raises | |
|---|---|
TypeError | Если x и y имеют разные типы данных. |
__rxor__
__rxor__(
y, x
)
Функция логического XOR.
x ^ y = (x | y) & ~(x & y)
Операция работает для следующих типов входных данных:
- Два отдельных элемента типа
bool - Один
tf.Tensorтипаboolи один отдельныйbool, где результат будет вычислен путем применения логического XOR с одиночным элементом к каждому элементу в большем тензоре. - Два объекта
tf.Tensorтипаboolодинаковой формы. В этом случае результат будет элементарным логическим XOR двух входных тензоров.
Использование:
a = tf.constant([True]) b = tf.constant([False]) tf.math.logical_xor(a, b) <tf.Tensor: shape=(1,), dtype=bool, numpy=array([ True])>
c = tf.constant([True]) x = tf.constant([False, True, True, False]) tf.math.logical_xor(c, x) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([ True, False, False, True])>
y = tf.constant([False, False, True, True]) z = tf.constant([False, True, False, True]) tf.math.logical_xor(y, z) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, True, True, False])>
| Args | |
|---|---|
x | Тип tf.Tensor bool. |
y | tf.Tensor типа bool. |
name | Имя операции (необязательно). |
| Returns | |
|---|---|
tf.Tensor типа bool с размером, соответствующим размеру x или y. |
__sub__
__sub__(
x, y
)
Возвращает x - y по элементам.
Примечание: Subtract поддерживает векторизацию. Подробнее о векторизации здесь
| Args | |
|---|---|
x | Tensor. Должен быть одного из следующих типов: bfloat16, half, float32, float64, uint8, int8, uint16, int16, int32, int64, complex64, complex128, uint32. |
y | Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Returns | |
|---|---|
Tensor. Имеет тот же тип, что и x. |
__truediv__
__truediv__(
x, y
)
Делит x / y поэлементно (используя семантику оператора деления Python 3).
Примечание: Предпочтительно использовать оператор тензора или tf.divide, которые следуют семантике оператора деления Python.
Эта функция принудительно применяет семантику оператора деления Python 3, где все целочисленные аргументы сначала преобразуются к типу с плавающей точкой. Этот оператор генерируется обычным оператором деления x / y в Python 3 и в Python 2.7 с from __future__ import division. Если вы хотите целочисленное деление с округлением вниз, используйте x // y или tf.math.floordiv.
x и y должны иметь одинаковый числовой тип. Если входные данные являются числами с плавающей точкой, выходной тип будет таким же. Если входные данные являются целыми числами, они преобразуются в float32 для int8 и int16 и в float64 для int32 и int64 (соответствуя поведению Numpy).
| Аргументы | |
|---|---|
x | Tensor числитель числового типа. |
y | Tensor знаменатель числового типа. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
x / y вычисленное с плавающей точкой. |
| Возможные исключения | |
|---|---|
TypeError | Если x и y имеют разные типы данных. |
__xor__
__xor__(
x, y
)
Логическая функция XOR.
x ^ y = (x | y) & ~(x & y)
Операция работает со следующими типами входных данных:
- Два отдельных элемента типа
bool - Один
tf.Tensorтипаboolи один отдельныйbool, где результат вычисляется путем применения логического XOR к отдельному элементу ко всем элементам более крупного тензора. - Два
tf.Tensorобъекта типаboolодной и той же формы. В этом случае результат будет представлять собой поэлементный логический XOR двух входных тензоров.
Использование:
a = tf.constant([True]) b = tf.constant([False]) tf.math.logical_xor(a, b) <tf.Tensor: shape=(1,), dtype=bool, numpy=array([ True])>
c = tf.constant([True]) x = tf.constant([False, True, True, False]) tf.math.logical_xor(c, x) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([ True, False, False, True])>
y = tf.constant([False, False, True, True]) z = tf.constant([False, True, False, True]) tf.math.logical_xor(y, z) <tf.Tensor: shape=(4,), dtype=bool, numpy=array([False, True, True, False])>
| Аргументы | |
|---|---|
x | tf.Tensor типа bool. |
y | tf.Tensor типа bool. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
tf.Tensor типа bool с размером, равным размеру x или y. |
Переменные класса
-
OVERLOADABLE_OPERATORS
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/Tensor