diff --git a/labworks/LW4/1.png b/labworks/LW4/1.png new file mode 100644 index 0000000..875a23a Binary files /dev/null and b/labworks/LW4/1.png differ diff --git a/labworks/LW4/2.png b/labworks/LW4/2.png new file mode 100644 index 0000000..44b6d48 Binary files /dev/null and b/labworks/LW4/2.png differ diff --git a/labworks/LW4/Untitled4.ipynb b/labworks/LW4/Untitled4.ipynb new file mode 100644 index 0000000..3b9990e --- /dev/null +++ b/labworks/LW4/Untitled4.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"gpuType":"T4","mount_file_id":"1dQiaK4Y4D4eYkkKYx5IBKLvpkudanxQO","authorship_tag":"ABX9TyORSDet3l9scspyGr9Z+1WD"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"accelerator":"GPU"},"cells":[{"cell_type":"code","execution_count":2,"metadata":{"id":"rASa9J7lykKr","executionInfo":{"status":"ok","timestamp":1765983141737,"user_tz":-180,"elapsed":41,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}}},"outputs":[],"source":["import os\n","os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')"]},{"cell_type":"code","source":["from tensorflow import keras\n","from tensorflow.keras import layers\n","from tensorflow.keras.models import Sequential\n","import matplotlib.pyplot as plt\n","import numpy as np\n","\n","import tensorflow as tf\n","device_name = tf.test.gpu_device_name()\n","if device_name != '/device:GPU:0':\n"," raise SystemError('GPU device not found')\n","print('Found GPU at: {}'.format(device_name))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ivnaOo__zEWA","executionInfo":{"status":"ok","timestamp":1765983184600,"user_tz":-180,"elapsed":9392,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"382aaeea-c183-4225-bd05-15447035225a"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["Found GPU at: /device:GPU:0\n"]}]},{"cell_type":"code","source":["from keras.datasets import imdb\n","\n","vocabulary_size = 5000\n","index_from = 3\n","\n","(X_train, y_train), (X_test, y_test) = imdb.load_data(\n"," path=\"imdb.npz\",\n"," num_words=vocabulary_size,\n"," skip_top=0,\n"," maxlen=None,\n"," seed=23,\n"," start_char=1,\n"," oov_char=2,\n"," index_from=index_from\n"," )\n","\n","print('Shape of X train:', X_train.shape)\n","print('Shape of y train:', y_train.shape)\n","print('Shape of X test:', X_test.shape)\n","print('Shape of y test:', y_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vEvCcnAazRYl","executionInfo":{"status":"ok","timestamp":1765983273528,"user_tz":-180,"elapsed":6591,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"c030c415-4ee5-418f-958d-5105ea420484"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz\n","\u001b[1m17464789/17464789\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 0us/step\n","Shape of X train: (25000,)\n","Shape of y train: (25000,)\n","Shape of X test: (25000,)\n","Shape of y test: (25000,)\n"]}]},{"cell_type":"code","source":["# создание словаря для перевода индексов в слова\n","# заргузка словаря \"слово:индекс\"\n","word_to_id = imdb.get_word_index()\n","# уточнение словаря\n","word_to_id = {key:(value + index_from) for key,value in word_to_id.items()}\n","word_to_id[\"\"] = 0\n","word_to_id[\"\"] = 1\n","word_to_id[\"\"] = 2\n","word_to_id[\"\"] = 3\n","# создание обратного словаря \"индекс:слово\"\n","id_to_word = {value:key for key,value in word_to_id.items()}\n","\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zMtAST4d0VaM","executionInfo":{"status":"ok","timestamp":1765983530313,"user_tz":-180,"elapsed":2232,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"48cd3621-3c3d-41b0-8d77-c42c32e47c75"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json\n","\u001b[1m1641221/1641221\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 1us/step\n"]}]},{"cell_type":"code","source":["print(X_train[23])\n","print('len:',len(X_train[23]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KnfAYV9e0mym","executionInfo":{"status":"ok","timestamp":1765983620380,"user_tz":-180,"elapsed":39,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"165ae9e5-07c1-45f6-81ff-6a54f631277b"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["[1, 14, 20, 9, 290, 149, 48, 25, 358, 2, 120, 318, 302, 50, 26, 49, 221, 2057, 10, 10, 1212, 39, 15, 45, 801, 2, 2, 363, 2396, 7, 2, 209, 2327, 283, 8, 4, 425, 10, 10, 45, 24, 290, 3613, 972, 4, 65, 198, 40, 3462, 1224, 2, 23, 6, 4457, 225, 24, 76, 50, 8, 895, 19, 45, 164, 204, 5, 24, 55, 318, 38, 92, 140, 11, 18, 4, 65, 33, 32, 43, 168, 33, 4, 302, 10, 10, 17, 47, 77, 1046, 12, 188, 6, 117, 2, 33, 4, 130, 2, 4, 2, 7, 87, 3709, 2199, 7, 35, 2504, 5, 33, 211, 320, 2504, 132, 190, 48, 25, 2754, 4, 1273, 2, 45, 6, 1682, 8, 2, 42, 24, 8, 2, 10, 10, 32, 11, 32, 45, 6, 542, 3709, 22, 290, 319, 18, 15, 1288, 5, 15, 584]\n","len: 146\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eFf0XX2b0_Na","executionInfo":{"status":"ok","timestamp":1765983653187,"user_tz":-180,"elapsed":8,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"49af7bce-a738-4b08-a35a-667b0cd699f8"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":[" this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone\n","len: 763\n"]}]},{"cell_type":"code","source":["print('MAX Len: ',len(max(X_train, key=len)))\n","print('MIN Len: ',len(min(X_train, key=len)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yqXFOWGa1E0j","executionInfo":{"status":"ok","timestamp":1765983671908,"user_tz":-180,"elapsed":9,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"ab5edfa3-f814-4f1f-b09c-61d1027a655b"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 2494\n","MIN Len: 11\n"]}]},{"cell_type":"code","source":["# предобработка данных\n","from tensorflow.keras.utils import pad_sequences\n","max_words = 500\n","X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')\n","X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')"],"metadata":{"id":"o89GWgu51KkF","executionInfo":{"status":"ok","timestamp":1765983696841,"user_tz":-180,"elapsed":1297,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}}},"execution_count":11,"outputs":[]},{"cell_type":"code","source":["print('MAX Len: ',len(max(X_train, key=len)))\n","print('MIN Len: ',len(min(X_train, key=len)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"t-HAPdSq1MxI","executionInfo":{"status":"ok","timestamp":1765983703497,"user_tz":-180,"elapsed":2,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"57f5f920-e872-4d8b-ba8d-b01e60089253"},"execution_count":12,"outputs":[{"output_type":"stream","name":"stdout","text":["MAX Len: 500\n","MIN Len: 500\n"]}]},{"cell_type":"code","source":["print(X_train[23])\n","print('len:',len(X_train[23]))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pFijUmIL1N3o","executionInfo":{"status":"ok","timestamp":1765983717854,"user_tz":-180,"elapsed":15,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"7fde05fe-3d14-4946-b2c9-61495d2cc387"},"execution_count":13,"outputs":[{"output_type":"stream","name":"stdout","text":["[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"," 0 0 0 0 1 14 20 9 290 149 48 25 358 2\n"," 120 318 302 50 26 49 221 2057 10 10 1212 39 15 45\n"," 801 2 2 363 2396 7 2 209 2327 283 8 4 425 10\n"," 10 45 24 290 3613 972 4 65 198 40 3462 1224 2 23\n"," 6 4457 225 24 76 50 8 895 19 45 164 204 5 24\n"," 55 318 38 92 140 11 18 4 65 33 32 43 168 33\n"," 4 302 10 10 17 47 77 1046 12 188 6 117 2 33\n"," 4 130 2 4 2 7 87 3709 2199 7 35 2504 5 33\n"," 211 320 2504 132 190 48 25 2754 4 1273 2 45 6 1682\n"," 8 2 42 24 8 2 10 10 32 11 32 45 6 542\n"," 3709 22 290 319 18 15 1288 5 15 584]\n","len: 500\n"]}]},{"cell_type":"code","source":["review_as_text = ' '.join(id_to_word[id] for id in X_train[23])\n","print(review_as_text)\n","print('len:',len(review_as_text))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"SJ0r-p8l1Sv4","executionInfo":{"status":"ok","timestamp":1765983767943,"user_tz":-180,"elapsed":15,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"42d68b4c-dcdc-43cb-81a6-34a6570d9aaa"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":[" this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone\n","len: 2887\n"]}]},{"cell_type":"code","source":["# вывод данных\n","print('X train: \\n',X_train)\n","print('X train: \\n',X_test)\n","\n","# вывод размерностей\n","print('Shape of X train:', X_train.shape)\n","print('Shape of X test:', X_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hsbobKXb1dL0","executionInfo":{"status":"ok","timestamp":1765983790872,"user_tz":-180,"elapsed":19,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"9813b826-988d-46f1-aa98-9a82faa8fae4"},"execution_count":18,"outputs":[{"output_type":"stream","name":"stdout","text":["X train: \n"," [[ 0 0 0 ... 6 52 106]\n"," [ 0 0 0 ... 87 22 231]\n"," [ 0 0 0 ... 6 158 158]\n"," ...\n"," [ 0 0 0 ... 1005 4 1630]\n"," [ 0 0 0 ... 9 6 991]\n"," [ 0 0 0 ... 7 32 58]]\n","X train: \n"," [[ 0 0 0 ... 4 2 2]\n"," [ 0 0 0 ... 6 2 123]\n"," [ 0 0 0 ... 2 11 831]\n"," ...\n"," [ 1 14 402 ... 819 45 131]\n"," [ 0 0 0 ... 17 1540 2]\n"," [ 1 17 6 ... 1026 362 37]]\n","Shape of X train: (25000, 500)\n","Shape of X test: (25000, 500)\n"]}]},{"cell_type":"code","source":["embed_dim = 32\n","lstm_units = 64\n","\n","model = Sequential()\n","model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,)))\n","model.add(layers.LSTM(lstm_units))\n","model.add(layers.Dropout(0.5))\n","model.add(layers.Dense(1, activation='sigmoid'))\n","\n","model.summary()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":363},"id":"cgVZk2R81nLO","executionInfo":{"status":"ok","timestamp":1765983814420,"user_tz":-180,"elapsed":1762,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"95e38ad5-7969-415d-9fd3-ad36221ee7ce"},"execution_count":19,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n"," warnings.warn(\n","/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/embedding.py:100: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n"," super().__init__(**kwargs)\n"]},{"output_type":"display_data","data":{"text/plain":["\u001b[1mModel: \"sequential\"\u001b[0m\n"],"text/html":["
Model: \"sequential\"\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"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;34m500\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m160,000\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m24,832\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n"],"text/html":["
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃ Layer (type)                     Output Shape                  Param # ┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ embedding (Embedding)           │ (None, 500, 32)        │       160,000 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ lstm (LSTM)                     │ (None, 64)             │        24,832 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (Dropout)               │ (None, 64)             │             0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense (Dense)                   │ (None, 1)              │            65 │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Total params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n"],"text/html":["
 Total params: 184,897 (722.25 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m184,897\u001b[0m (722.25 KB)\n"],"text/html":["
 Trainable params: 184,897 (722.25 KB)\n","
\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"],"text/html":["
 Non-trainable params: 0 (0.00 B)\n","
\n"]},"metadata":{}}]},{"cell_type":"code","source":["# компилируем и обучаем модель\n","batch_size = 64\n","epochs = 3\n","model.compile(loss=\"binary_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n","model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"GTLaDqUc1qES","executionInfo":{"status":"ok","timestamp":1765983854527,"user_tz":-180,"elapsed":24070,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"524a1871-22c0-4d7b-bc92-3c35695e458a"},"execution_count":20,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch 1/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m11s\u001b[0m 22ms/step - accuracy: 0.6255 - loss: 0.6261 - val_accuracy: 0.8294 - val_loss: 0.3905\n","Epoch 2/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 21ms/step - accuracy: 0.8643 - loss: 0.3334 - val_accuracy: 0.8626 - val_loss: 0.3467\n","Epoch 3/3\n","\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 19ms/step - accuracy: 0.8877 - loss: 0.2905 - val_accuracy: 0.8722 - val_loss: 0.3317\n"]},{"output_type":"execute_result","data":{"text/plain":[""]},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["test_loss, test_acc = model.evaluate(X_test, y_test)\n","print(f\"\\nTest accuracy: {test_acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"x1suf0Ja1zHn","executionInfo":{"status":"ok","timestamp":1765983869364,"user_tz":-180,"elapsed":7401,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"a7802332-5719-4270-f626-1526a64531b9"},"execution_count":21,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 9ms/step - accuracy: 0.8640 - loss: 0.3313\n","\n","Test accuracy: 0.8622000217437744\n"]}]},{"cell_type":"code","source":["#значение метрики качества классификации на тестовых данных\n","print(f\"\\nTest accuracy: {test_acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"2v7LKydR2Bjs","executionInfo":{"status":"ok","timestamp":1765983940438,"user_tz":-180,"elapsed":48,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"8235b522-9545-4313-f5a1-59ef89873352"},"execution_count":22,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Test accuracy: 0.8622000217437744\n"]}]},{"cell_type":"code","source":["#отчет о качестве классификации тестовой выборки\n","y_score = model.predict(X_test)\n","y_pred = [1 if y_score[i,0]>=0.5 else 0 for i in range(len(y_score))]\n","\n","from sklearn.metrics import classification_report\n","print(classification_report(y_test, y_pred, labels = [0, 1], target_names=['Negative', 'Positive']))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"vvZxAYYg2Hr1","executionInfo":{"status":"ok","timestamp":1765983962172,"user_tz":-180,"elapsed":10700,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"0951f090-e463-4ea3-afd5-edc55e4b2bc8"},"execution_count":23,"outputs":[{"output_type":"stream","name":"stdout","text":["\u001b[1m782/782\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 12ms/step\n"," precision recall f1-score support\n","\n"," Negative 0.83 0.91 0.87 12500\n"," Positive 0.90 0.81 0.86 12500\n","\n"," accuracy 0.86 25000\n"," macro avg 0.87 0.86 0.86 25000\n","weighted avg 0.87 0.86 0.86 25000\n","\n"]}]},{"cell_type":"code","source":["#построение ROC-кривой и AUC ROC\n","from sklearn.metrics import roc_curve, auc\n","\n","fpr, tpr, thresholds = roc_curve(y_test, y_score)\n","plt.plot(fpr, tpr)\n","plt.grid()\n","plt.xlabel('False Positive Rate')\n","plt.ylabel('True Positive Rate')\n","plt.title('ROC')\n","plt.show()\n","print('AUC ROC:', auc(fpr, tpr))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":490},"id":"7IGX_vWY20SC","executionInfo":{"status":"ok","timestamp":1765984128331,"user_tz":-180,"elapsed":618,"user":{"displayName":"Чиёми Анзай","userId":"17549274460477558773"}},"outputId":"c6f239e9-1b43-4ac5-9f8b-22950df9bf9e"},"execution_count":24,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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r1749ddfba9v374dAwcOhJ+fH+Li4vDEE0+gvLz8srUpFApERUUhJiYGt9xyC5544gls3rwZlZWVkCQJzz//PFq2bAmdTofu3btjw4YNtm1NJhOSk5MRHR0NvV6Pa665BmlpaXb7rj0t1bp1awBAjx49oFAocNNNNwGwPxry7rvvIiYmxm4WbgC48847cf/999uef/311+jZsyf0ej3atGmDuXPnorq6+rKfU61WIyoqCrGxsUhMTMSoUaOQkZFhe91iseCBBx5A69at4efnhw4dOmDRokW215977jl8+OGH+Prrr21HgbZu3QoAOHHiBEaPHo3Q0FA0a9YMd955J44fP37Zeoh8BcMNkY9RKpX473//iz/++AMffvghvvvuOzzzzDOXXH/cuHFo2bIldu/ejT179mD69OnQaDQAgGPHjmH48OG4++678dtvv2H16tXYvn07kpOTHarJz88PkiShuroaixYtwuuvv47XXnsNv/32G5KSknDHHXfgzz//BAD897//xdq1a/Hpp58iKysLH3/8MeLj4+vd765duwAAmzdvRl5eHr744os664waNQrnzp3D999/b1tWVFSEDRs2YNy4cQCAbdu2YcKECZgyZQoOHjyId955B+np6XjppZca/BmPHz+OjRs3QqvV2pZJkoSWLVtizZo1OHjwIObMmYOZM2fi008/BQBMnToVo0ePxvDhw5GXl4e8vDz0798fZrMZSUlJCAoKwrZt27Bjxw4EBgZi+PDhMJlMDa6JyGu5fGpOInK7iRMnCpVKJQICAmx/7rnnnnrXXbNmjWjevLnt+QcffCBCQkJsz4OCgkR6enq92z7wwAPioYceslu2bds2oVQqRWVlZb3b/H3/R44cEe3btxe9e/cWQggRExMjXnrpJbttrr/+evHoo48KIYR4/PHHxZAhQ4QkSfXuH4D48ssvhRBC5OTkCABi3759duv8fUbzO++8U9x///225++8846IiYkRFotFCCHEzTffLObNm2e3jxUrVojo6Oh6axBCiNTUVKFUKkVAQIDQ6/W22ZMXLFhwyW2EEOKxxx4Td9999yVrrX3vDh062PXAaDQKPz8/sXHjxsvun8gXcMwNkZcaPHgw/ve//9meBwQEALAexUhLS8Phw4dhMBhQXV2NqqoqVFRUwN/fv85+UlJS8OCDD2LFihW2Uytt27YFYD1l9dtvv+Hjjz+2rS+EgCRJyMnJQadOneqtraSkBIGBgZAkCVVVVbjhhhuwdOlSGAwGnD59GgMGDLBbf8CAAdi/fz8A6ymloUOHokOHDhg+fDhuv/12DBs27Kp6NW7cOEyePBlvv/02dDodPv74Y/zrX/+CUqm0fc4dO3bYHamxWCyX7RsAdOjQAWvXrkVVVRU++ugjZGZm4vHHH7dbZ/HixVi2bBlyc3NRWVkJk8mE7t27X7be/fv34+jRowgKCrJbXlVVhWPHjjWiA0TeheGGyEsFBASgXbt2dsuOHz+O22+/HY888gheeuklNGvWDNu3b8cDDzwAk8lU75f0c889h7Fjx2LdunX49ttvkZqailWrVuGf//wnysrK8O9//xtPPPFEne1atWp1ydqCgoKwd+9eKJVKREdHw8/PDwBgMBiu+Ll69uyJnJwcfPvtt9i8eTNGjx6NxMREfPbZZ1fc9lJGjBgBIQTWrVuH66+/Htu2bcMbb7xhe72srAxz587FXXfdVWdbvV5/yf1qtVrb38HLL7+M2267DXPnzsULL7wAAFi1ahWmTp2K119/Hf369UNQUBDmz5+PX3755bL1lpWVoVevXnahslZTGTROJCeGGyIfsmfPHkiShNdff912VKJ2fMfltG/fHu3bt8eTTz6Je++9Fx988AH++c9/omfPnjh48GCdEHUlSqWy3m2Cg4MRExODHTt2YNCgQbblO3bsQJ8+fezWGzNmDMaMGYN77rkHw4cPR1FREZo1a2a3v9rxLRaL5bL16PV63HXXXfj4449x9OhRdOjQAT179rS93rNnT2RlZTn8Of9u1qxZGDJkCB555BHb5+zfvz8effRR2zp/P/Ki1Wrr1N+zZ0+sXr0aERERCA4OvqqaiLwRBxQT+ZB27drBbDbjzTffRHZ2NlasWIElS5Zccv3KykokJydj69at+Ouvv7Bjxw7s3r3bdrpp2rRp+Omnn5CcnIzMzEz8+eef+Prrrx0eUHyxp59+Gq+88gpWr16NrKwsTJ8+HZmZmZgyZQoAYMGCBfjkk09w+PBhHDlyBGvWrEFUVFS9Nx6MiIiAn58fNmzYgIKCApSUlFzyfceNG4d169Zh2bJltoHEtebMmYPly5dj7ty5+OOPP3Do0CGsWrUKs2bNcuiz9evXD127dsW8efMAANdeey1+/fVXbNy4EUeOHMHs2bOxe/duu23i4+Px22+/ISsrC4WFhTCbzRg3bhzCw8Nx5513Ytu2bcjJycHWrVvxxBNP4OTJkw7VROSV5B70Q0TOV98g1FoLFiwQ0dHRws/PTyQlJYnly5cLAOL8+fNCCPsBv0ajUfzrX/8ScXFxQqvVipiYGJGcnGw3WHjXrl1i6NChIjAwUAQEBIiuXbvWGRB8sb8PKP47i8UinnvuOREbGys0Go3o1q2b+Pbbb22vv/vuu6J79+4iICBABAcHi5tvvlns3bvX9jouGlAshBDvvfeeiIuLE0qlUgwaNOiS/bFYLCI6OloAEMeOHatT14YNG0T//v2Fn5+fCA4OFn369BHvvvvuJT9Hamqq6NatW53ln3zyidDpdCI3N1dUVVWJ++67T4SEhIjQ0FDxyCOPiOnTp9ttd+bMGVt/AYjvv/9eCCFEXl6emDBhgggPDxc6nU60adNGTJ48WZSUlFyyJiJfoRBCCHnjFREREZHz8LQUEREReRWGGyIiIvIqDDdERETkVRhuiIiIyKsw3BAREZFXYbghIiIir8JwQ0RERF6F4YaIiIi8CsMNEREReRWGGyIiIvIqDDdERETkVRhuiIiIyKv8fz1oc0+wRXZPAAAAAElFTkSuQmCC\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["AUC ROC: 0.9370553728000001\n"]}]}]} \ No newline at end of file diff --git a/labworks/LW4/report4.md b/labworks/LW4/report4.md new file mode 100644 index 0000000..95555bb --- /dev/null +++ b/labworks/LW4/report4.md @@ -0,0 +1,315 @@ +# Отчёт по лабораторной работе №4 + +### Киселёв Матвей, Мамедов Расул А-01-22 +### Вариант 6 + +### 1) В среде Google Colab создать новый блокнот (notebook). Настроить блокнот для работы с аппаратным ускорителем GPU. +```python +# импорт модулей +import os +os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4') + +from tensorflow import keras +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential +import matplotlib.pyplot as plt +import numpy as np +``` +```python +import tensorflow as tf +device_name = tf.test.gpu_device_name() +if device_name != '/device:GPU:0': + raise SystemError('GPU device not found') +print('Found GPU at: {}'.format(device_name)) +``` +``` +Found GPU at: /device:GPU:0 +``` + +### 2) Загрузить набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрать равным (4k – 1), где k – номер бригады. Вывести размеры полученных обучающих и тестовых массивов данных. + +```python +# загрузка датасета +from keras.datasets import imdb + +vocabulary_size = 5000 +index_from = 3 + +(X_train, y_train), (X_test, y_test) = imdb.load_data( + path="imdb.npz", + num_words=vocabulary_size, + skip_top=0, + maxlen=None, + seed=23, + start_char=1, + oov_char=2, + index_from=index_from + ) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of y train:', y_train.shape) +print('Shape of X test:', X_test.shape) +print('Shape of y test:', y_test.shape) +``` +``` +Shape of X train: (25000,) +Shape of y train: (25000,) +Shape of X test: (25000,) +Shape of y test: (25000,) +``` + +### 3) Вывести один отзыв из обучающего множества в виде списка индексов слов. Преобразовать список индексов в текст и вывести отзыв в виде текста. Вывести длину отзыва. Вывести метку класса данного отзыва и название класса (1 – Positive, 0 – Negative). + +```python +# создание словаря для перевода индексов в слова +# заргузка словаря "слово:индекс" +word_to_id = imdb.get_word_index() +# уточнение словаря +word_to_id = {key:(value + index_from) for key,value in word_to_id.items()} +word_to_id[""] = 0 +word_to_id[""] = 1 +word_to_id[""] = 2 +word_to_id[""] = 3 +# создание обратного словаря "индекс:слово" +id_to_word = {value:key for key,value in word_to_id.items()} +``` +```python +print(X_train[23]) +print('len:',len(X_train[23])) +``` +``` +[1, 14, 20, 9, 290, 149, 48, 25, 358, 2, 120, 318, 302, 50, 26, 49, 221, 2057, 10, 10, 1212, 39, 15, 45, 801, 2, 2, 363, 2396, 7, 2, 209, 2327, 283, 8, 4, 425, 10, 10, 45, 24, 290, 3613, 972, 4, 65, 198, 40, 3462, 1224, 2, 23, 6, 4457, 225, 24, 76, 50, 8, 895, 19, 45, 164, 204, 5, 24, 55, 318, 38, 92, 140, 11, 18, 4, 65, 33, 32, 43, 168, 33, 4, 302, 10, 10, 17, 47, 77, 1046, 12, 188, 6, 117, 2, 33, 4, 130, 2, 4, 2, 7, 87, 3709, 2199, 7, 35, 2504, 5, 33, 211, 320, 2504, 132, 190, 48, 25, 2754, 4, 1273, 2, 45, 6, 1682, 8, 2, 42, 24, 8, 2, 10, 10, 32, 11, 32, 45, 6, 542, 3709, 22, 290, 319, 18, 15, 1288, 5, 15, 584] +len: 146 +``` +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[23]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone +len: 763 +``` + + +### 4) Вывести максимальную и минимальную длину отзыва в обучающем множестве. + +```python +print('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` +``` +MAX Len: 2494 +MIN Len: 11 +``` + +### 5) Провести предобработку данных. Выбрать единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнить спецсимволами, а длинные обрезать до выбранной длины. + +```python +# предобработка данных +from tensorflow.keras.utils import pad_sequences +max_words = 500 +X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post') +X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post') +``` + +### 6) Повторить п. 4. + +```python +print('MAX Len: ',len(max(X_train, key=len))) +print('MIN Len: ',len(min(X_train, key=len))) +``` +``` +MAX Len: 500 +MIN Len: 500 +``` + +### 7) Повторить п. 3. Сделать вывод о том, как отзыв преобразовался после предобработки. +```python +print(X_train[23]) +print('len:',len(X_train[23])) +``` +``` +[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 1 14 20 9 290 149 48 25 358 2 + 120 318 302 50 26 49 221 2057 10 10 1212 39 15 45 + 801 2 2 363 2396 7 2 209 2327 283 8 4 425 10 + 10 45 24 290 3613 972 4 65 198 40 3462 1224 2 23 + 6 4457 225 24 76 50 8 895 19 45 164 204 5 24 + 55 318 38 92 140 11 18 4 65 33 32 43 168 33 + 4 302 10 10 17 47 77 1046 12 188 6 117 2 33 + 4 130 2 4 2 7 87 3709 2199 7 35 2504 5 33 + 211 320 2504 132 190 48 25 2754 4 1273 2 45 6 1682 + 8 2 42 24 8 2 10 10 32 11 32 45 6 542 + 3709 22 290 319 18 15 1288 5 15 584] +len: 500 +``` + +```python +review_as_text = ' '.join(id_to_word[id] for id in X_train[23]) +print(review_as_text) +print('len:',len(review_as_text)) +``` +``` + + + this movie is worth watching if you enjoy over special effects there are some interesting visuals br br aside from that it's typical hollywood fare of without substance true to the title br br it's not worth picking apart the story that's like performing brain on a dinosaur there's not much there to begin with it's nothing original and not very special so don't go in for the story at all just look at the effects br br as has been mentioned it got a little at the end the of great fx treatment of an invisible and at times half invisible man however if you ignore the standard it's a sight to or not to br br all in all it's a decent fx film worth seeing for that purpose and that alone +len: 2887 + +``` +### В начало отзыва добавились токены PAD в количестве, необходимом для достижения длины в 500 индексов. + +### 8) Вывести предобработанные массивы обучающих и тестовых данных и их размерности. + +```python +# вывод данных +print('X train: \n',X_train) +print('X train: \n',X_test) + +# вывод размерностей +print('Shape of X train:', X_train.shape) +print('Shape of X test:', X_test.shape) +``` +``` +X train: + [[ 0 0 0 ... 6 52 106] + [ 0 0 0 ... 87 22 231] + [ 0 0 0 ... 6 158 158] + ... + [ 0 0 0 ... 1005 4 1630] + [ 0 0 0 ... 9 6 991] + [ 0 0 0 ... 7 32 58]] +X train: + [[ 0 0 0 ... 4 2 2] + [ 0 0 0 ... 6 2 123] + [ 0 0 0 ... 2 11 831] + ... + [ 1 14 402 ... 819 45 131] + [ 0 0 0 ... 17 1540 2] + [ 1 17 6 ... 1026 362 37]] +Shape of X train: (25000, 500) +Shape of X test: (25000, 500) + +``` + +### 9) Реализовать модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Добиться качества обучения по метрике accuracy не менее 0.8. + +```python +embed_dim = 32 +lstm_units = 64 + +model = Sequential() +model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,))) +model.add(layers.LSTM(lstm_units)) +model.add(layers.Dropout(0.5)) +model.add(layers.Dense(1, activation='sigmoid')) + +model.summary() +``` +![picture](1.png) + +```python +# компиляция и обучение модели +batch_size = 64 +epochs = 3 +model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) +model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2) +``` +``` +Epoch 1/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 11s 22ms/step - accuracy: 0.6255 - loss: 0.6261 - val_accuracy: 0.8294 - val_loss: 0.3905 +Epoch 2/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 21ms/step - accuracy: 0.8643 - loss: 0.3334 - val_accuracy: 0.8626 - val_loss: 0.3467 +Epoch 3/3 +313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 19ms/step - accuracy: 0.8877 - loss: 0.2905 - val_accuracy: 0.8722 - val_loss: 0.3317 + + +``` +```python +test_loss, test_acc = model.evaluate(X_test, y_test) +print(f"\nTest accuracy: {test_acc}") +``` +``` +782/782 ━━━━━━━━━━━━━━━━━━━━ 7s 9ms/step - accuracy: 0.8640 - loss: 0.3313 + +Test accuracy: 0.8622000217437744 +``` + +### 10) Оценить качество обучения на тестовых данных: +### - вывести значение метрики качества классификации на тестовых данных, +### - вывести отчет о качестве классификации тестовой выборки. +### - построить ROC-кривую по результату обработки тестовой выборки и вычислить площадь под ROC-кривой (AUC ROC). + +```python +#значение метрики качества классификации на тестовых данных +print(f"\nTest accuracy: {test_acc}") +``` +``` +Test accuracy: 0.8622000217437744 +``` + +```python +#отчет о качестве классификации тестовой выборки +y_score = model.predict(X_test) +y_pred = [1 if y_score[i,0]>=0.5 else 0 for i in range(len(y_score))] + +from sklearn.metrics import classification_report +print(classification_report(y_test, y_pred, labels = [0, 1], target_names=['Negative', 'Positive'])) +``` +``` + precision recall f1-score support + + Negative 0.83 0.91 0.87 12500 + Positive 0.90 0.81 0.86 12500 + + accuracy 0.86 25000 + macro avg 0.87 0.86 0.86 25000 +weighted avg 0.87 0.86 0.86 25000 +``` + +```python +#построение ROC-кривой и AUC ROC +from sklearn.metrics import roc_curve, auc + +fpr, tpr, thresholds = roc_curve(y_test, y_score) +plt.plot(fpr, tpr) +plt.grid() +plt.xlabel('False Positive Rate') +plt.ylabel('True Positive Rate') +plt.title('ROC') +plt.show() +print('AUC ROC:', auc(fpr, tpr)) +``` +![picture](2.png) +``` +AUC ROC: 0.9370553728000001 +``` + +### 11) Сделать выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста. + +### Показатель accuracy превышает требуемый порог 0.8, а значение AUC ROC > 0.9 показывает высокую способность модели различать два класса. Таким образом, рекуррентная нейронная сеть хорошо справилась с задачей определения тональности текста. \ No newline at end of file