Что такое тензор в TensorFlow? Форма, тип и... OperaTORs
⚡ Умное резюме
Тензоры — это n-мерные массивы, которые считываются и записываются в каждом вычислении TensorFlow; каждый из них имеет имя, форму и тип данных. В этом пошаговом руководстве рассматриваются константы, переменные, заполнители и операторы, а затем их вычисление в рамках сессии.
Что такое Тензор?
Имя 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.Variabletf.constanttf.placeholdertf.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: '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: 'float32'> <dtype: '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): выполнить операцию, созданную на шаге 2print(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 отображает каждую операцию с помощью схемы потока данных. Граф потока данных был разработан для того, чтобы показать зависимости данных между отдельными операциями. Математическая формула или алгоритм состоит из ряда последовательных операций, и граф является удобным способом визуализации того, как эти вычисления координируются.
Граф отображает узлы и ребра. Узел представляет собой операцию, то есть единицу вычисления. Ребро — это тензор: оно может создавать новый тензор или обрабатывать входные данные в зависимости от зависимостей между отдельными операциями.
Структура графа связывает операции (т.е. узлы) между собой и показывает, как каждая из них получает данные. Обратите внимание, что граф не отображает результаты операций; он лишь помогает визуализировать связи между ними.
Рассмотрим пример. Представьте, что вы хотите вычислить значение следующей функции:
TensorFlow строит граф для выполнения функции. Граф выглядит следующим образом:
Вы можете легко увидеть путь, по которому тензоры пройдут, чтобы достичь конечного пункта назначения.
Так, например, add Узел не может быть запущен до того, как оба Mul и Pow Они представили свои результаты. График показывает, что TensorFlow будет:
- вычислить x·z в
Mulузел и x² вPowузел - сложите эти два результата вместе в
addузел - добавьте z к этой сумме в
add_1узел - добавьте константу 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: |




