tf logo
В этой статье мы рассмотрим TensorFlow — библиотеку для машинного обучения с открытым исходным кодом. Она используется для проектирования, построения и тренировки моделей глубокого обучения. Вычисления в TensorFlow выполняются при помощи графа потоков данных (dataflow graph). Этот граф состоит из узлов (node), отображающих операции, и ребер (edge), отображающих потоки данных между теми узлами графа, которые они соединяют.
Мы рассмотрим три основные темы:
TensorFlow — это отличная библиотека, разработанная компанией Google, в которой используется парадигма программирования потоков данных для оптимизации математических вычислений.
Некоторые особенности 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:
Теперь, когда мы готовы писать код, давайте начнем погружаться в пакет SciPy с некоторыми практическими примерами.
Тензоры — это основная структура данных, используемая в Tensorflow. Да, это просто способ представления данных в глубоком обучении. Давайте изобразим их:
Как видно из рисунка, тензором можно назвать n-мерный массив, который позволяет нам представлять данные в сложных измерениях. Мы можем рассматривать каждое измерение как отдельный признак в глубоком обучении. Это означает, что тензоры могут стать довольно сложными, когда речь заходит о сложных наборах данных (dataset) с большим количеством признаков.
Программы TensorFlow используют тензоры для представления всех данных, также тензоры передаются между операциями в графе вычислений. Таким образом, в TensorFlow основным объектом, которым вы манипулируете и который передаете, является тензор.
TensorFlow позволяет нам для получения результата выполнять алгоритмы машинного обучения при помощи тензоров. С TensorFlow построение и тренировка моделей глубокого обучения становится значительно проще.
Как упоминалось выше, работа с TensorFlow построена вокруг создания и выполнения графа вычислений. Граф вычислений — это граф потоков данных, в котором математические операции представлены в виде узлов, а данные — в виде ребер между этими узлами. Давайте напишем очень простой фрагмент кода, чтобы посмотреть, как это работает:
import tensorflow as tf x = tf.constant(5) y = tf.constant(6) z = x * y print(z)
Когда мы запустим этот пример, мы увидим следующий вывод:
Почему умножение работает неверно? Это совсем не то, что мы ожидали. Это произошло потому, что операции в TensorFlow выполняются иначе. Для начала, нам нужно создать сессию, а затем выполнить в ней граф вычислений.
Объект сессии инкапсулирует среду, в которой выполняются операции графа и вычисляются тензоры. Это означает, что сессия также может сохранять результат графа вычислений, чтобы затем передавать его следующей операции. Давайте создадим сессию, чтобы получить правильный результат умножения:
# создаем объект сессии session = tf.Session() # вычисляем значение при помощи сессии и сохраняем его result = session.run(z) # выводим результат вычислений print(result) # закрываем сессию session.close()
На этот раз мы создали сессию и выполнили операции графа в сессии. Когда мы запустим этот пример, мы увидим следующий вывод:
Несмотря на предупреждение от TensorFlow, мы все же получили правильные результаты вычислений.
В последнем примере мы умножили две константы, но в TensorFlow можно выполнять много других операций с отдельными элементами:
Когда речь идет об операциях с отдельными элементами (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))
Когда мы запустим этот пример, мы увидим следующий вывод:
Из этого мы можем сделать следующие выводы:
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)
Когда мы запустим этот пример, мы увидим следующий вывод:
Теперь, когда мы познакомились с плейсхолдерами, давайте обратим внимание на переменные. Мы знаем, что выходные данные уравнения могут изменяться для одного и того же набора входных данных с течением времени. Поэтому, когда мы обучаем нашу переменную модели, она может со временем изменить свое поведение. В этом сценарии переменная позволяет нам добавить эти обучаемые параметры в наш вычислительный граф. Переменная может быть определена следующим образом:
x = tf.Variable( [5.2], dtype = tf.float32 )
В приведенном выше примере x — это переменная, которой присваивается ее начальное значение и тип данных. Если мы не укажем тип данных, TensorFlow выберет тот тип данных, который может представлять указанное начальное значение. Больше о типах данных в TensorFlow вы можете прочитать здесь.
В отличие от константы, для инициализации всех переменных графа нам нужно вызвать функцию Python:
init = tf.global_variables_initializer() session.run(init)
Обязательно запустите вышеупомянутую функцию 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]}))
Здесь мы сделали только то, что объяснили ранее. Давайте подведем итоги:
х
.Когда мы запустим этот пример, мы увидим следующий вывод:
Этот простой фрагмент кода дает базовое представление о том, как мы можем построить регрессионную модель. Но нам нужно сделать еще несколько шагов, чтобы завершить построенную нами модель:
х
.Чтобы проверить правильность работы модели, нам нужно измерить степень отклонения полученного выходного значения от ожидаемого. Существуют различные функции потерь, которые можно использовать здесь для проверки, но мы рассмотрим один из наиболее распространенных методов — сумму квадратов ошибок (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. Также мы создали модель линейной регрессии с очень высокой точностью.
Давайте разберем, как настроить модульные тесты для экземпляров классов. Мы напишем тесты для проверки функциональности…
Функции Python - это вызываемые объекты. Это означает, что для выполнения кода, определенного в функции,…
Многие программы на Python нуждаются в навигации по файловой системе для чтения и записи файлов.…
Юнит-тестирование с помощью unittest заключается в создании тест-кейсов для проверки функциональности отдельных частей вашего кода.…
В этой статье мы рассмотрим несколько способов обрезки строк. Будем применять срезы, строковый метод rsplit(),…
В этой статье мы разберем 4 способа обнаружить значения NaN в Python. Для этого будем…