Обработка данных: «практическое глубокое обучение в Theano и TensorFlow»

План – что вы уже изучили ранее и что изучите в этом курсе

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

Почему я создал этот курс?

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

В этом курсе вы сможете изучить следующие материалы:  Градиентный спуск – полный, пакетный и стохастический, Импульс в глубоком обученииАдаптивные коэффициенты обученияTheano в глубоком обучении, TensorFlow в глубоком обучении, Современные методы регуляризации, Ускорение GPU и домашняя работаОписание проблемы распознавания выражения лица, Проект распознавания выражения лица в Theano и TensorFlow, ИНС на основе классов в Theano, ИНС на основе классов в TensorFlow.

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

Итак, чем же мы займёмся в этом курсе?

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

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

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

И наконец я покажу, как использовать графический процессор на Amazon Web Services или даже на своём собственном компьютере, если у вас есть мощная видеокарта, чтобы значительно ускорить процесс обучения модели.

Как этот курс вписывается в занятия по глубокому обучению

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

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

Итак, что же это за предпосылки?

Если вы не знакомы или не уверены во владении какими-либо указанными ниже вопросами, пожалуйста, напишите мне на электронную почту info@lazyprogrammer.me, и я укажу вам, где вы можете этому научиться.

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

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

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

Вы должны знать метод обратного распространения ошибок и уметь самостоятельно его вывести.

Вы должны знать, что это за уравнение (подсказка: оно являются математическим выражением чего-то такого, о чём я уже упоминал):

W_i = W_i - \eta \frac {\partial J}{\partial W_i}.

Вы должны уметь написать код для обучения линейной регрессии, логистической регрессии и нейронной сети при помощи только библиотеки Numpy.

Вы должны знать о L2-регуляризации и для чего она используется.

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

При этом вам необязательно знать код простого приложения нейронной сети, который мы писали с помощью библиотеки TensorFlow в курсе «Глубокое обучение, часть 1», поскольку в данном курсе мы будем изучать библиотеки Theano и TensorFlow с нуля.

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

Суть курса состоит не в том, чтобы вы просто смотрели на эти простые уравнения, а в том, чтобы вы усвоили предложенные идеи и экспериментировали с ними. В этом курсе я провожу некоторые эксперименты, но на самом деле это вам следует перепробовать их на множестве наборов данных, пока не усвоите материал.

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

Где достать базу данных MNIST и создание линейного эталонного теста?

Прежде всего вам следует перейти по адресу – именно отсюда вы можете загрузить используемые нами данные. Тут есть два CSV-файла – train.csv и test.csv. Мы воспользуемся только файлом train.csv, поскольку он содержит метки.

Чтобы получить весь код этого курса, вам необходимо будет перейти по адресу и найти папку ann_class2. После загрузки данных вам нужно будет переместить CSV-файлы в папку large_files, находящуюся рядом с папкой ann_class2, поскольку именно там мой код будет искать данные файлы. Соответствующий файл для этой конкретной лекции называется util.py. Он содержит некоторые эталонные тесты, использующие логистическую регрессию применительно к необработанным данным. Сами данные являются изображениями размером 28×28, сведёнными к вектору размерностью 1×784. По отношению к необработанным данным я использую метод главных компонент (PCA) и повторную логистическую регрессию по 300 важнейшим основным компонентам.

Итак, давайте рассмотрим некоторые из этих функций.

Функция get_transformed_data преобразует данные с использованием метода главных компонент и возвращает PCA-модель, содержащую матрицу преобразования и среднее значение X, которое вычитается из X перед использованием метода главных компонент.

def get_transformed_data():

 print(“Reading in and transforming data…”)

 df = pd.read_csv(‘../large_files/train.csv’)

  data = df.as_matrix().astype(np.float32)

  np.random.shuffle(data)

  X = data[:, 1:]

  mu = X.mean(axis=0)

  X = X – mu # center the data

  pca = PCA()

  Z = pca.fit_transform(X)

  Y = data[:, 0].astype(np.int32)

  return Z, Y, pca, mu

Функция get_normalized_data в качестве аргумента берёт необработанные X, являющимися необработанными пикселями изображения, и нормализует их путём вычитания среднего значения и деления на стандартное отклонение.

def get_normalized_data():

print (“Reading in and transforming data…”)

df = pd.read_csv(‘../large_files/train.csv’)

data = df.as_matrix().astype(np.float32)

np.random.shuffle(data)

  

X = data[:, 1:]

mu = X.mean(axis=0)

std = X.std(axis=0)

np.place(std, std == 0, 1)

X = (X – mu) / std # normalize the data

Y = data[:, 0]

return X, Y

Функция plot_cumulative_variance прорисовывает график совокупной дисперсии после применения метода главных компонент. Это оправдывает принятие 300 важнейших главных компонент, поскольку они содержат, как мне кажется, 95% дисперсии исходных данных.

def plot_cumulative_variance(pca):

P = []

for p in pca.explained_variance_ratio_:

if len(P) == 0:

P.append(p)

      

else:

P.append(p + P[-1])

plt.plot(P)

plt.show()

return P

Функция forward реализует логистическую регрессию.

def forward(X, W, b):

# softmax

a = X.dot(W) + b

expa = np.exp(a)

y = expa / expa.sum(axis=1, keepdims=True)

return y

Функции predict и error_rate стандартны для алгоритмов машинного обучения.

def predict(p_y):

return np.argmax(p_y, axis=1)

def error_rate(p_y, t):

prediction = predict(p_y)

return np.mean(prediction != t)

Функция cost вычисляет кросс-энтропийную функцию ошибок, а функции gradW и gradb – соответственно градиент для матрицы весовых коэффициентов и свободного члена.

def cost(p_y, t):

tot = t * np.log(p_y)

return -tot.sum()

def gradW(t, y, X):

return X.T.dot(t – y)

def gradb(t, y):

return (t – y).sum(axis=0)

И функция y2indicator, которая изменяет наше y, являющееся вектором чисел от 0 до 9, в матрицу показателей, которая является матрицей длины N, но имеет глубину 10. Функция будет возвращать значение 1, если цифра соответствует изображению.

def y2indicator(y):

N = len(y)

ind = np.zeros((N, 10))

for i in xrange(N):

ind[i, y[i]] = 1

return ind

Запустим полный эталонный тест. По окончании получается коэффициент ошибок, равный 8%.

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

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

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

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

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

Share via
Copy link