{ "cells": [ { "cell_type": "markdown", "id": "624cd060", "metadata": {}, "source": [ "#### Инициализация Keras" ] }, { "cell_type": "code", "execution_count": 1, "id": "507915ea", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.9.2\n" ] } ], "source": [ "import os\n", "\n", "os.environ[\"KERAS_BACKEND\"] = \"torch\"\n", "import keras\n", "\n", "print(keras.__version__)" ] }, { "cell_type": "code", "execution_count": 2, "id": "e0043e5c", "metadata": {}, "outputs": [], "source": [ "from keras.api.datasets import imdb\n", "import os\n", "\n", "unique_words = 5000\n", "max_length = 400\n", "\n", "output_dir = \"tmp\"\n", "if not os.path.exists(output_dir):\n", " os.makedirs(output_dir)\n", "\n", "(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, "id": "131e125a", "metadata": {}, "outputs": [], "source": [ "from keras.api.preprocessing.sequence import pad_sequences\n", "\n", "X_train = pad_sequences(X_train, maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)\n", "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, "id": "47f253ee", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ embedding (Embedding)           │ (None, 400, 64)        │       320,000 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ spatial_dropout1d               │ (None, 400, 64)        │             0 │\n",
       "│ (SpatialDropout1D)              │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ conv1d (Conv1D)                 │ (None, 398, 256)       │        49,408 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ global_max_pooling1d            │ (None, 256)            │             0 │\n",
       "│ (GlobalMaxPooling1D)            │                        │               │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense (Dense)                   │ (None, 256)            │        65,792 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dropout (Dropout)               │ (None, 256)            │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_1 (Dense)                 │ (None, 1)              │           257 │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", "│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m400\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m320,000\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m400\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m398\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m49,408\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ global_max_pooling1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "│ (\u001b[38;5;33mGlobalMaxPooling1D\u001b[0m) │ │ │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 435,457 (1.66 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m435,457\u001b[0m (1.66 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 435,457 (1.66 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m435,457\u001b[0m (1.66 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 0 (0.00 B)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from keras.api.models import Sequential\n", "from keras.api.layers import InputLayer, Embedding, SpatialDropout1D, Conv1D, GlobalMaxPooling1D, Dense, Dropout\n", "\n", "conv_model = Sequential()\n", "conv_model.add(InputLayer(shape=(max_length,), dtype=\"float32\"))\n", "conv_model.add(Embedding(unique_words, 64))\n", "conv_model.add(SpatialDropout1D(0.2))\n", "\n", "# сверточный слой\n", "conv_model.add(Conv1D(256, 3, activation=\"relu\"))\n", "\n", "conv_model.add(GlobalMaxPooling1D())\n", "\n", "# полносвязанный слой\n", "conv_model.add(Dense(256, activation=\"relu\"))\n", "conv_model.add(Dropout(0.2))\n", "\n", "# выходной слой\n", "conv_model.add(Dense(1, activation=\"sigmoid\"))\n", "\n", "conv_model.summary()" ] }, { "cell_type": "markdown", "id": "ddab8c65", "metadata": {}, "source": [ "#### Обучение модели\n", "\n", "Веса модели сохраняются в каталог tmp после каждой эпохи обучения с помощью callback-параметра\n", "\n", "В дальнейшем веса можно загрузить" ] }, { "cell_type": "code", "execution_count": 5, "id": "68838a5a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/4\n", "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 48ms/step - accuracy: 0.6241 - loss: 0.6084 - val_accuracy: 0.8735 - val_loss: 0.3017\n", "Epoch 2/4\n", "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 44ms/step - accuracy: 0.8978 - loss: 0.2526 - val_accuracy: 0.8906 - val_loss: 0.2637\n", "Epoch 3/4\n", "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 45ms/step - accuracy: 0.9400 - loss: 0.1670 - val_accuracy: 0.8906 - val_loss: 0.2735\n", "Epoch 4/4\n", "\u001b[1m196/196\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m9s\u001b[0m 46ms/step - accuracy: 0.9648 - loss: 0.1062 - val_accuracy: 0.8894 - val_loss: 0.3019\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from keras.api.callbacks import ModelCheckpoint\n", "\n", "conv_model.compile(\n", " loss=\"binary_crossentropy\",\n", " optimizer=\"adam\",\n", " metrics=[\"accuracy\"],\n", ")\n", "\n", "conv_model.fit(\n", " X_train,\n", " y_train,\n", " batch_size=128,\n", " epochs=4,\n", " validation_data=(X_valid, y_valid),\n", " callbacks=[ModelCheckpoint(filepath=output_dir + \"/conv_weights.{epoch:02d}.keras\")],\n", ")" ] }, { "cell_type": "markdown", "id": "e5e1e1b7", "metadata": {}, "source": [ "#### Загрузка лучшей модели и оценка ее качества\n", "\n", "Качество модели - 89.1 %." ] }, { "cell_type": "code", "execution_count": 6, "id": "6475dab9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 8ms/step - accuracy: 0.8874 - loss: 0.2689\n" ] }, { "data": { "text/plain": [ "[0.2637385427951813, 0.89055997133255]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "conv_model.load_weights(output_dir + \"/conv_weights.02.keras\")\n", "conv_model.evaluate(X_valid, y_valid)" ] }, { "cell_type": "markdown", "id": "ee31cb44", "metadata": {}, "source": [ "#### Визуализация распределения вероятностей результатов модели на валидационной выборке" ] }, { "cell_type": "code", "execution_count": 7, "id": "bf2d2d6c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 4ms/step\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "plt.hist(conv_model.predict(X_valid))\n", "_ = plt.axvline(x=0.5, color=\"orange\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv (3.12.10)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.10" } }, "nbformat": 4, "nbformat_minor": 5 }