Что такое тензор в TensorFlow? Форма, тип и... OperaTORs

⚡ Умное резюме

Тензоры — это n-мерные массивы, которые считываются и записываются в каждом вычислении TensorFlow; каждый из них имеет имя, форму и тип данных. В этом пошаговом руководстве рассматриваются константы, переменные, заполнители и операторы, а затем их вычисление в рамках сессии.

  • 🔘 Три объекта недвижимости: Каждый объект tf.Tensor имеет уникальное имя, форму и тип данных.
  • ☑️ Четыре типа тензоров: tf.constant, tf.Variable, tf.placeholder и tf.SparseTensor охватывают классический API.
  • Ранг равен вложенности: Каждая дополнительная пара скобок добавляет одно измерение к кортежу фигуры.
  • 🧪 Отложенная оценка: При выводе операции на экран отображается её определение, а не значение, до тех пор, пока она не будет выполнена в рамках сессии.
  • 🇧🇷 График и сессия: Граф хранит информацию об операциях, которые выполняются в ходе сессии, и возвращает результаты.
  • ⚠️ Примечание к версии: Сессии и заполнители относятся к TensorFlow 1.x и в настоящее время доступны по адресу tf.compat.v1.

Основы TensorFlow: тензор, форма, тип, сессии и т. д. OperaTORs

Что такое Тензор?

Имя TensorFlow Он напрямую выводится из своего основного объекта: тензора. В TensorFlow каждое вычисление включает в себя тензоры. Тензор — это вектор или матрица n-мерности, представляющая все типы данных. Все значения в тензоре имеют одинаковый тип данных с известной (или частично известной) формой, а форма данных определяется размерностью матрицы или массива.

Тензор может быть получен из входных данных или из результата вычислений. В TensorFlow все операции выполняются внутри графа. Граф представляет собой набор вычислений, которые происходят последовательно. Каждая операция называется узлом операции, и узлы соединены друг с другом.

График отображает операции и связи между узлами. Однако значения на нем не показаны. Ребро между узлами представляет собой тензор, то есть способ заполнить операцию данными.

В машинном обучении моделям предоставляется список объектов, называемых векторами признаков. Вектор признаков может быть любого типа данных, и обычно это основной входной параметр, который заполняет тензор. Эти значения поступают в узел операции через тензор, и результат этой операции создает новый тензор, который, в свою очередь, используется в новой операции. Все эти операции можно увидеть на графе.

Представление тензора

В TensorFlow тензор — это набор векторов признаков (то есть массив) n-мерной области. Например, если у нас есть матрица 2×3 со значениями от 1 до 6, мы запишем её в виде матрицы, показанной ниже:

Матрица два на три, содержащая значения от одного до шести в скобках.

TensorFlow представляет эту матрицу как:

[[1, 2, 3], 
   [4, 5, 6]]

Если мы создадим трехмерную матрицу со значениями от 1 до 8, те же данные будут отображены в виде прямоугольника с двумя расположенными друг над другом гранями:

Трехмерный тензор, изображенный в виде прямоугольника со значениями от одного до восьми на двух сложенных гранях.

TensorFlow представляет эту матрицу как:

[ [[1, 2],  
       [[3, 4],  
       [[5, 6],  
       [[7,8] ]

Примечание: Тензор может быть представлен скаляром или иметь форму, включающую более трех измерений. Просто сложнее визуализировать уровни более высокой размерности.

Типы тензоров

В TensorFlow все вычисления проходят через один или несколько тензоров. Объект tf.Tensor имеет три свойства:

  • Уникальный ярлык (имя)
  • Размер (форма)
  • Тип данных (dtype)

Каждая операция, выполняемая с помощью TensorFlow, включает в себя манипулирование тензором. Существует четыре основных типа тензоров, которые вы можете создать:

  • tf.Variable
  • tf.constant
  • tf.placeholder
  • tf.SparseTensor

В этом уроке вы узнаете, как создать tf.constant и tf.Variable.

Прежде чем запускать код, следует помнить об одном моменте: в этом руководстве используется оригинальный API TensorFlow 1.x, где сначала строится граф, а затем выполняется в рамках сессии. TensorFlow 2 по умолчанию работает в режиме немедленного выполнения, поэтому некоторые из приведенных ниже символов были перемещены или удалены. Все они по-прежнему доступны через tf.compat.v1 пространство имен, а таблица сопоставляет каждое из них с его современным аналогом.

Символ TensorFlow 1.x Эквивалент TensorFlow 2
tf.placeholder() Не требуется. Готовность к исполнению приветствуется. Python или напрямую значения NumPy, и tf.function В графическом режиме этот параметр играет ту же роль.
tf.Session() и sess.run() Вызовите операцию напрямую и прочитайте результат, или же оберните вычисления в tf.function.
tf.get_variable() tf.Variable()с простым Python объекты tracИспользуйте переменные вместо коллекций.
tf.global_variables_initializer() Не требуется. А tf.Variable инициализируется в момент создания.
tf.div() tf.divide()Обратите также внимание, что подtraction op is spelled tf.subtract(), Не tf.substract().

Прежде чем приступить к выполнению инструкций, убедитесь, что активирована среда conda, в которой установлен TensorFlow. Эта среда называется hello-tf.

До macOS пользователей:

source activate hello-tf

До Windows пользователей:

activate hello-tf

После этого вы будете готовы импортировать TensorFlow.

# Import tf
import tensorflow as tf

Создайте тензор n-мерности

Вы начинаете с создания одномерного тензора, а именно скаляра.

Для создания тензора можно использовать tf.constant() как показано в приведенном ниже примере формы тензора TensorFlow:

tf.constant(value, dtype, name = "")
arguments

- `value`: Value of n dimension to define the tensor. Optional
- `dtype`: Define the type of data:    
    - `tf.string`: String variable    
    - `tf.float32`: Float variable    
    - `tf.int16`: Integer variable
- "name": Name of the tensor. Optional. By default, `Const_1:0`

Для создания тензора нулевой размерности выполните следующий код.

## rank 0
# Default name
r1 = tf.constant(1, tf.int16) 
print(r1)			

Результат

Tensor("Const:0", shape=(), dtype=int16)

Три части этого выходного сигнала соответствуют трем свойствам тензора, как это наглядно показано в приведенной ниже версии с пояснениями.

Выходные данные тензора снабжены пояснениями, указывающими имя, форму и тип данных.

Вы также можете присвоить тензору собственное имя с помощью... name аргумент.

# Named my_scalar
r2 = tf.constant(1, tf.int16, name = "my_scalar") 
print(r2)

Результат

Tensor("my_scalar:0", shape=(), dtype=int16)

Каждый тензор отображается по своему имени. Каждый объект тензора определяется такими атрибутами, как уникальная метка (имя), размерность (форма) и тип данных TensorFlow (dtype).

Вы можете определить тензор с десятичными значениями или строкой, изменив тип данных.

# Decimal
r1_decimal = tf.constant(1.12345, tf.float32)
print(r1_decimal)
# String
r1_string = tf.constant("Guru99", tf.string)
print(r1_string)

Результат

Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)

Тензор размерности 1 можно создать следующим образом:

## Rank 1
r1_vector = tf.constant([1,3,5], tf.int16)
print(r1_vector)
r2_boolean = tf.constant([True, True, False], tf.bool)
print(r2_boolean)

Результат

Tensor("Const_3:0", shape=(3,), dtype=int16)
Tensor("Const_4:0", shape=(3,), dtype=bool)

Вы можете заметить, что структура TensorFlow состоит всего из одного столбца.

Для создания массива из двух тензоров необходимо закрывать скобки после каждой строки. См. пример формы тензора ниже.

## Rank 2
r2_matrix = tf.constant([ [1, 2],
                          [3, 4] ],tf.int16)
print(r2_matrix)

Результат

Tensor("Const_5:0", shape=(2, 2), dtype=int16)

Матрица имеет 2 строки и 2 столбца, заполненные значениями 1, 2, 3 и 4.

Трехмерная матрица строится путем добавления еще одного уровня скобок.

## Rank 3
r3_matrix = tf.constant([ [[1, 2],
                           [3, 4], 
                           [5, 6]] ], tf.int16)
print(r3_matrix)

Результат

Tensor("Const_6:0", shape=(1, 3, 2), dtype=int16)

Результат соответствует трехмерной диаграмме в виде коробки, показанной ранее в этом уроке.

Форма тензора

При выводе тензора на экран TensorFlow определяет его форму. Однако вы можете прочитать форму непосредственно с помощью TensorFlow. shape имущество.

Ниже вы создаете матрицу, заполненную числами от 10 до 15, и проверяете ее форму. m_shape.

# Shape of tensor
m_shape = tf.constant([ [10, 11],
                        [12, 13],
                        [14, 15] ]                      
                     ) 
m_shape.shape

Результат

TensorShape([Dimension(3), Dimension(2)])

Матрица имеет 3 строки и 2 столбца.

В TensorFlow есть полезные команды для создания вектора или матрицы, заполненной 0 или 1. Например, если вы хотите создать одномерный тензор определенной формы 1, заполненный 10, вы можете запустить приведенный ниже код:

# Create a vector of 0
print(tf.zeros(10))

Результат

Tensor("zeros:0", shape=(10,), dtype=float32)

Это свойство работает и для матрицы. Здесь вы создаете матрицу размером 10×10, заполненную единицами.

# Create a vector of 1
print(tf.ones([10, 10]))

Результат

Tensor("ones:0", shape=(10, 10), dtype=float32)

Вы можете использовать форму заданной матрицы для создания вектора из единиц. Матрица m_shape имеет размерность 3×2, поэтому следующий код создает тензор с 3 строками, заполненными единицами:

# Create a vector of ones with the same number of rows as m_shape
print(tf.ones(m_shape.shape[0]))

Результат

Tensor("ones_1:0", shape=(3,), dtype=float32)

Если вы передадите значение 1 в скобки, вы создадите вектор из единиц, равный количеству столбцов в матрице. m_shape.

# Create a vector of ones with the same number of column as m_shape
print(tf.ones(m_shape.shape[1]))

Результат

Tensor("ones_2:0", shape=(2,), dtype=float32)

Наконец, вы можете создать матрицу 3×2, полностью заполненную единицами.

print(tf.ones(m_shape.shape))

Результат

Tensor("ones_3:0", shape=(3, 2), dtype=float32)

Тип данных

Второе свойство тензора — это тип данных. Тензор может хранить только один тип данных одновременно, и вы можете прочитать данные этого типа с помощью... dtype имущество.

print(m_shape.dtype)

Результат

<dtype: &#x27;int32'>

В некоторых случаях может потребоваться изменить тип данных. В TensorFlow это возможно с помощью tf.cast метод.

Пример

Ниже показано преобразование тензора с плавающей запятой в целое число с помощью cast метод.

# Change type of data
type_float = tf.constant(3.123456789, tf.float32)
type_int = tf.cast(type_float, dtype=tf.int32)
print(type_float.dtype)
print(type_int.dtype)

Результат

<dtype: &#x27;float32'>
<dtype: &#x27;int32'>

TensorFlow автоматически выбирает тип данных, если аргумент не указан при создании тензора. TensorFlow угадывает наиболее вероятный тип данных: если вы передаете текст, например, он определяет его как строку.

Создающий Operaтор

Немного полезного TensorFlow OperaTORs

Вы знаете, как создать тензор с помощью TensorFlow. Пришло время научиться выполнять математические операции.

TensorFlow содержит все основные операции. Вы можете начать с простой операции и использовать метод TensorFlow для вычисления квадратного корня числа. Эта операция проста, поскольку для построения тензора требуется всего один аргумент.

Квадратный корень числа строится с помощью tf.sqrt(x), где x — число с плавающей запятой.

x = tf.constant([2.0], dtype = tf.float32)
print(tf.sqrt(x))

Результат

Tensor("Sqrt:0", shape=(1,), dtype=float32)

Примечание: В результате выполнения функции был возвращен тензорный объект, а не квадратный корень из 2. В этом примере выводится определение тензора, а не фактическое вычисление операции. В разделе «Сессия» ниже вы узнаете, как TensorFlow выполняет операции.

Ниже приведён список часто используемых операций. Принцип тот же: каждая операция требует одного или нескольких аргументов.

  • tf.add(a, b)
  • tf.subtract(a, b)
  • tf.multiply(a, b)
  • tf.divide(a, b)
  • tf.pow(a, b)
  • tf.exp(a)
  • tf.sqrt(a)

Пример

# Add
tensor_a = tf.constant([[1,2]], dtype = tf.int32)
tensor_b = tf.constant([[3, 4]], dtype = tf.int32)

tensor_add = tf.add(tensor_a, tensor_b)
print(tensor_add)

Результат

Tensor("Add:0", shape=(1, 2), dtype=int32)

Code объяснение

Создайте два тензора:

  • один тензор с 1 и 2
  • один тензор с 3 и 4

Вы суммируете оба тензора.

Обратите внимание, что оба тензора должны иметь одинаковую форму. Вы также можете выполнить умножение между двумя тензорами.

# Multiply
tensor_multiply = tf.multiply(tensor_a, tensor_b)
print(tensor_multiply)

Результат

Tensor("Mul:0", shape=(1, 2), dtype=int32)

Переменные показатели

До сих пор вы создавали только постоянные тензоры, что само по себе имеет ограниченную ценность. Данные всегда поступают с разными значениями, и для их обработки можно использовать класс Variable. Переменная представляет собой узел, значения которого изменяются со временем.

Для создания переменной можно использовать tf.get_variable() метод.

tf.get_variable(name = "", values, dtype, initializer)
argument
- `name = ""`: Name of the variable
- `values`: Dimension of the tensor
- `dtype`: Type of data. Optional
- `initializer`: How to initialize the tensor. Optional
If initializer is specified, there is no need to include the `values` as the shape of `initializer` is used.

Например, приведенный ниже код создает двумерную переменную с двумя случайными значениями. По умолчанию TensorFlow возвращает случайное значение. Вы называете переменную var.

# Create a Variable
## Create 2 Randomized values
var = tf.get_variable("var", [1, 2])
print(var.shape)

Результат

(1, 2)

В этом примере вы создаете переменную с одной строкой и двумя столбцами, поэтому в качестве размерности переменной вы передаете [1, 2].

Начальные значения тензора также могут быть равны нулю. Например, при обучении модели вам необходимы начальные значения перед вычислением весов признаков. Ниже эти начальные значения устанавливаются равными нулю.

var_init_1 = tf.get_variable("var_init_1", [1, 2], dtype=tf.int32,  initializer=tf.zeros_initializer)
print(var_init_1.shape)

Результат

(1, 2)

Вы также можете передавать значения константного тензора в переменную. Константный тензор создается с помощью соответствующего метода. tf.constant() и использовать этот тензор для инициализации переменной.

Первые значения переменной — 10, 20, 30 и 40. Новый тензор имеет форму 2×2.

# Create a 2x2 matrix
tensor_const = tf.constant([[10, 20],
[30, 40]])
# Initialize the first value of the tensor equals to tensor_const
var_init_2 = tf.get_variable("var_init_2", dtype=tf.int32,  initializer=tensor_const)
print(var_init_2.shape)

Результат

(2, 2)

Заполнитель

Заполнитель (placeholder) предназначен для ввода данных в тензор. Заполнитель инициализирует данные, которые будут поступать в тензор. Для предоставления заполнителя используется следующий код: feed_dict аргумент, а заполнитель предоставляется только в рамках одной сессии.

В следующем примере вы увидите, как создать заполнитель с помощью этого метода. tf.placeholderВ разделе «Сессия» вы научитесь передавать фактическое значение тензора в качестве параметра-заполнителя.

Синтаксис:

tf.placeholder(dtype,shape=None,name=None )
arguments:
- `dtype`: Type of data
- `shape`: dimension of the placeholder. Optional. By default, shape of the data
- `name`: Name of the placeholder. Optional			
data_placeholder_a = tf.placeholder(tf.float32, name = "data_placeholder_a")
print(data_placeholder_a)

Результат

Tensor("data_placeholder_a:0", dtype=float32)

Сессия

TensorFlow работает вокруг трех основных компонентов:

  • График
  • тензор
  • Сессия
Компоненты Описание
График Граф является основополагающим элементом TensorFlow. Все математические операции (операции) выполняются внутри графа. Граф можно представить как проект, в котором выполняется каждая операция. Узлы представляют эти операции и могут поглощать или создавать новые тензоры.
тензор Тензор представляет данные, которые изменяются между операциями. Ранее вы видели, как инициализировать тензор. Разница между константой и переменной заключается в том, что начальные значения переменной изменяются со временем.
Сессия Сессия выполняет операции с графом. Чтобы передать в граф значения тензора, необходимо открыть сессию. Внутри сессии необходимо запустить оператор для создания выходных данных.

Графики и сессии независимы друг от друга. Вы можете запустить сессию и сохранить полученные значения для дальнейших вычислений.

В примере ниже вы:

  • Создайте два тензора
  • Создать операцию
  • Открыть сеанс
  • Распечатать результат

Шаг 1) Вы создаете два тензора x и y.

## Create, run  and evaluate a session
x = tf.constant([2])
y = tf.constant([4])

Шаг 2) Вы создаете оператор, умножая x на y.

## Create operator
multiply = tf.multiply(x, y)

Шаг 3) Вы открываете сессию. Все вычисления происходят внутри сессии, и когда вы закончите, вам нужно её закрыть.

## Create a session to run the code
sess = tf.Session()
result_1 = sess.run(multiply)
print(result_1)
sess.close()

Результат

[8]

Code объяснение

  • tf.Session()Откройте сессию. Все операции выполняются внутри сессии.
  • run(multiply): выполнить операцию, созданную на шаге 2
  • print(result_1)Наконец, вы можете распечатать результат.
  • close(): Закрыть сессию

Результат показывает 8, что является произведением x и y.

Ещё один способ создать сессию — внутри блока. Преимущество в том, что сессия закрывается автоматически.

with tf.Session() as sess:
    result_2 = multiply.eval()
print(result_2)

Результат

[8]

В контексте сессии вы можете использовать eval() метод выполнения операции. Он эквивалентен run() и делает код более читаемым.

Вы можете создать сеанс и просмотреть значения внутри созданных вами тензоров.

## Check the tensors created before
sess = tf.Session()
print(sess.run(r1))
print(sess.run(r2_matrix))
print(sess.run(r3_matrix))

Результат

1
[[1 2] 
 [3 4]]
[[[1 2]  
  [3 4]  
  [5 6]]]

Переменные по умолчанию пусты, даже после создания тензора. Перед использованием переменной необходимо её инициализировать. Объект tf.global_variables_initializer() Эта функция вызывается для одновременной инициализации значений каждой переменной, что полезно перед обучением модели.

Вы можете проверить значения переменных, которые вы создали ранее. Обратите внимание, что для вычисления тензора необходимо использовать команду `run`.

sess.run(tf.global_variables_initializer())
print(sess.run(var))
print(sess.run(var_init_1))
print(sess.run(var_init_2))

Результат

[[-0.05356491  0.75867283]]
[[0 0]]
[[10 20] 
 [30 40]]

Вы можете использовать созданный ранее заполнитель и передать ему фактическое значение. Вам нужно передать данные в функцию. feed_dict аргумент.

Например, вы возьмете степень 2 заполнителя data_placeholder_a.

import numpy as np
power_a = tf.pow(data_placeholder_a, 2)
with tf.Session() as sess:
    data = np.random.rand(1, 10)
    print(sess.run(power_a, feed_dict={data_placeholder_a: data}))  # Will succeed.

Code объяснение

  • import numpy as np: импортировать NumPy библиотека для создания данных
  • tf.pow(data_placeholder_a, 2): Создать операции
  • np.random.rand(1, 10)Создайте случайный массив данных.
  • feed_dict={data_placeholder_a: data}: Заполните поле-заполнитель данными

Результат

[[0.05478134 0.27213147 0.8803037  0.0398424  0.21172127 0.01444725  0.02584014 0.3763949  0.66022706 0.7565559 ]]

График

TensorFlow отображает каждую операцию с помощью схемы потока данных. Граф потока данных был разработан для того, чтобы показать зависимости данных между отдельными операциями. Математическая формула или алгоритм состоит из ряда последовательных операций, и граф является удобным способом визуализации того, как эти вычисления координируются.

Граф отображает узлы и ребра. Узел представляет собой операцию, то есть единицу вычисления. Ребро — это тензор: оно может создавать новый тензор или обрабатывать входные данные в зависимости от зависимостей между отдельными операциями.

Структура графа связывает операции (т.е. узлы) между собой и показывает, как каждая из них получает данные. Обратите внимание, что граф не отображает результаты операций; он лишь помогает визуализировать связи между ними.

Рассмотрим пример. Представьте, что вы хотите вычислить значение следующей функции:

Формула f(x и z) равна x, умноженному на z, плюс x в квадрате, плюс z, плюс пять.

TensorFlow строит граф для выполнения функции. Граф выглядит следующим образом:

Граф TensorFlow с узлами переменных X и Z, подающими данные в операции умножения, сжатия и три операции сложения.

Вы можете легко увидеть путь, по которому тензоры пройдут, чтобы достичь конечного пункта назначения.

Так, например, add Узел не может быть запущен до того, как оба Mul и Pow Они представили свои результаты. График показывает, что TensorFlow будет:

  1. вычислить x·z в Mul узел и x² в Pow узел
  2. сложите эти два результата вместе в add узел
  3. добавьте z к этой сумме в add_1 узел
  4. добавьте константу 5 в add_2 узел
x = tf.get_variable("x", dtype=tf.int32,  initializer=tf.constant([5]))
z = tf.get_variable("z", dtype=tf.int32,  initializer=tf.constant([6]))
c = tf.constant([5], name =	"constant")
square = tf.constant([2], name =	"square")
f = tf.multiply(x, z) + tf.pow(x, square) + z + c

