Краткое руководство по Tensorflow

В этой статье мы рассмотрим TensorFlow — библиотеку для машинного обучения с открытым исходным кодом. Она используется для проектирования, построения и тренировки моделей глубокого обучения. Вычисления в TensorFlow выполняются при помощи графа потоков данных (dataflow graph). Этот граф состоит из узлов (node), отображающих операции, и ребер (edge), отображающих потоки данных между теми узлами графа, которые они соединяют.

Мы рассмотрим три основные темы:

  1. Что такое тензоры в TensorFlow
  2. Реализация алгоритмов машинного обучения в TensorFlow
  3. Примеры использования TensorFlow

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

Некоторые особенности TensorFlow:

  • Поддерживаются распределенные вычисления, что облегчает управление данными в больших наборах данных.
  • Базовая библиотека подходит для разных методов машинного обучения, а не только для глубокого обучения.
  • Эффективное управление сложными математическими структурами, такими как n-мерные массивы.

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

Установка TensorFlow

Поскольку для работы с TensorFlow мы будем использовать Python API, полезно знать, что TensorFlow работает как с Python 2.7, так и с Python версии 3.3+. Прежде чем перейти к реальным примерам и концепциям, давайте установим библиотеку. Есть два способа установки:

1) При помощи менеджера пакетов Python, pip:

pip install tensorflow

2) При помощи менеджера пакетов conda (если вы используете Anaconda):

conda install -c conda-forge tensorflow

Больше информации по установке вы можете найти в официальной документации TensorFlow.

Мы будем использовать Anaconda для всех примеров в этой статье. Для начала запустим Jupyter Notebook:

Краткое руководство по Tensorflow

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

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

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

Краткое руководство по Tensorflow

Как видно из рисунка, тензором можно назвать n-мерный массив, который позволяет нам представлять данные в сложных измерениях. Мы можем рассматривать каждое измерение как отдельный признак в глубоком обучении. Это означает, что тензоры могут стать довольно сложными, когда речь заходит о сложных наборах данных (dataset) с большим количеством признаков.

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

Константы в TensorFlow

TensorFlow позволяет нам для получения результата выполнять алгоритмы машинного обучения при помощи тензоров. С TensorFlow построение и тренировка моделей глубокого обучения становится значительно проще.

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

import tensorflow as tf

x = tf.constant(5)
y = tf.constant(6)
z = x * y
print(z)

Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

Почему умножение работает неверно? Это совсем не то, что мы ожидали. Это произошло потому, что операции в TensorFlow выполняются иначе. Для начала, нам нужно создать сессию, а затем выполнить в ней граф вычислений.

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

# создаем объект сессии
session = tf.Session()

# вычисляем значение при помощи сессии и сохраняем его
result = session.run(z)

# выводим результат вычислений
print(result)

# закрываем сессию
session.close()

На этот раз мы создали сессию и выполнили операции графа в сессии. Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

Несмотря на предупреждение от TensorFlow, мы все же получили правильные результаты вычислений.

Операции над тензорами

В последнем примере мы умножили две константы, но в TensorFlow можно выполнять много других операций с отдельными элементами:

  • add
  • subtract
  • multiply
  • div
  • mod
  • abs
  • negative
  • sign
  • square
  • round
  • sqrt
  • pow
  • exp
  • log
  • maximum
  • minimum
  • cos
  • sin

Когда речь идет об операциях с отдельными элементами (single-element operations), подразумевается, что даже когда вы передаете массив, операции будут выполняться над каждым элементом этого массива. Например:

import tensorflow as tf
import numpy as np

tensor = np.array([2, 5, 8])
tensor = tf.convert_to_tensor(tensor, dtype=tf.float64)
with tf.Session() as session:
    print session.run(tf.cos(tensor))

Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

Из этого мы можем сделать следующие выводы:

  • Любой массив NumPy можно легко преобразовать в тензор с помощью функции convert_to_tensor.
  • Операция (в данном случае cos) была выполнена над каждым элементом массива NumPy.

Плейсхолдеры и переменные

В одном из предыдущих разделов мы рассмотрели, как можно  использовать константы TensorFlow для построения графов вычислений. Но TensorFlow также позволяет нам передавать входные данные при выполнении, чтобы граф вычислений был динамическим. Это возможно с помощью плейсхолдеров (placeholder) и переменных (variable).

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

Согласно официальной документации TensorFlow, плейсхолдер — это обещание подставить значение потом. Вот пример использования плейсхолдеров:

import tensorflow as tf

# создаем два плейсхолдера
x = tf. placeholder(tf.float32)
y = tf. placeholder(tf.float32)

z = x * y

# создаем объект сессии
session = tf.Session()

# передаем значения для плейсхолдеров
result = session.run(z, {x: [2, 5], y: [3, 7]})
print('Multiplying x and y:', result)

Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

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

x = tf.Variable( [5.2], dtype = tf.float32 )

В приведенном выше примере x — это переменная, которой присваивается ее начальное значение и тип данных. Если мы не укажем тип данных, TensorFlow выберет тот тип данных, который может представлять указанное начальное значение. Больше о типах данных в TensorFlow вы можете прочитать здесь.

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

init = tf.global_variables_initializer()
session.run(init)

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

Линейная регрессия с использованием TensorFlow

Линейная регрессия является одним из наиболее распространенных алгоритмов, используемых для восстановления зависимости между непрерывными переменными. Это соотношение между координатами точки, скажем, x и y, называется гипотезой. Когда мы говорим о линейной регрессии, гипотеза является прямой линией:

y = mx + c

Здесь m — угловой коэффициент, и здесь — это вектор, представляющий веса (weight). А c — свободный член (точка пересечения с осью y), и здесь он представляет смещение (bias). Вес и смещение называются параметрами модели.

Линейная регрессия позволяет нам оценивать значения веса и смещения таким образом, чтобы минимизировать функцию стоимости. Наконец, x — это независимая переменная в уравнении, а y — зависимая переменная. А теперь давайте начнем строить линейную модель в TensorFlow:

import tensorflow as tf

# угловой коэффициент с начальным значением 1.1
W = tf.Variable([1.1], tf.float32)

# смещение с начальным значением -1.1
b = tf.Variable([-1.1], tf.float32)

# плейсхолдер для независимой переменной - x
x = tf.placeholder(tf.float32)

# уравнение линии или линейная регрессия
linear_model = W * x + b

# инициализация всех переменных
session = tf.Session()
init = tf.global_variables_initializer()
session.run(init)

# выполнение регрессионной модели
print(session.run(linear_model {x: [2, 5, 7, 9]}))

Здесь мы сделали только то, что объяснили ранее. Давайте подведем итоги:

  • Мы начали с импорта TensorFlow в наш скрипт.
  • Создали две переменных: для вектора весов и параметра смещения.
  • Создали плейсхолдер, который будет необходим для ввода х.
  • Представили линейную модель.
  • Инициализировали все значения, необходимые для нашей модели.

Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

Этот простой фрагмент кода дает базовое представление о том, как мы можем построить регрессионную модель. Но нам нужно сделать еще несколько шагов, чтобы завершить построенную нами модель:

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

Функция потерь и валидация модели

Чтобы проверить правильность работы модели, нам нужно измерить степень отклонения полученного выходного значения от ожидаемого. Существуют различные функции потерь, которые можно использовать здесь для проверки, но мы рассмотрим один из наиболее распространенных методов — сумму квадратов ошибок (Sum of Squared Error — SSE).

Уравнение для SSE имеет следующий вид:

E = 1/2 * (t - y)2

Где:

E = среднеквадратическая ошибка (Mean Squared error — MSE)

t = полученный результат

у = ожидаемый результат

t - y = ошибка

Теперь давайте напишем фрагмент кода в продолжение последнего фрагмента, чтобы рассчитать значение потерь:

y = tf.placeholder(tf.float32)
error = linear_model - y
squared_errors = tf.square(error)
loss = tf.reduce_sum(squared_errors)
print(session.run(loss, {x:[2, 5, 7, 9], y:[2, 4, 6, 8]}))

Когда мы запустим этот пример, мы увидим следующий вывод:

Краткое руководство по Tensorflow

Очевидно, что значение потерь очень низкое для данной модели линейной регрессии.

Заключение

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

Прокрутить вверх