ckiias/lec4-3-nlp-conv.ipynb

324 lines
29 KiB
Plaintext

{
"cells": [
{
"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": "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": "code",
"execution_count": 4,
"id": "47f253ee",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
"</pre>\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ embedding (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">400</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">320,000</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ spatial_dropout1d │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">400</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">SpatialDropout1D</span>) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ conv1d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">398</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">49,408</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ global_max_pooling1d │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GlobalMaxPooling1D</span>) │ │ │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65,792</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">257</span> │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"</pre>\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": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">435,457</span> (1.66 MB)\n",
"</pre>\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": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">435,457</span> (1.66 MB)\n",
"</pre>\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": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\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": "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": [
"<keras.src.callbacks.history.History at 0x10830c080>"
]
},
"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": "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": "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": [
"<Figure size 640x480 with 1 Axes>"
]
},
"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
}