tf.Tensor
tf.Tensor представляет собой многомерный массив элементов.
Все элементы имеют один известный тип данных.
При написании программы TensorFlow основным объектом, с которым выполняются операции и который передается между компонентами, является tf.Tensor.
tf.Tensor обладает следующими свойствами:
- один тип данных (например, float32, int32 или string)
- форма
TensorFlow поддерживает немедленное выполнение и выполнение графа. При немедленном выполнении операции вычисляются сразу. При выполнении графа строится вычислительный граф для последующего вычисления.
По умолчанию TensorFlow использует немедленное выполнение. В приведенном ниже примере результаты умножения матриц вычисляются сразу.
# 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)
Обратите внимание, что при немедленном выполнении может выясниться, что ваши 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 | 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). При немедленном выполнении (или внутри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, представляющий форму этого тензора.
При немедленном выполнении форма всегда известна полностью.
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 операции не выполняются, и формы могут быть неизвестны (подробности см. в руководстве по Concrete Functions).
@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)
| Возвращает | |
|---|---|
tf.TensorShape, представляющий форму этого тензора. |
ref
ref()
Возвращает хешируемый объект-ссылку на этот тензор.
Основное назначение этого API — добавлять тензоры в множество или словарь. Мы не можем добавлять тензоры в множество или словарь, поскольку начиная с TensorFlow 2.0 tensor.__hash__() больше недоступен.
Следующий код начиная с версии 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Выполните трассировку функции; подробности см. в руководстве по Concrete Functions.
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__(
name=None
)
__add__
__add__(
y
)
__and__
__and__(
y
)
__array__
__array__(
dtype=None
)
__bool__
__bool__()
Вспомогательный метод, который предотвращает использование тензора в качестве значения bool в Python.
Это переопределение вызывает 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 | Tensor. Должен иметь один из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
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 | Tensor. Должен иметь один из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
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 | Tensor. Должен иметь один из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
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 | Tensor. Должен иметь один из следующих типов: float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64. |
y | Tensor. Должен иметь тот же тип, что и x. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
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 | Объект Tensor. Должен иметь один из следующих типов: bfloat16, half, float32, float64, int8, int16, int32, int64, complex64, complex128. |
name | Имя операции (необязательно). |
| Возвращает | |
|---|---|
Объект Tensor. Имеет тот же тип, что и x. Если |
__nonzero__
__nonzero__()
Вспомогательный метод, не позволяющий использовать тензор в качестве bool Python.
Это аналог __bool__() выше для Python 2.x.
| Вызывает исключение | |
|---|---|
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