Практическое задание №1
1. Запустите jupyter notebook, создайте тетрадку в папке с данными, импортируйте следующие модули
import sys, json, codecs, csv
import numpy as np
import random
import pandas as pd
import tqdm
import itertools
import seaborn as sns
# visualization
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Импортируйте модули nltk для препроцессинга текста
from nltk.tokenize import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
Импортируйте модули keras для создания нейронной сети
from keras.layers import Dense, Activation
from keras.layers import LSTM, GRU, Dropout, BatchNormalization
from keras.layers import Input, Dense
from keras.models import Model
from keras.optimizers import RMSprop, Adam
# word2vec
from gensim.models import word2vec
2. Считайте данные о рецептах с помощью модуля csv
with codecs.open('./edimdoma_dataset.csv', 'r') as f:
reader = csv.reader(f)
for line_id, line in enumerate(reader):
if line_id == 0:
continue
doc = line[2]
recipe_info = json.loads(doc)
3. Получите и распечатайте полученные категории рецептов
category = recipe_info['recipeCategory'].strip() if 'recipeCategory' in recipe_info else 'NONE'
categories.append(category)
plt.figure(figsize=(12,8))
ax = sns.countplot(categories)
ax.set_xticklabels(ax.get_xticklabels(), rotation=40, ha="right")
plt.tight_layout()
plt.show()
4. Подготовьте входные данные для обучения нейронной сети, для этого:
a. Удалите слова из списка stopwords пакета nltk;
stop_words = stopwords.words('russian')
stop_words.extend(['.', ';', '!' ])
b. Объедините некоторые инструкции в одну большую строку;
c. Проведите токенизацию текста по предложениям;
d. Проведите токенизацию предложений по словам;
e. Переведите полученные слова в нижний регистр;
5. Обучите модель word2vec, используя тексты рецептов. Для этого подготовьте следующую конструкцию:
trained_word2vec = <train gensim word2vec with your sentences>
6. Задайте параметры нейронной сети, которая принимает на вход тексты рецептов и предсказывает их категорию:
out = Dense(len(cat2id), activation='*')(out)
model.compile("*", loss='*')
7. Разбейте данные на тренировочную и тестовую выборки, для этого реализуйте функцию get_batches(dataset, batch_count=64, batch_size=64, seq_size=20)
8. Инициируйте процесс обучения нейронной сети. Реализуйте код для вычисления тестового loss:
for epoch in range(100):
print("epoch: {}".format(epoch))
losses = []
for batch_x, batch_y in get_batches(train_dataset):
loss = model.train_on_batch(batch_x, batch_y)
losses.append(loss)
print("train_loss: {}".format(np.mean(losses)))
9. Проверьте как ваша модель работает на тестовой выборке, для этого напишите функцию predict(query), выполняющую команду:
preds = model.predict(np.expand_dims(batch, 0))[0]
for x in sorted(enumerate(preds), key=lambda x: x[1], reverse=True)[:5]:
print(u"{}: {}".format(cats[x[0]], x[1]))
10. Задачи для самостоятельной работы:
a) сделайте оптимизацию гиперпараметров нейронной сети. Попробуйте улучшить работу нейронной сети за счет слоев Batchnorm (https://arxiv.org/abs/1502.03167) и DropOut (https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf).
b) Обучите нейронную сеть, которая предсказывает время, необходимое для приготовления блюда по тексту рецепта. Используйте в качестве предсказываемого значения столбец «CookTime».