Привет, Хабр! Представляю вашему вниманию перевод статьи "TensorFlow Tutorial: 10 minutes Practical TensorFlow lesson for quick learners" автора Ankit Sachan.
Этот туториал по TensorFlow предназначен для тех, кто имеет общее представление о машинном обучении и пытается начать работу с TensorFlow.
Прежде всего у вас должен быть установлен TensorFlow. Вы можете его установить по этому руководству. Этот урок разделен на две части: в первой части мы объясняем основы на рабочем примере, во второй части мы строим модель линейной регрессии.
Часть 1. Основы TensorFlow
TensorFlow — это библиотека для численных расчетов, в которой данные проходят через граф. Данные в TensorFlow представлены n-мерными массивами — тензорами. Граф составлен из данных (тензоров) и математических операций.
В узлах графа находятся математические операции.
Ребра графа представляют тензоры, которые "перетекают" между операциями.
Есть еще один аспект, в котором TensorFlow сильно отличается от любого другого языка программирования. В TensorFlow вам сначала нужно создать проект того, что вы хотите создать. Изначально при создании графа переменные не имеют значений. Позже, когда вы создали полный граф, вы запускаете его в сессии и только тогда переменные будут принимать какие-либо значения.
Давайте начнем учиться на практике. Запустите python и импортируйте TensorFlow:
~$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>import tensorflow as tf
Для определения операций используется граф, при этом все операции выполняются в сессии. Графы и сессии создаются независимо друг от друга. Относитесь к графу как к проекту строительства, а к сессии как к строительной площадке.
1.1. Графы в TensorFlow
Граф это основа TensorFlow, все вычисления (операции), переменные находятся на графе. Все, что происходит в коде, находится на дефолтном графе, предоставленном TensorFlow. Вы можете получить доступ к этому графу следующим образом:
graph = tf.get_default_graph()
А так вы можете получить список всех операций в этом графе:
graph.get_operations()
Сейчас ваш граф пуст. Если вам необходимо напечатать название каждой операции выполните следующий код:
for op in graph.get_operations():
print(op.name)
Вывод снова будет пустым. В будущем, после добавления операций в граф, мы будем использовать этот код для вывода их названий.
1.2. Сессии в TensorFlow
Граф только определяет вычисления (создает проект), но не имеет никаких переменных, никаких значений, если мы не запустим граф или часть графа в сессии.
Вы можете создать сессию так:
sess=tf.Session()
... your code ...
... your code ...
sess.close()
Не забывайте, что начав сессию вам необходимо ее завершить или использовать блок with… as, например вот так:
with tf.Session() as sess:
sess.run(f)
Плюсом использования такого подхода является то что сессия будет закрыта автоматически в конце блока with
1.3. Тензоры в TensorFlow
TensorFlow хранит данные в тензорах — многомерных массивах очень похожих на массивы numPy.
a) Константы — это значения которые не могут быть изменены. Они определяются так:
a=tf.constant(1.0)
при этом при попытке вывода вы получите следующее:
print(a)
<tf.Tensor'Const:0' shape=() dtype=float32>
print(a)
Tensor("Const:0", shape=(), dtype=float32)
Как вы можете видеть, это отличается от других языков программирования, например от python. Вы не можете распечатать или получить доступ к константе до тех пор пока не запустите сессию. Давайте так и сделаем:
with tf.Session() as sess:
print(sess.run(a))
Этот код выведет 1.0
b) Переменные это тоже тензоры которые походи на переменные в других языках программирования:
>>>b = tf.Variable(2.0,name="test_var")
>>>b
<tensorflow.python.ops.variables.Variable object at 0x7f37ebda1990>
В отличие от констант переменные могут менять свое содержимое. Однако переменные в TensorFlow должны быть инициализированы в отдельной операции инициализации. Может быть достаточно трудоемко инициализировать все переменные, но TensorFlow предоставляет механизм для инициализации всех переменных за раз:
init_op = tf.global_variables_initializer()
Теперь необходимо запустить операцию инициализации до того как вы попытаетесь получить доступ к переменной:
with tf.Session() as sess:
sess.run(init_op)
print(sess.run(b))
Этот код выведет 2.0
Если вы теперь попробуете распечатать операции в графе
graph = tf.get_default_graph()
for op in graph.get_operations():
print(op.name)
то получите следующий вывод:
Const
test_var/initial_value
test_var
test_var/Assign
test_var/read
init
Как видите, мы объявили «a» как Const и она была добавлена к графику. Аналогично, для переменной b в граф TensorFlow было добавлено много состояний «test_var», таких как test_var/initial_value, test_var/read и т. д. Вы можете визуализировать всю сеть, используя TensorBoard, который представляет собой инструмент для визуализации графика TensorFlow и процесса обучения.
с) Плейсхолдеры — это тензоры, ожидающие инициализации данными. Они используются для данных которые будут предоставлены только когда код фактически будет выполнен в сеансе. То, что передается в плейсхолдер это словарь который содержит названия плейсхолдеров и их значения:
a = tf.placeholder("float")
b = tf.placeholder("float")
y = tf.multiply(a, b)
fd = {a: 2, b: 3}
with tf.Session() as sess:
print(sess.run(y, fd))
Данный код выведет 6.0
1.4. Устройства в TensorFlow
TensorFlow имеет очень мощные встроенные возможности для запуска вашего кода на GPU, CPU или кластерах. Он предоставляет вам возможность выбрать устройство, на котором вы хотите запускать ваш код. Однако, это не то о чем стоит задумываться когда вы только начинаете знакомство с TF.
Итак вот полная картина того, как устроены вычисления в TensorFlow:
Часть 2. Туториал по TensorFlow с простым примером
В этой части мы рассмотрим код для запуска линейной регрессии. Перед этим давайте рассмотрим некоторые основные функции TensorFlow, которые мы будем использовать в коде.
Создание случайного нормального распределения:
Используйте random_normal для создания случайных значений из нормального распределения. В этом примере w — это переменная размерности 784 * 10 со случайными значениями со стандартным отклонением 0,01.
w=tf.Variable(tf.random_normal([784, 10], stddev=0.01))
Reduce_mean — вычисляет среднее значение массива
b = tf.Variable([10,20,30,40,50,60],name='t')
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(tf.reduce_mean(b))
Данный код выведет 35
argmax — очень похож на argmax в Python. Получает максимальное значение из тензора вдоль указанной оси.
a=[ [0.1, 0.2, 0.3 ],
[20, 2, 3 ]
]
b = tf.Variable(a,name='b')
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(tf.argmax(b,1))
Выведет массив ([2, 0]), который показывает индекс максимального значения в каждой из строк a.
Задача линейной регрессии
Постановка задачи: имеется большое количество точек данных, пытаетесь им в соответствие прямую линию. Для этого примера мы создадим 100 точек данных и попытаемся поставить им в соответствие линию.
2.1. Создание тренировочного набора данных
trainX содержит значения между -1 и 1, а trainY — увеличенное в 3 раза значение trainX плюс некоторую случайную величину:
import tensorflow as tf
import numpy as np
trainX = np.linspace(-1, 1, 101)
trainY = 3 * trainX + np.random.randn(*trainX.shape) * 0.33
2.2. Плейсхолдеры
X = tf.placeholder("float")
Y = tf.placeholder("float")
2.3. Моделирование
Модель линейной регрессии имеет вид
— мы должны вычислить значение w. Давайте инициализируем w нулевым значением и создадим модель для решения этой проблемы. Мы определяем функцию стоимость как
TensorFlow поставляется со многими оптимизаторами, которые рассчитывают и обновляют градиенты после каждой итерации, пытаясь минимизировать указанной функции стоимости. Мы собираемся определить операцию обучения используя GradientDescentOptimizer, чтобы минимизировать нашу функцию стоимости при скорости обучения 0,01. Затем мы запустим это операцию обучения в цикле.
w = tf.Variable(0.0, name="weights")
y_model = tf.multiply(X, w)
cost = (tf.pow(Y-y_model, 2))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
2.4. Обучение
До этого момента мы только определили граф. Никаких вычислений не происходило, ни одна из переменных TensorFlow не имеет значения. Чтобы запустить этот граф, нам нужно создать сессию и выполнить ее. Перед этим нам нужно создать операцию инициализации для всех переменных:
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for i in range(100):
for (x, y) in zip(trainX, trainY):
sess.run(train_op, feed_dict={X: x, Y: y})
print(sess.run(w))
Обратите внимание, что первое, что было сделано, — это инициализация переменных путем вызова init внутри session.run(). Позже мы запускаем train_op, скармливая ей feed_dict. Наконец, мы печатаем значение w (снова внутри sess.run()), которое должно быть около 3.
Упражнение:
Если вы создадите новую сессию после этого кода и попытаетесь напечатать w, что выведется?
with tf.Session() as sess:
sess.run(init)
print(sess.run(w))
Да, вы правильно поняли, выведется 0.0. Как только мы вышли из сессии, созданной ранее, все операции перестают существовать.
Надеюсь, этот урок даст вам быстрый старт с TensorFlow. Пожалуйста, не стесняйтесь задавать свои вопросы в комментариях. Полный код можно скачать здесь.