Code объяснение

  • x: инициализировать переменную с именем x постоянным значением 5.
  • z: инициализировать переменную с именем z постоянным значением 6.
  • c: инициализировать постоянный тензор с именем c постоянным значением 5.
  • Square: инициализировать постоянный тензор, называемый Square, с постоянным значением 2.
  • f: Создайте оператор

В этом примере значения переменных остаются фиксированными. Тензор констант c является постоянным параметром в функции f и принимает фиксированное значение 5; на графике этот параметр обозначен как константа.

Для мощности оператора также был создан постоянный тензор. tf.pow()Это необязательно, но это означает, что показатель степени отображается на графике в виде круга, называемого квадратом.

По графику можно проследить, что происходит с тензорами и почему функция возвращает 66: 5 × 6 + 5² + 6 + 5 равно 66.

Приведённый ниже код выполняет функцию внутри сессии.

init = tf.global_variables_initializer() # prepare to initialize all variables
with tf.Session() as sess:
    init.run() # Initialize x and y
    function_result = f.eval()
print(function_result)

Результат

[66]

Краткий справочник по основам TensorFlow

В четырех таблицах ниже собраны все команды, использованные в этом руководстве, чтобы вы могли найти нужную команду, не пролистывая примеры.

Создайте постоянный тензор

постоянная объект
D0 tf.constant(1, tf.int16)
D1 tf.constant([1,3,5], tf.int16)
D2 tf.constant([ [1, 2], [3, 4] ],tf.int16)
D3 tf.constant([ [[1, 2],[3, 4], [5, 6]] ], tf.int16)

Создать оператор

Создать оператор объект
а + б tf.add(a, b)
а * б tf.multiply(a, b)

Создайте переменный тензор

Создать переменную объект
рандомизированное значение tf.get_variable("var", [1, 2])
инициализировано первое значение tf.get_variable("var_init_2", dtype=tf.int32, initializer=[ [1, 2], [3, 4] ])

Открыть сеанс

Сессия объект
Создать сеанс tf.Session()
Запустить сеанс tf.Session.run()
Оценка тензора variable_name.eval()
Закрыть сеанс sess.close()
Сессия по блоку with tf.Session() as sess:

Часто задаваемые вопросы (FAQ)

Суффикс обозначает индекс выходного значения операции, создавшей тензор. Const:0 означает первый выход операции с именем Const. Операции с несколькими выходами нумеруются как :0, :1 и так далее.

При немедленном выполнении вызовите метод numpy() тензора или передайте его в np.array(). В показанном здесь стиле графа и сессии значение, возвращаемое методом sess.run(), уже является массивом. NumPy массив.

Тензор с переменной длиной строк (ragged tensor) хранит строки разной длины, чего не может сделать обычный тензор. Он создается с помощью tf.ragged.constant и подходит для данных переменной длины, таких как предложения, где заполнение каждой строки до одной ширины привело бы к нерациональному расходованию памяти.

TensorFlow применяет широковещательную обработку: он сравнивает формы, начиная с последнего измерения, и растягивает любую ось длиной в единицу, чтобы она совпадала. Формы, которые не могут быть выровнены таким образом, вместо угадывания вызывают ошибку InvalidArgumentError.

TensorFlow автоматически назначает операции на видимый графический процессор. Чтобы принудительно назначить устройство, оберните код в блок `with tf.device('/GPU:0')`. Сначала используйте `tf.config.list_physical_devices('GPU')`, чтобы убедиться, что устройство действительно обнаружено.

Оба типа данных хранят типизированные n-мерные данные, но тензор является неизменяемым, может работать на графическом или тензорном процессоре и записывает применяемые к нему операции, чтобы можно было вычислить градиенты. Массив NumPy не делает ничего из перечисленного.

Статические средства проверки типов и библиотеки аннотаций форм сравнивают объявленные формы с операциями в вашем коде и отмечают несоответствия до начала выполнения. Вспомогательные функции редактора отображают те же предупреждения непосредственно в коде, что исключает большинство случаев переформатирования шей методом проб и ошибок.ping.

Второй пилот GitHub Предлагается быстрая переработка кода сессий и плейсхолдеров с использованием немедленного выполнения. Проверьте каждое предложение, поскольку оно часто предлагает использовать заглушки tf.compat.v1 там, где существует настоящая замена TensorFlow 2.

Подведем итог этой публикации следующим образом: