Универсальный пример с использованием Tensor Flow

Здравствуйте и вновь добро пожаловать на занятия по теме «Обработка данных: глубокое обучение на языке Python, часть 1».

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

Если вы не хотите писать код самостоятельно или сделали в нём ошибку, найдите в репозитарии github файл tf_example.py.

Мы начинаем с импорта библиотек TensorFlow, Numpy и Matplotlib.

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt

Первая часть кода будет в точности такой же, как и ранее, поэтому просто скопируем его из предыдущих примеров.

Nclass = 500

D = 2

M = 3

K = 3

X1 = np.random.randn(Nclass, D) + np.array([0, -2])

X2 = np.random.randn(Nclass, D) + np.array([2, 2])

X3 = np.random.randn(Nclass, D) + np.array([-2, 2])

X = np.vstack([X1, X2, X3]).astype(np.float32)

Y = np.array([0]*Nclass + [1]*Nclass + [2]*Nclass)

plt.scatter(X[:,0], X[:,1], c=Y, s=100, alpha=0.5)

plt.show()

N = len(Y)

T = np.zeros((N, K))

for i in xrange(N):

T[i, Y[i]] = 1

Таким образом, у нас есть три гауссова облака с центрами (0, -2), (2, 2) и (-2, 2) по 500 примеров в каждом классе. На случай, если вы забыли, как выглядят данные, мы выведем на экран диаграмму рассеяния. Мы также создали переменные показателей для целевых переменных.

Теперь начинается нечто новое. TensorFlow работает с собственными типами переменных, поэтому нам понадобится функция для инициации весовых коэффициентов, возвращающая TF-переменные. Инициация весовых коэффициентов происходит так же, как и в Numpy, да и вообще, всё в TensorFlow имеет свой аналог Numpy.

def init_weights(shape):

return tf.Variable(tf.random_normal(shape, stddev=0.01))

Нам также понадобится функция forward, похожая на ту, которую мы писали ранее с помощью Numpy, но с использованием функций библиотеки TensorFlow.

def forward(X, W1, b1, W2, b2):

Z = tf.nn.sigmoid(tf.matmul(X, W1) + b1)

return tf.matmul(Z, W2) + b2

Далее мы создадим заполнители TensorFlow, представляющие наши данные X и Y. TensorFlow создаёт граф и знает, как всё посчитать, хотя у нас ещё нет никаких значений. Таким образом, переменная tfX является лишь заполнителем для данных, причём вторая размерность равна D, поскольку это размерность наших данных, а в первую размерность мы можем подставить любую величину. Переменная tfY также является заполнителем со второй размерностью, равной K.

tfX = tf.placeholder(tf.float32, [None, D])

tfY = tf.placeholder(tf.float32, [None, K])

Далее мы создаём весовые коэффициенты подобно тому, как мы это делали в Numpy.

W1 = init_weights([D, M])

b1 = init_weights([M])

W2 = init_weights([M, K])

b2 = init_weights([K])

Теперь опишем исходящую переменную, хотя ей и не присвоено ещё никакого значения.

py_x = forward(tfX, W1, b1, W2, b2)

Ещё одно отличие TensorFlow – как мы определяем функцию затрат.

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, tfY))

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

train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)

predict_op = tf.argmax(py_x, 1)

Далее мы должны сделать такие штуки, как сессии. Не переживайте, если вы не знаете, что это, на данный момент достаточно того, что они нам нужны. И сразу же инициируем все наши переменные.

sess = tf.Session()

init = tf.initialize_all_variables()

sess.run(init)

И далее выполняем градиентный спуск, через каждые 10 проходов выводя результат на экран.

for i in xrange(1000):

sess.run(train_op, feed_dict={tfX: X, tfY: T})

pred = sess.run(predict_op, feed_dict={tfX: X, tfY: T})

if i % 10 == 0:

print(np.mean(Y == pred)

Запустим нашу программу. Мы опять видим наши данные, после чего получаем окончательную точность.

Здравствуйте и вновь добро пожаловать на занятия по теме «Глубокое обучение на языке Python, часть 1».

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

Вначале вы увидите ровно то, что сейчас показано на экране. Сейчас вы можете увидеть проблему XOR и «проблему пончика». Как видите, это действительно важные вещи, поскольку об этом говорят даже ребята из Google.

Итак, вначале мы рассмотрим знаменитую «проблему пончика» с использованием логистической регрессии, поэтому количество скрытых слоёв равно нулю. Как мы знаем, если у нас есть просто x1 и x2, мы не сможем найти решение для «проблемы пончика». И действительно, как вы можете видеть, ошибки для проверочного и учебного набора составляют около 0,5.

Но мы знаем, что если добавить ещё и радиус, то решение вполне возможно, поскольку радиус является единственным разделяющим признаком. Радиус будет равен Конечно, квадратный корень не нужен, достаточно и . Для этого мы можем взять отдельно x1 и отдельно x2. В таком случае при обучении модели мы видим, что проверочная ошибка очень близка к нулю, хотя графическое отображение и не обновилось. В общем, визуализация немного глючит, но если вы немного пошевелите мышкой, вы можете заставить её работать.

Теперь попробуем решить проблему XOR. Вы знаете, что просто задав x1 и x2, задачу решить невозможно. И действительно, мы вновь видим ошибку в районе 0,5. Но мы также знаем, что добавив ещё один признак x1x2, решение задачи возможно. Попробуем вновь обучить модели и получим, что ошибка снижается примерно до нуля, будучи в зависимости лишь от x1x2 – цвет и ширина линий показывают нам силу сигнала.

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

Вернёмся теперь к нашему «пончику» и проделаем то же самое. Начнём с двух нейронов и посмотрим, что получится. Как видим, получается не очень. Попробуем три нейрона. Похоже, некоторые проблемы всё равно остаются. Добавим ещё один нейрон. И, похоже, для нейронов четвёрка является волшебным числом для нахождения решения.

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

Ещё одна, более сложная проблема, о которой мы не говорили, – это проблема спирали. Как вы можете видеть, её определённо невозможно решить, основываясь лишь на x1 и x2. Вы можете предположить, что следует добавить sin x1 и sin x2, поскольку они являются периодическими функциями и могут помочь обучению, но видно что они не помогают. Мы даже можем подключить все дополнительные признаки. Решение несколько неустойчиво, а ошибка всё равно колеблется в районе 0,5. Мы можем попытаться изменить функцию активации, хотя на самом деле это не имеет никакого значения, поскольку пока что нет никаких скрытых слоёв.

Добавим скрытый слой, в котором установим 8 нейронов, оставим прежние признаки и посмотрим, сможет ли нейронная сеть обучиться спирали. Как видим, получается очень неплохо. Если вы наведёте мышь на нейрон, вы можете увидеть, какой конкретный узор изучает каждый из них. В общем получается довольно сложная фигура для обучения действительному узору.

Но идеальным для нас была бы ситуация, когда нам не приходилось использовать все эти вручную установленные признаки, поскольку, как правило, у нас есть лишь необработанные данные, и мы не собираемся всё это возводить в квадрат, перемножать, находить синусы и косинусы, как любят делать статистики. Мы хотим, чтобы были лишь x1 и x2 и чтобы нейронная сеть могла всему обучиться.

Но, как вы видите, один слой и 8 нейронов с этим плохо справляются. Увеличим количество скрытых слоёв до 6 и добавим максимально возможное количество нейронов в каждый из них – у нас получится 6 скрытых слоёв по 8 нейронов в каждом. Посмотрим, сможет ли нейронная сеть обучиться. Как вы можете видеть, обучение проходит куда медленнее, чем в предыдущих примерах, поскольку это намного более сложная задача. Кажется, нейронная сеть выровнялась на одном месте. Попробуем другую функции активации, например relu, и посмотрим, что получится. Фигура подрагивает, но кажется, ошибка уменьшается. Через некоторое время, судя по всему, сеть обучилась очень кривой спирали. Любопытно, что у нас получилось с функцией relu, но не получилось с гиперболическим тангенсом.

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

Здравствуйте и добро пожаловать на эту лекцию.

Я покажу вам, как настроить свою среду разработки, чтобы вы могли следовать этому курсу.

Сначала мы поговорим об операционных системах, тройка главных среди которых, – это Windows, Linux и Mac. Большинство, хотя и не все, моих курсов по глубокому обучению впоследствии становятся настолько сложными, что нам потребуются специализированные библиотеки, такие как Thaeno и TensorFlow для работы. Но на данный момент Thaeno и TensorFlow официально не поддерживаются Windows1, так что если вы заинтересовались машинным обучением, вы можете вскорости обнаружить, что мало что получается, и даже без включения GPU-библиотек вроде Numpy и Matplotlib. Это может встретить затруднения, но, по крайней мере, это возможно, пусть даже и в Windows.

Если вам действительно необходимо использовать Windows и пользоваться языком Python в этой среде, но, тем не менее, не хотите создавать виртуальную машину, о чём мы поговорим далее, вы можете воспользоваться замечательной библиотекой Anaconda, которую можно скачать по адресу www.continuum.io/downloads. Лично я не могу ручаться за её стопроцентную работоспособность, но знаю людей, которые нашли её вполне работоспособной. Я говорю это по своему опыту, поскольку работал со многими клиентами один на один и всегда, когда речь идёт о Windows – особенно это касается Numpy – это очень тяжело.

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

  • линейная регрессия на языке Python;

  • логистическая регрессия на языке Python;

  • глубокое обучение на языке Python (часть 1) – в нём используется в основном NumPy, и лишь немного TensorFlow;

  • введение в лингвистический анализ на языке Python;

  • анализ данных: SQL для чайников, пользователей и профессионалов;

  • кластерный анализ и неконтролируемое машинное обучение на языке Python;

  • неконтролируемое машинное обучение: скрытые модели Маркова на языке Python – этот курс потребует немного Theano.

Следующие курсы потребуют использования Thaeno и TensorFlow:

  • глубокое обучение на практике на языке Python;

  • свёрточные нейронные сети на языке Python;

  • неконтролируемое машинное обучение на языке Python;

  • рекуррентные нейронные сети на языке Python.

Как вы видите, множество интересных и сложных вещей может быть выполнено лишь с применением библиотек Thaeno и TensorFlow, так что, надеюсь, я смог убедить вас, что симуляция виртуальной машины – это хорошая идея.

Windows – замечательная операционная система, но она недружественна к среде разработки.

Если вы используете Mac, то вам, вероятно, всё это не нужно. Вы можете всё просто установить, используя простой инсталлятор

sudo pip install numpy scipy ipython pandas matplotlib theano

В некоторых возможных версиях не всё может работать, но обычно поиск в Google и извещение об ошибке покажет вам путь решения проблемы переполнения стека. В качестве альтернативы вы можете также воспользоваться облегчённой установкой, которая может даже иметь более свежие версии. В таком случае надо просто запустить

sudo easy_install <the above>

Возможно, вам потребуется установить собственно pip, что легко сделать командой

sudo easy_install pip

Если вы хотите установить TensorFlow, просто перейдите по адресу tensorflow.org. Это просто установщик pip, указывающий на место установки пользователя. Я не буду приводить его здесь, так как он соответствует лишь определённой версии, которая может оказаться устаревшей, пока вы смотрите это видео. Есть и хорошая новость: люди, работающие с TensorFlow, постоянно обновляют его.

Далее, пусть вы хотите установить виртуальную машину Linux на Windows или уже используете Linux и хотите знать, какие команды использовать для установки этих библиотек. Нам понадобятся две вещи. Во-первых, VirtualBox https://www.virtualbox.org/wiki/Downloads. Во-вторых,облегчённая версия Linux – я советую Xubuntu или Lubuntu. В этом учебнике я буду использовать 64-битную версию Lubuntu для этого обучающего видео, так что сначала скачайте его на http://lubuntu.net, а затем возвращайтесь к обучающему видео.

Итак, у вас есть установленный VirtualBox, и мы собираемся создать 64-битную виртуальную машину. Назначаем имя для виртуальной машины, все остальные параметры в норме. Я выделяю для виртуальной машины 2 гигабайта, вы же можете установить для неё больше, если у вашего компьютера больше оперативной памяти. Создадим новый виртуальный жёсткий диск размером в 8 гигабайт с динамическим выделением – в нашем случае этого вполне достаточно. В установках выбираем загруженный из сети ISO-файл и начинаем установку. Программа установки попросит вас указать несколько параметров. Выбираем опцию очистки диски после установки и продолжаем. После этого программа установки попросит вас перезагрузить компьютер. Так и сделаем.

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

sudo aptget upgrade

Следующая команда

sudo apt-get install build-essental

и команда

sudo. /VboxLinuxAdditions.run

чтобы теперь VirtualBox заработал как надо. Перезагрузим компьютер.

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

sudo aptget update

Затем весьма длинный список команд

sudo aptget install pythonnumpy pythonscipy pythonmatplotlib ipython pythonpip python dev pythonsetuptools

Когда всё установлено, вы можете проверить их работу, например, ввести

iphyton

import numpy

import scipy

import pandas

import matplotlib

Теперь установим библиотеки Pandas и Thaeno.

sudo pip install –upgrade pandas theano

И последнее, что нужно сделать, – установить библиотеку TensorFlow. Чтобы сделать это, нужно зайти на соответствующий сайт, поскольку ребята постоянно усовершенствуют библиотеку. Так что откроем браузер и введём в поиске

install tensorflow

Вам понадобится установить ещё git, так что давайте его и установим:

sudo apt-get update git

и попробуем http-версию.

Запустим python theano.py, поскольку этот файл не требует никаких данных. Попробуем TensorFlow запуском команды. Удостоверьтесь, что установили правильную версию TensorFlow, не конфликтующую с другими версиями.

Установите настоятельно мною рекомендуемый текстовый редактор Sublime Text и выберите опцию Ubuntu 64-bit. Это тот самый текстовый редактор, который я использовал в своих лекциях. Можно открыть файлы машинного обучения с нашим кодом!

1  TensorFlow уже поддерживается Windows, и вы можете установить его по аналогии с тем, как показано в этой лекции. – Примечание автора.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: