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

В первой части мы «говорили» с Hearthstone API, чтобы получить информацию о картах. То, что мы получили, было кучей JSON с текстами карточек внутри. Прежде чем мы сможем сделать с ним что-то классное с помощью машинного обучения, нам нужно сначала предварительно обработать эти тексты!

Я подумал, что самой интересной частью карты Hearthstone для создания будет текст карты с эффектом, поскольку я думаю, что он предлагает больше всего пространства для творчества для нашей сети ;) Но сначала давайте позаботимся о необходимых шагах предварительной обработки текста LSTM!

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

Наша генеративная модель основана на символах, поэтому наши входные данные представляют собой огромный список символов. Давайте сначала преобразуем список предложений в список символов. Однако фактический ввод в сеть должен быть числовым, потому что машины еще не понимают чистых человеческих языков. Итак, нам нужно проиндексировать все возможные символы в нашем наборе данных! Мы создаем набор всех символов (и, следовательно, дедуплицируем список), а затем создаем два словаря: один символ для числового индекса и наоборот. Таким образом, мы всегда можем переключаться между числовым и строковым представлением. Один очень важный факт: мы должны убедиться, что отображение символов точно такое же каждый раз, когда мы используем обученную модель! Поэтому нам нужно либо отсортировать наш набор, либо каким-то образом сохранить сопоставление (например, сохранив сопоставления на диск с помощью pickle, что я и сделал):

Я позаимствовал некоторые из следующих примеров кода и вдохновился этим прекрасным проектом на GitHub:



Обязательно проверьте это!

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

LSTM ожидает ввода формы (batch_size, length_of_sequence, number_features ). Вот что означает каждая из этих фигур:

batch_size: количество последовательностей, которые передаются в сеть при одной итерации обновления веса, как и в обычной нейронной сети с прямой связью.

length_of_sequence: количество «нейронных сетей», память или количество шагов, которые сеть просматривает на каждом шаге. В нашем примере мы хотим предсказать символ по 57 предыдущим символам.

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

Мы устанавливаем количество признаков в общее количество уникальных символов:

NUMBER_FEATURES = len(all_text_unique_chars)

Теперь мы можем инициализировать наши X (вход) и y (выход) для сети, создав массив нулей правильной формы, который мы будем заполнять итеративно. Мы находим размер пакета, разделив весь наш набор данных на длину одной последовательности. Таким образом, размер пакета фактически равен количеству последовательностей в нашем наборе данных. На практике это означает, что все наши данные во время обучения состоят в одном пакете:

Идея состоит в том, что мы хотим предсказать последовательность той же длины, что и наш ввод, НО просто сдвинуть ее на один символ. Это часто встречается при использовании LSTM для прогнозирования, поскольку упрощает формирование данных. Затем мы практически предсказываем один символ за раз. Для последовательности [c, a, r, r, o] мы хотим получить на выходе последовательность [a, r, r, o, t]. Таким образом, каждый символ во входных данных имеет следующий символ в качестве метки (c -> a, a -> r, r -> r и т. д.).

Последняя и самая большая часть предварительной обработки данных — это создание правильных последовательностей для LSTM. Я шаг за шагом пройдусь по фрагменту кода в комментариях к Python:

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

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

Оставайтесь с нами и удачного кодирования!

P.S. ЧАСТЬ ПЕРВАЯ: https://bit.ly/2O61vLn