diff --git a/lec3-1-lenet.ipynb b/lec3-1-lenet.ipynb index e71c363..60c4f23 100644 --- a/lec3-1-lenet.ipynb +++ b/lec3-1-lenet.ipynb @@ -5,7 +5,7 @@ "id": "7915f17e", "metadata": {}, "source": [ - "### Инициализация Keras" + "#### Инициализация Keras" ] }, { @@ -930,8 +930,8 @@ "### Архитектура LeNet-5\n", "\n", "Изменения относительно оригинальной архитектуры:\n", - "- Увеличение фильтров в первом и втором сверточных слоях до 32 и 64 с 6 и 16.\n", - "- Снижение количества субдискретизации активаций до одной вместо двух.\n", + "- Увеличение фильтров в первом сверточном слое с 6 до 32 и втором сверточном слое с 16 до 64.\n", + "- Снижение количества субдискретизации активаций до одной вместо двух, только после второго сверточного слоя.\n", "- Применение функции активации ReLU." ] }, diff --git a/lec3-2-alexnet.ipynb b/lec3-2-alexnet.ipynb index 6f7a5f2..2054ea0 100644 --- a/lec3-2-alexnet.ipynb +++ b/lec3-2-alexnet.ipynb @@ -5,7 +5,26 @@ "id": "7915f17e", "metadata": {}, "source": [ - "### Инициализация Keras" + "#### Инициализация Keras\n", + "\n", + "Для ускорения обучения на GPU следует настраивать backend под конкретную ОС и модель GPU.\n", + "\n", + "Для ускорения pytorch на Windows и свежей карте от NVidia следует установить вместо обычного pytorch:\n", + "```\n", + "torch = { version = \"^2.7.0+cu128\", source = \"pytorch-cuda128\" }\n", + "torchaudio = { version = \"^2.7.0+cu128\", source = \"pytorch-cuda128\" }\n", + "torchvision = { version = \"^0.22.0+cu128\", source = \"pytorch-cuda128\" }\n", + "```\n", + "\n", + "Обязательно следует включить репозиторий\n", + "```\n", + "[[tool.poetry.source]]\n", + "name = \"pytorch-cuda128\"\n", + "url = \"https://download.pytorch.org/whl/cu128\"\n", + "priority = \"explicit\"\n", + "```\n", + "\n", + "Для macOS можно использовать jax 0.5.0 (обязательно такая версия) + jax-metal 0.1.1" ] }, { @@ -40,7 +59,7 @@ "\n", "В данном примере используется фрагмент набора данных Cats and Dogs Classification Dataset\n", "\n", - "В наборе данных два класса: кошки и собаки\n", + "В наборе данных два класса (всего 24 998 изображений): кошки (12 499 изображения) и собаки (12 499 изображения)\n", "\n", "Ссылка: https://www.kaggle.com/datasets/bhavikjikadara/dog-and-cat-classification-dataset" ] @@ -64,7 +83,19 @@ "id": "85652835", "metadata": {}, "source": [ - "#### Формирование выборок" + "#### Формирование выборок\n", + "\n", + "Для формирования выборок используется устаревший (deprecated) класс ImageDataGenerator\n", + "\n", + "Вместо него рекомендуется использовать image_dataset_from_directory (https://keras.io/api/data_loading/image/)\n", + "\n", + "Для использования image_dataset_from_directory требуется tensorflow\n", + "\n", + "ImageDataGenerator формирует две выборки: обучающую и валидационную (80 на 20).\n", + "\n", + "В каждой выборке изображения масштабируются до размера 224 на 224 пиксела с RGB пространством.\n", + "\n", + "Изображения подгружаются с диска в процессе обучения и валидации модели." ] }, { @@ -129,7 +160,9 @@ "id": "bfb9434d", "metadata": {}, "source": [ - "### Архитектура AlexNet" + "### Архитектура AlexNet\n", + "\n", + "Модель AlexNet описана в лекции про глубокое обучение" ] }, { @@ -595,7 +628,9 @@ "id": "a831795e", "metadata": {}, "source": [ - "#### Оценка качества модели" + "#### Оценка качества модели\n", + "\n", + "Качество модели - 88.2 %.#### Оценка качества модели" ] }, { @@ -626,6 +661,16 @@ "alexnet_model.evaluate(valid)" ] }, + { + "cell_type": "markdown", + "id": "7c1b7fd8", + "metadata": {}, + "source": [ + "#### Пример использования обученной модели\n", + "\n", + "Для примера используются случайные изображения из сети Интернет" + ] + }, { "cell_type": "code", "execution_count": 16, diff --git a/lec3-3-transfer-learning.ipynb b/lec3-3-transfer-learning.ipynb index 20c4e8e..13b20cd 100644 --- a/lec3-3-transfer-learning.ipynb +++ b/lec3-3-transfer-learning.ipynb @@ -5,7 +5,26 @@ "id": "7915f17e", "metadata": {}, "source": [ - "### Инициализация Keras" + "#### Инициализация Keras\n", + "\n", + "Для ускорения обучения на GPU следует настраивать backend под конкретную ОС и модель GPU.\n", + "\n", + "Для ускорения pytorch на Windows и свежей карте от NVidia следует установить вместо обычного pytorch:\n", + "```\n", + "torch = { version = \"^2.7.0+cu128\", source = \"pytorch-cuda128\" }\n", + "torchaudio = { version = \"^2.7.0+cu128\", source = \"pytorch-cuda128\" }\n", + "torchvision = { version = \"^0.22.0+cu128\", source = \"pytorch-cuda128\" }\n", + "```\n", + "\n", + "Обязательно следует включить репозиторий\n", + "```\n", + "[[tool.poetry.source]]\n", + "name = \"pytorch-cuda128\"\n", + "url = \"https://download.pytorch.org/whl/cu128\"\n", + "priority = \"explicit\"\n", + "```\n", + "\n", + "Для macOS можно использовать jax 0.5.0 (обязательно такая версия) + jax-metal 0.1.1" ] }, { @@ -40,7 +59,7 @@ "\n", "В данном примере используется фрагмент набора данных Cats and Dogs Classification Dataset\n", "\n", - "В наборе данных два класса: кошки и собаки\n", + "В наборе данных два класса (всего 24 998 изображений): кошки (12 499 изображения) и собаки (12 499 изображения)\n", "\n", "Ссылка: https://www.kaggle.com/datasets/bhavikjikadara/dog-and-cat-classification-dataset" ] @@ -64,7 +83,19 @@ "id": "85652835", "metadata": {}, "source": [ - "#### Формирование выборок" + "#### Формирование выборок\n", + "\n", + "Для формирования выборок используется устаревший (deprecated) класс ImageDataGenerator\n", + "\n", + "Вместо него рекомендуется использовать image_dataset_from_directory (https://keras.io/api/data_loading/image/)\n", + "\n", + "Для использования image_dataset_from_directory требуется tensorflow\n", + "\n", + "ImageDataGenerator формирует две выборки: обучающую и валидационную (80 на 20).\n", + "\n", + "В каждой выборке изображения масштабируются до размера 224 на 224 пиксела с RGB пространством.\n", + "\n", + "Изображения подгружаются с диска в процессе обучения и валидации модели." ] }, { @@ -137,7 +168,10 @@ "id": "ae32c572", "metadata": {}, "source": [ - "Загрузка предобученной модели и отключение обучения для ее слоев" + "Загрузка предобученной модели VGG19:\n", + "- Загрузка весов, полученных при обучении модели на наборе данных ImageNet\n", + "- Отключение полносвязанных слоев для адаптации к новой задаче\n", + "- Модель будет работать с изображениями 224 на 224 пиксела и RGB пространством" ] }, { @@ -274,7 +308,9 @@ "id": "49fceead", "metadata": {}, "source": [ - "#### Обучение глубокой модели" + "#### Обучение глубокой модели\n", + "\n", + "Обучение остановлено после второго шага, так как качество модели приемлемое" ] }, { @@ -358,7 +394,9 @@ "id": "a831795e", "metadata": {}, "source": [ - "#### Оценка качества модели" + "#### Оценка качества модели\n", + "\n", + "Качество модели - 96.3 %." ] }, { @@ -389,6 +427,16 @@ "tl_model.evaluate(valid)" ] }, + { + "cell_type": "markdown", + "id": "9d0106c8", + "metadata": {}, + "source": [ + "#### Пример использования обученной модели\n", + "\n", + "Для примера используются случайные изображения из сети Интернет" + ] + }, { "cell_type": "code", "execution_count": 8, diff --git a/lec4-1-preprocessing.ipynb b/lec4-1-preprocessing.ipynb index bbbcc42..ee4ae95 100644 --- a/lec4-1-preprocessing.ipynb +++ b/lec4-1-preprocessing.ipynb @@ -1,5 +1,21 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "d5b48413", + "metadata": {}, + "source": [ + "### Пример предобработки и векторизации текстовых данных с помощью word2vec" + ] + }, + { + "cell_type": "markdown", + "id": "1ce7f779", + "metadata": {}, + "source": [ + "#### Инициализация spacy и загрузка модели для русского языка" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -12,6 +28,14 @@ "sp = spacy.load(\"ru_core_news_lg\")" ] }, + { + "cell_type": "markdown", + "id": "e0445088", + "metadata": {}, + "source": [ + "#### Загрузка содержимого текстовых документов" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -220,6 +244,21 @@ "display(df.head(), df.tail())" ] }, + { + "cell_type": "markdown", + "id": "6c67ab8d", + "metadata": {}, + "source": [ + "#### Предобработка текстовых данных\n", + "- приведение к нижнему регистру;\n", + "- удаление стоп-слов;\n", + "- удаление знаков препинания и спец-символов;\n", + "- лемматизация;\n", + "- формирование би-грамм с помощью Phraser, Phrases.\n", + "\n", + "У Phrases можно изменять параметры: min_count и threshold (минимальное количество вхождений и порог оценки устойчивости) для повышения качества полученных би-грамм." + ] + }, { "cell_type": "code", "execution_count": 4, @@ -699,6 +738,21 @@ "df" ] }, + { + "cell_type": "markdown", + "id": "03c24ec0", + "metadata": {}, + "source": [ + "#### Векторизация текстовых данных с помощью word2vec\n", + "- функция explode объединяет все массивы столбца prep_text в один;\n", + "- будет получено 64-мерное пространство (векторы длиной 64 элемента);\n", + "- используется метод skip-gram (sg=1). Данный метод предпочтительно использовать на небольшом корпусе, а CBOW на большом (sg=0);\n", + "- размер окна 10 (по 10 слов слева и справа от текущего для вычисления контекста);\n", + "- min_count - минимальное количество вхождений слова в корпус для включения в n-мерное пространство;\n", + "- workers - количество потоков для вычисления;\n", + "- seed - задание начального состояния для повторяемости (random_state).\n" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -720,6 +774,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "ef97fa8a", + "metadata": {}, + "source": [ + "#### Вывод уникальных идентификаторов для каждого слова\n", + "\n", + "Слова в пространстве хранятся в виде числового идентификатора для сокращения потребления памяти" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -1741,6 +1805,14 @@ "word2vec.wv.key_to_index" ] }, + { + "cell_type": "markdown", + "id": "63be2cce", + "metadata": {}, + "source": [ + "#### Вывод трех наиболее похожих по смыслу слова для слова 1С" + ] + }, { "cell_type": "code", "execution_count": 7, @@ -1764,6 +1836,14 @@ "word2vec.wv.most_similar(\"1с\", topn=3)" ] }, + { + "cell_type": "markdown", + "id": "b1c06780", + "metadata": {}, + "source": [ + "#### Координаты слова 1С в 64-мерном пространстве" + ] + }, { "cell_type": "code", "execution_count": 8, @@ -1801,6 +1881,14 @@ "word2vec.wv[\"1с\"]" ] }, + { + "cell_type": "markdown", + "id": "98434d1e", + "metadata": {}, + "source": [ + "#### Поиск лишнего по смыслу слова (самое отдаленное по смыслу слово)" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -1822,6 +1910,14 @@ "word2vec.wv.doesnt_match(\"java php 1с oracle заказчик\".split())" ] }, + { + "cell_type": "markdown", + "id": "88684648", + "metadata": {}, + "source": [ + "#### Смысловое расстояние между словами (расстояние в пространстве)" + ] + }, { "cell_type": "code", "execution_count": 10, @@ -1864,6 +1960,14 @@ "word2vec.wv.similarity(\"java\", \"1с\")" ] }, + { + "cell_type": "markdown", + "id": "98c93159", + "metadata": {}, + "source": [ + "#### Векторная арифметика: 1c - бухгалтерия + машина =" + ] + }, { "cell_type": "code", "execution_count": 12, @@ -1894,6 +1998,14 @@ "word2vec.wv.most_similar(positive=[\"1с\", \"машина\"], negative=[\"бухгалтерия\"])" ] }, + { + "cell_type": "markdown", + "id": "86ab3f05", + "metadata": {}, + "source": [ + "#### Векторная арифметика: субд - база + язык =" + ] + }, { "cell_type": "code", "execution_count": 13, @@ -1924,6 +2036,14 @@ "word2vec.wv.most_similar(positive=[\"субд\", \"язык\"], negative=[\"база\"])" ] }, + { + "cell_type": "markdown", + "id": "a293bb05", + "metadata": {}, + "source": [ + "#### Векторная арифметика: java - машина + бухгалтерия =" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -1954,6 +2074,14 @@ "word2vec.wv.most_similar(positive=[\"java\", \"бухгалтерия\"], negative=[\"машина\"])" ] }, + { + "cell_type": "markdown", + "id": "b70332a5", + "metadata": {}, + "source": [ + "#### Векторная арифметика: 866 - мгц + мбайт =" + ] + }, { "cell_type": "code", "execution_count": 15, @@ -1984,6 +2112,14 @@ "word2vec.wv.most_similar(positive=[\"866\", \"мбайт\"], negative=[\"мгц\"])" ] }, + { + "cell_type": "markdown", + "id": "4f41fc6e", + "metadata": {}, + "source": [ + "#### Векторная арифметика: 866 - процессор + память =" + ] + }, { "cell_type": "code", "execution_count": 18, @@ -2014,6 +2150,14 @@ "word2vec.wv.most_similar(positive=[\"866\", \"память\"], negative=[\"процессор\"])" ] }, + { + "cell_type": "markdown", + "id": "a0414122", + "metadata": {}, + "source": [ + "#### Понижение размерности векторного пространства с 64 до 2 измерений" + ] + }, { "cell_type": "code", "execution_count": 19, @@ -2151,6 +2295,16 @@ "coords_df" ] }, + { + "cell_type": "markdown", + "id": "52e7a09b", + "metadata": {}, + "source": [ + "#### Визуализация векторного пространства\n", + "\n", + "Диаграмма интерактивная и позволяет изменять масштаб и перемещаться" + ] + }, { "cell_type": "code", "execution_count": 20, diff --git a/lec4-2-nlp-dense.ipynb b/lec4-2-nlp-dense.ipynb index 2a32930..f29235a 100644 --- a/lec4-2-nlp-dense.ipynb +++ b/lec4-2-nlp-dense.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "0fd64751", + "metadata": {}, + "source": [ + "#### Инициализация Keras" + ] + }, { "cell_type": "code", "execution_count": 12, @@ -23,6 +31,24 @@ "print(keras.__version__)" ] }, + { + "cell_type": "markdown", + "id": "c5e00991", + "metadata": {}, + "source": [ + "#### Загрузка данных для классификации с помощью глубоких сетей\n", + "\n", + "В качестве набора данных используется набор отзывов к фильмам с сайта IMDB.\n", + "\n", + "Набор включает 50 000 отзывов, половина из которых находится в обучающем наборе данных (x_train), а половина - в тестовом (x_valid). \n", + "\n", + "Данные уже предобработаны для простоты работы с ними.\n", + "\n", + "unique_words - в векторное пространство включается только слова, которые встречаются в корпусе не менее 5000 раз.\n", + "\n", + "max_length - максимальная длина отзыва (если больше, то обрезается, если меньше, то дополняется \"пустыми\" словами)." + ] + }, { "cell_type": "code", "execution_count": 13, @@ -43,6 +69,23 @@ "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words, skip_top=50)" ] }, + { + "cell_type": "markdown", + "id": "022cf1f8", + "metadata": {}, + "source": [ + "#### Исследование набора данных\n", + "\n", + "Все слова закодированы числовыми идентификаторами для снижения расхода памяти\n", + "\n", + "Идентификаторы 0, 1 и 2 зарезервированы:\n", + "- 0 (PAD) - заполняющее (\"пустое\") слово для дополнения отзывов до длины 100;\n", + "- 1 (START) - определяет начло отзыва;\n", + "- 2 (UNK) - отфильтрованные при загрузке отзывов слова (редкие слова или стоп-слов).\n", + "\n", + "Далее идентификаторы определяют слова в порядке снижения частоты их встречаемости в корпусе." + ] + }, { "cell_type": "code", "execution_count": 14, @@ -1070,6 +1113,16 @@ "index_word" ] }, + { + "cell_type": "markdown", + "id": "a04781ef", + "metadata": {}, + "source": [ + "#### Вывод первого отзыва из тренировочной выборки\n", + "\n", + "Отзывы содержат только идентификаторы для экономии памяти" + ] + }, { "cell_type": "code", "execution_count": 15, @@ -1308,6 +1361,14 @@ "X_train[0]" ] }, + { + "cell_type": "markdown", + "id": "d0eca5f5", + "metadata": {}, + "source": [ + "#### Можно заменить идентификаторы на реальные слова с учетом предобработки" + ] + }, { "cell_type": "code", "execution_count": 16, @@ -1329,6 +1390,14 @@ "\" \".join(index_word[id] for id in X_train[0])" ] }, + { + "cell_type": "markdown", + "id": "ab903f3e", + "metadata": {}, + "source": [ + "#### Можно вывести изначальный отзыв (если выключить удаление редких слов и стоп-слов)" + ] + }, { "cell_type": "code", "execution_count": 17, @@ -1351,6 +1420,16 @@ "\" \".join(index_word[id] for id in textual_X_train[0])" ] }, + { + "cell_type": "markdown", + "id": "35e4c578", + "metadata": {}, + "source": [ + "#### Приведение отзывов к длине max_length (100)\n", + "\n", + "padding и truncating - дополнение и обрезка отзывов начинается с начала (учитывается специфика затухания градиента в рекуррентных сетях)" + ] + }, { "cell_type": "code", "execution_count": 18, @@ -1364,6 +1443,16 @@ "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" ] }, + { + "cell_type": "markdown", + "id": "87eac800", + "metadata": {}, + "source": [ + "#### Формирование архитектуры глубокой полносвязанной сети\n", + "\n", + "Первый слой (Embedding) выполняет векторизацию" + ] + }, { "cell_type": "code", "execution_count": 19, @@ -1475,6 +1564,18 @@ "simple_model.summary()" ] }, + { + "cell_type": "markdown", + "id": "0ff9c40a", + "metadata": {}, + "source": [ + "#### Обучение модели\n", + "\n", + "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", + "\n", + "В дальнейшем веса можно загрузить" + ] + }, { "cell_type": "code", "execution_count": 20, @@ -1525,6 +1626,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "3c495301", + "metadata": {}, + "source": [ + "#### Загрузка лучшей модели и оценка ее качества\n", + "\n", + "Качество модели - 84.6 %." + ] + }, { "cell_type": "code", "execution_count": 21, @@ -1554,6 +1665,14 @@ "simple_model.evaluate(X_valid, y_valid)" ] }, + { + "cell_type": "markdown", + "id": "b1157104", + "metadata": {}, + "source": [ + "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" + ] + }, { "cell_type": "code", "execution_count": 22, diff --git a/lec4-3-nlp-conv.ipynb b/lec4-3-nlp-conv.ipynb index 83dbcd5..d2c8841 100644 --- a/lec4-3-nlp-conv.ipynb +++ b/lec4-3-nlp-conv.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "624cd060", + "metadata": {}, + "source": [ + "#### Инициализация Keras" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -43,6 +51,16 @@ "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" ] }, + { + "cell_type": "markdown", + "id": "43bc7663", + "metadata": {}, + "source": [ + "#### Приведение отзывов к длине max_length (400)\n", + "\n", + "padding и truncating - дополнение и обрезка отзывов начинается с начала (учитывается специфика затухания градиента в рекуррентных сетях)" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -56,6 +74,16 @@ "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" ] }, + { + "cell_type": "markdown", + "id": "38c26048", + "metadata": {}, + "source": [ + "#### Формирование архитектуры глубокой сверточной сети\n", + "\n", + "Первый слой (Embedding) выполняет векторизацию" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -188,6 +216,18 @@ "conv_model.summary()" ] }, + { + "cell_type": "markdown", + "id": "ddab8c65", + "metadata": {}, + "source": [ + "#### Обучение модели\n", + "\n", + "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", + "\n", + "В дальнейшем веса можно загрузить" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -238,6 +278,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "e5e1e1b7", + "metadata": {}, + "source": [ + "#### Загрузка лучшей модели и оценка ее качества\n", + "\n", + "Качество модели - 89.1 %." + ] + }, { "cell_type": "code", "execution_count": 6, @@ -267,6 +317,14 @@ "conv_model.evaluate(X_valid, y_valid)" ] }, + { + "cell_type": "markdown", + "id": "ee31cb44", + "metadata": {}, + "source": [ + "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" + ] + }, { "cell_type": "code", "execution_count": 7, diff --git a/lec4-4-nlp-rnn.ipynb b/lec4-4-nlp-rnn.ipynb index 1079499..6c82573 100644 --- a/lec4-4-nlp-rnn.ipynb +++ b/lec4-4-nlp-rnn.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "e13159d6", + "metadata": {}, + "source": [ + "#### Инициализация Keras\n", + "\n", + "torch был заменен на jax, так как с torch рекуррентные сети не работали" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -23,6 +33,29 @@ "print(keras.__version__)" ] }, + { + "cell_type": "markdown", + "id": "06e989a5", + "metadata": {}, + "source": [ + "#### Загрузка данных для классификации с помощью глубоких сетей\n", + "\n", + "В качестве набора данных используется набор отзывов к фильмам с сайта IMDB.\n", + "\n", + "Набор включает 50 000 отзывов, половина из которых находится в обучающем наборе данных (x_train), а половина - в тестовом (x_valid). \n", + "\n", + "Метки (y_train и y_valid) имеют бинарный характер и назначены в соответствии с этими 10-балльными оценками:\n", + "- отзывы с четырьмя звездами или меньше считаются отрицательным (y = 0);\n", + "- отзывы с семью звездами или больше считаются положительными (y = 1);\n", + "- умеренные отзывы — с пятью или шестью звездами — не включались в набор данных, что упрощает задачу бинарной классификации.\n", + "\n", + "Данные уже предобработаны для простоты работы с ними.\n", + "\n", + "unique_words - в векторное пространство включается только слова, которые встречаются в корпусе не менее 10 000 раз.\n", + "\n", + "max_length - максимальная длина отзыва (если больше, то обрезается, если меньше, то дополняется \"пустыми\" словами)." + ] + }, { "cell_type": "code", "execution_count": 2, @@ -43,6 +76,16 @@ "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" ] }, + { + "cell_type": "markdown", + "id": "86b62f23", + "metadata": {}, + "source": [ + "#### Приведение отзывов к длине max_length (100)\n", + "\n", + "padding и truncating - дополнение и обрезка отзывов начинается с начала (учитывается специфика затухания градиента в рекуррентных сетях)" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -56,6 +99,17 @@ "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" ] }, + { + "cell_type": "markdown", + "id": "a78bde02", + "metadata": {}, + "source": [ + "#### Формирование архитектуры глубокой рекуррентной сети\n", + "\n", + "\n", + "Первый слой (Embedding) выполняет векторизацию" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -164,6 +218,18 @@ "rnn_model.summary()" ] }, + { + "cell_type": "markdown", + "id": "23900b11", + "metadata": {}, + "source": [ + "#### Обучение модели\n", + "\n", + "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", + "\n", + "В дальнейшем веса можно загрузить" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -238,6 +304,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "ccf878d3", + "metadata": {}, + "source": [ + "#### Загрузка лучшей модели и оценка ее качества\n", + "\n", + "Качество модели - 73.6 %." + ] + }, { "cell_type": "code", "execution_count": 6, @@ -267,6 +343,14 @@ "rnn_model.evaluate(X_valid, y_valid)" ] }, + { + "cell_type": "markdown", + "id": "e05b98c0", + "metadata": {}, + "source": [ + "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" + ] + }, { "cell_type": "code", "execution_count": 7, diff --git a/lec4-5-nlp-lstm.ipynb b/lec4-5-nlp-lstm.ipynb index ad95b6b..18c9456 100644 --- a/lec4-5-nlp-lstm.ipynb +++ b/lec4-5-nlp-lstm.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "67f49f36", + "metadata": {}, + "source": [ + "#### Инициализация Keras\n", + "\n", + "torch был заменен на jax, так как с torch рекуррентные сети не работали" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -23,6 +33,29 @@ "print(keras.__version__)" ] }, + { + "cell_type": "markdown", + "id": "b0bb5f9b", + "metadata": {}, + "source": [ + "#### Загрузка данных для классификации с помощью глубоких сетей\n", + "\n", + "В качестве набора данных используется набор отзывов к фильмам с сайта IMDB.\n", + "\n", + "Набор включает 50 000 отзывов, половина из которых находится в обучающем наборе данных (x_train), а половина - в тестовом (x_valid). \n", + "\n", + "Метки (y_train и y_valid) имеют бинарный характер и назначены в соответствии с этими 10-балльными оценками:\n", + "- отзывы с четырьмя звездами или меньше считаются отрицательным (y = 0);\n", + "- отзывы с семью звездами или больше считаются положительными (y = 1);\n", + "- умеренные отзывы — с пятью или шестью звездами — не включались в набор данных, что упрощает задачу бинарной классификации.\n", + "\n", + "Данные уже предобработаны для простоты работы с ними.\n", + "\n", + "unique_words - в векторное пространство включается только слова, которые встречаются в корпусе не менее 10 000 раз.\n", + "\n", + "max_length - максимальная длина отзыва (если больше, то обрезается, если меньше, то дополняется \"пустыми\" словами)." + ] + }, { "cell_type": "code", "execution_count": 2, @@ -43,6 +76,16 @@ "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" ] }, + { + "cell_type": "markdown", + "id": "6cac9141", + "metadata": {}, + "source": [ + "#### Приведение отзывов к длине max_length (100)\n", + "\n", + "padding и truncating - дополнение и обрезка отзывов начинается с начала (учитывается специфика затухания градиента в рекуррентных сетях)" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -56,6 +99,17 @@ "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" ] }, + { + "cell_type": "markdown", + "id": "02e37d8c", + "metadata": {}, + "source": [ + "#### Формирование архитектуры глубокой рекуррентной LSTM сети\n", + "\n", + "\n", + "Первый слой (Embedding) выполняет векторизацию" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -164,6 +218,18 @@ "lstm_model.summary()" ] }, + { + "cell_type": "markdown", + "id": "05334f15", + "metadata": {}, + "source": [ + "#### Обучение модели\n", + "\n", + "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", + "\n", + "В дальнейшем веса можно загрузить" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -214,6 +280,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "e3b39f42", + "metadata": {}, + "source": [ + "#### Загрузка лучшей модели и оценка ее качества\n", + "\n", + "Качество модели - 85.3 %." + ] + }, { "cell_type": "code", "execution_count": 6, @@ -243,6 +319,14 @@ "lstm_model.evaluate(X_valid, y_valid)" ] }, + { + "cell_type": "markdown", + "id": "d1aa3151", + "metadata": {}, + "source": [ + "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" + ] + }, { "cell_type": "code", "execution_count": 7, diff --git a/lec4-6-nlp-blstm.ipynb b/lec4-6-nlp-blstm.ipynb index 18fc6eb..fbc163c 100644 --- a/lec4-6-nlp-blstm.ipynb +++ b/lec4-6-nlp-blstm.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "c2308ffe", + "metadata": {}, + "source": [ + "#### Инициализация Keras\n", + "\n", + "torch был заменен на jax, так как с torch рекуррентные сети не работали" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -23,6 +33,29 @@ "print(keras.__version__)" ] }, + { + "cell_type": "markdown", + "id": "8e4a9a71", + "metadata": {}, + "source": [ + "#### Загрузка данных для классификации с помощью глубоких сетей\n", + "\n", + "В качестве набора данных используется набор отзывов к фильмам с сайта IMDB.\n", + "\n", + "Набор включает 50 000 отзывов, половина из которых находится в обучающем наборе данных (x_train), а половина - в тестовом (x_valid). \n", + "\n", + "Метки (y_train и y_valid) имеют бинарный характер и назначены в соответствии с этими 10-балльными оценками:\n", + "- отзывы с четырьмя звездами или меньше считаются отрицательным (y = 0);\n", + "- отзывы с семью звездами или больше считаются положительными (y = 1);\n", + "- умеренные отзывы — с пятью или шестью звездами — не включались в набор данных, что упрощает задачу бинарной классификации.\n", + "\n", + "Данные уже предобработаны для простоты работы с ними.\n", + "\n", + "unique_words - в векторное пространство включается только слова, которые встречаются в корпусе не менее 10 000 раз.\n", + "\n", + "max_length - максимальная длина отзыва (если больше, то обрезается, если меньше, то дополняется \"пустыми\" словами)." + ] + }, { "cell_type": "code", "execution_count": 2, @@ -43,6 +76,16 @@ "(X_train, y_train), (X_valid, y_valid) = imdb.load_data(num_words=unique_words)" ] }, + { + "cell_type": "markdown", + "id": "c58423e9", + "metadata": {}, + "source": [ + "#### Приведение отзывов к длине max_length (100)\n", + "\n", + "padding и truncating - дополнение и обрезка отзывов начинается с начала (учитывается специфика затухания градиента в рекуррентных сетях)" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -56,6 +99,17 @@ "X_valid = pad_sequences(X_valid, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)" ] }, + { + "cell_type": "markdown", + "id": "7db364f4", + "metadata": {}, + "source": [ + "#### Формирование архитектуры глубокой рекуррентной двунаправленной LSTM сети\n", + "\n", + "\n", + "Первый слой (Embedding) выполняет векторизацию" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -164,6 +218,18 @@ "blstm_model.summary()" ] }, + { + "cell_type": "markdown", + "id": "3a826105", + "metadata": {}, + "source": [ + "#### Обучение модели\n", + "\n", + "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", + "\n", + "В дальнейшем веса можно загрузить" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -218,6 +284,16 @@ ")" ] }, + { + "cell_type": "markdown", + "id": "a47a8ff6", + "metadata": {}, + "source": [ + "#### Загрузка лучшей модели и оценка ее качества\n", + "\n", + "Качество модели - 84.6 %." + ] + }, { "cell_type": "code", "execution_count": 6, @@ -247,6 +323,14 @@ "blstm_model.evaluate(X_valid, y_valid)" ] }, + { + "cell_type": "markdown", + "id": "7001f712", + "metadata": {}, + "source": [ + "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" + ] + }, { "cell_type": "code", "execution_count": 7,