Учебники

4) Основы TensorFlow

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

Название Tensorflow напрямую связано с его основной структурой: Tensor . В 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 все вычисления проходят через один или несколько тензоров. Тензор — это объект с тремя свойствами:

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

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

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

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

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

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

source activate hello-tf			

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

activate hello-tf			

После того, как вы это сделали, вы готовы импортировать тензор потока

# Import tf
import tensorflow as tf			

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

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

Чтобы создать тензор, вы можете использовать tf.constant ()

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`: Flot variable    
    - `tf.int16`: Integer variable
- "name": Name of the tensor. Optional. By default, `Const_1:0`    			

Чтобы создать тензор измерения 0, запустите следующий код

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

Вывод

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

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

Вывод

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

Каждый тензор отображается именем тензора. Каждый тензорный объект определяется уникальной меткой (именем), измерением (формой) и типом данных (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 1r1_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)			

Вы можете заметить, что форма состоит только из 1 столбца.

Чтобы создать массив из 2 измерений, вам необходимо закрыть скобки после каждой строки. Проверьте примеры ниже

## 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.

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

## 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 угадывает форму. Однако вы можете получить форму тензора с помощью свойства 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-D тензор с определенной формой 10, заполненный 0, вы можете запустить приведенный ниже код:

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

Вывод

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

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

# 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.

пример

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

# 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 будет угадывать, какие типы данных наиболее вероятны. Например, если вы передадите текст, он угадает, что это строка, и преобразует его в строку.

Создание оператора

Некоторые полезные операторы TensorFlow

Вы знаете, как создать тензор с 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.substract (a, b)
  • tf.multiply (a, b)
  • tf.div (a, b)
  • tf.pow (a, b)
  • tf.exp (а)
  • tf.sqrt (а)

пример

# 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)			

Код Объяснение

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

  • один тензор с 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 matrixtensor_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)			

Заполнитель

Заполнитель имеет целью кормить тензор. Заполнитель используется для инициализации данных, передаваемых внутри тензоров. Чтобы предоставить заполнитель, вам нужно использовать метод 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 работает вокруг 3 основных компонентов:

  • график
  • Тензор
  • сессия

Компоненты

Descritption

график

График является фундаментальным в TensorFlow. Все математические операции (операции) выполняются внутри графика. Вы можете представить график как проект, в котором выполняются все операции. Узлы представляют эти операции, они могут поглощать или создавать новые тензоры.

Тензор

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

сессия

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

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

В приведенном ниже примере вы будете:

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

Шаг 1) Вы создаете два тензора х и у

## 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]			

Объяснение кода

  • tf.Session (): открыть сеанс. Все операции будут проходить в течение сессий
  • Выполнить (умножить): выполнить операцию, созданную на шаге 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.			

Код Объяснение

  • 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 не может быть выполнена до и. График объясняет, что это будет:

  1. вычислить и:
  2. добавить 1) вместе
  3. добавить в 2)
  4. добавить 3) к
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			

Код Объяснение

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

В этом примере мы выбираем фиксированные значения переменных. Мы также создали постоянный тензор с именем c, который является постоянным параметром в функции f. Он принимает фиксированное значение 5. На графике вы можете увидеть этот параметр в тензоре, называемом константой.

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

Из графика вы можете понять, что произойдет с тензорами и как он может вернуть результат 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 работает вокруг:

  • График: вычислительная среда, содержащая операции и тензоры
  • Тензор: представляет данные (или значение), которые будут отображаться на графике. Это край на графике
  • Сессии: разрешить выполнение операций

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

постоянная

объект

Д0

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 ()

Сессия за блоком

с tf.Session () в качестве sess: