{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyOhMo5QOX+lJneEpOm4/VNU"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hdlWBrGZ-uPv","executionInfo":{"status":"ok","timestamp":1764527905786,"user_tz":-180,"elapsed":1262,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}},"outputId":"2656d17c-bc1d-46e2-e8c6-55b40f05f84f"},"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"]}],"source":["from google.colab import drive\n","drive.mount('/content/drive') # Смонтировать Диск\n","\n","import os\n","os.chdir('/content/drive/MyDrive/Colab Notebooks/IS_LR3') # Правильный путь"]},{"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","from sklearn.metrics import classification_report, confusion_matrix\n","from sklearn.metrics import ConfusionMatrixDisplay"],"metadata":{"id":"ltIGB7L-EKOR","executionInfo":{"status":"ok","timestamp":1764528023483,"user_tz":-180,"elapsed":13271,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}}},"execution_count":4,"outputs":[]},{"cell_type":"code","source":["from keras.datasets import mnist\n","(X_train, y_train), (X_test, y_test) = mnist.load_data()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"dRVHyMwfEZGi","executionInfo":{"status":"ok","timestamp":1764528071569,"user_tz":-180,"elapsed":617,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}},"outputId":"6d70f57b-ae07-4d85-ccc1-490cfc4cff16"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n","\u001b[1m11490434/11490434\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 0us/step\n"]}]},{"cell_type":"code","source":["# создание своего разбиения датасета\n","from sklearn.model_selection import train_test_split\n","\n","# объединяем в один набор\n","X = np.concatenate((X_train, X_test))\n","y = np.concatenate((y_train, y_test))\n","\n","# разбиваем по вариантам\n","X_train, X_test, y_train, y_test = train_test_split(X, y,\n"," test_size = 10000,\n"," train_size = 60000,\n"," random_state = 123)\n","\n","\n","# вывод размерностей\n","print('Shape of X train:', X_train.shape)\n","print('Shape of y train:', y_train.shape)\n","\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":"4pAAxPoaEod7","executionInfo":{"status":"ok","timestamp":1764528138853,"user_tz":-180,"elapsed":208,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}},"outputId":"4b88a19a-0803-4c26-e053-29a011bdca46"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["Shape of X train: (60000, 28, 28)\n","Shape of y train: (60000,)\n","Shape of X test: (10000, 28, 28)\n","Shape of y test: (10000,)\n"]}]},{"cell_type":"code","source":["# Зададим параметры данных и модели\n","num_classes = 10\n","input_shape = (28, 28, 1)\n","\n","# Приведение входных данных к диапазону [0, 1]\n","X_train = X_train / 255\n","X_test = X_test / 255\n","\n","# Расширяем размерность входных данных, чтобы каждое изображение имело\n","# размерность (высота, ширина, количество каналов)\n","X_train = np.expand_dims(X_train, -1)\n","X_test = np.expand_dims(X_test, -1)\n","print('Shape of transformed X train:', X_train.shape)\n","print('Shape of transformed X test:', X_test.shape)\n","\n","# переведем метки в one-hot\n","y_train = keras.utils.to_categorical(y_train, num_classes)\n","y_test = keras.utils.to_categorical(y_test, num_classes)\n","print('Shape of transformed y train:', y_train.shape)\n","print('Shape of transformed y test:', y_test.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pG3dlINQE-Wz","executionInfo":{"status":"ok","timestamp":1764528248939,"user_tz":-180,"elapsed":203,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}},"outputId":"fe9444af-a1ca-45b9-a9fb-3ba2d1a14c93"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stdout","text":["Shape of transformed X train: (60000, 28, 28, 1)\n","Shape of transformed X test: (10000, 28, 28, 1)\n","Shape of transformed y train: (60000, 10)\n","Shape of transformed y test: (10000, 10)\n"]}]},{"cell_type":"code","source":["# создаем модель\n","model = Sequential()\n","model.add(layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\", input_shape=input_shape))\n","model.add(layers.MaxPooling2D(pool_size=(2, 2)))\n","model.add(layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"))\n","model.add(layers.MaxPooling2D(pool_size=(2, 2)))\n","model.add(layers.Dropout(0.5))\n","model.add(layers.Flatten())\n","model.add(layers.Dense(num_classes, activation=\"softmax\"))\n","\n","model.summary()\n","# компилируем и обучаем модель\n","batch_size = 512\n","epochs = 15\n","model.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n","model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":958},"id":"IA24rYjpFjq_","executionInfo":{"status":"ok","timestamp":1764529276625,"user_tz":-180,"elapsed":886846,"user":{"displayName":"Денис Шестов","userId":"16636308897033390735"}},"outputId":"d4931509-5577-4885-c587-42606ece7464"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/keras/src/layers/convolutional/base_conv.py:113: 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__(activity_regularizer=activity_regularizer, **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","│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m320\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m13\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m11\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m18,496\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m5\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1600\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;34m10\u001b[0m) │ \u001b[38;5;34m16,010\u001b[0m │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n"],"text/html":["┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n","┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n","┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n","│ conv2d (Conv2D) │ (None, 26, 26, 32) │ 320 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ max_pooling2d (MaxPooling2D) │ (None, 13, 13, 32) │ 0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ conv2d_1 (Conv2D) │ (None, 11, 11, 64) │ 18,496 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ max_pooling2d_1 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dropout (Dropout) │ (None, 5, 5, 64) │ 0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ flatten (Flatten) │ (None, 1600) │ 0 │\n","├─────────────────────────────────┼────────────────────────┼───────────────┤\n","│ dense (Dense) │ (None, 10) │ 16,010 │\n","└─────────────────────────────────┴────────────────────────┴───────────────┘\n","\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Total params: \u001b[0m\u001b[38;5;34m34,826\u001b[0m (136.04 KB)\n"],"text/html":["
Total params: 34,826 (136.04 KB)\n","\n"]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m34,826\u001b[0m (136.04 KB)\n"],"text/html":["
Trainable params: 34,826 (136.04 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":{}},{"output_type":"stream","name":"stdout","text":["Epoch 1/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m47s\u001b[0m 427ms/step - accuracy: 0.1470 - loss: 2.2933 - val_accuracy: 0.6295 - val_loss: 2.0603\n","Epoch 2/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m44s\u001b[0m 418ms/step - accuracy: 0.6329 - loss: 1.6934 - val_accuracy: 0.7963 - val_loss: 0.7763\n","Epoch 3/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m81s\u001b[0m 409ms/step - accuracy: 0.7699 - loss: 0.7786 - val_accuracy: 0.8455 - val_loss: 0.5514\n","Epoch 4/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 411ms/step - accuracy: 0.8124 - loss: 0.6159 - val_accuracy: 0.8683 - val_loss: 0.4603\n","Epoch 5/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 409ms/step - accuracy: 0.8372 - loss: 0.5313 - val_accuracy: 0.8857 - val_loss: 0.4070\n","Epoch 6/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m45s\u001b[0m 420ms/step - accuracy: 0.8568 - loss: 0.4730 - val_accuracy: 0.8968 - val_loss: 0.3593\n","Epoch 7/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m81s\u001b[0m 413ms/step - accuracy: 0.8738 - loss: 0.4254 - val_accuracy: 0.9078 - val_loss: 0.3253\n","Epoch 8/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m44s\u001b[0m 417ms/step - accuracy: 0.8831 - loss: 0.3899 - val_accuracy: 0.9178 - val_loss: 0.2952\n","Epoch 9/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m44s\u001b[0m 410ms/step - accuracy: 0.8929 - loss: 0.3607 - val_accuracy: 0.9250 - val_loss: 0.2665\n","Epoch 10/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m82s\u001b[0m 414ms/step - accuracy: 0.9030 - loss: 0.3290 - val_accuracy: 0.9317 - val_loss: 0.2452\n","Epoch 11/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 409ms/step - accuracy: 0.9082 - loss: 0.3079 - val_accuracy: 0.9367 - val_loss: 0.2267\n","Epoch 12/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m45s\u001b[0m 424ms/step - accuracy: 0.9152 - loss: 0.2844 - val_accuracy: 0.9405 - val_loss: 0.2093\n","Epoch 13/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m79s\u001b[0m 392ms/step - accuracy: 0.9207 - loss: 0.2666 - val_accuracy: 0.9462 - val_loss: 0.1969\n","Epoch 14/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 406ms/step - accuracy: 0.9227 - loss: 0.2617 - val_accuracy: 0.9482 - val_loss: 0.1836\n","Epoch 15/15\n","\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m83s\u001b[0m 416ms/step - accuracy: 0.9276 - loss: 0.2425 - val_accuracy: 0.9503 - val_loss: 0.1760\n"]},{"output_type":"execute_result","data":{"text/plain":["