diff --git a/labworks/LW3/notebook.ipynb b/labworks/LW3/notebook.ipynb new file mode 100644 index 0000000..504e7bc --- /dev/null +++ b/labworks/LW3/notebook.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"gpuType":"T4"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"accelerator":"GPU"},"cells":[{"cell_type":"code","source":["# импорт модулей\n","import os\n","os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')\n","\n","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":"mr9IszuQ1ANG"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# загрузка датасета\n","from keras.datasets import mnist\n","(X_train, y_train), (X_test, y_test) = mnist.load_data()"],"metadata":{"id":"Ixw5Sp0_1A-w"},"execution_count":null,"outputs":[]},{"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 = 3)\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":{"id":"BrSjcpEe1BeV"},"execution_count":null,"outputs":[]},{"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","\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":{"id":"xJH87ISq1B9h"},"execution_count":null,"outputs":[]},{"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()"],"metadata":{"id":"Un561zSH1Cmv"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# компилируем и обучаем модель\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)"],"metadata":{"id":"q_h8PxkN9m0v"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Оценка качества работы модели на тестовых данных\n","scores = model.evaluate(X_test, y_test)\n","print('Loss on test data:', scores[0])\n","print('Accuracy on test data:', scores[1])"],"metadata":{"id":"81Cgq8dn9uL6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# вывод двух тестовых изображений и результатов распознавания\n","\n","for n in [3,26]:\n"," result = model.predict(X_test[n:n+1])\n"," print('NN output:', result)\n","\n"," plt.imshow(X_test[n].reshape(28,28), cmap=plt.get_cmap('gray'))\n"," plt.show()\n"," print('Real mark: ', np.argmax(y_test[n]))\n"," print('NN answer: ', np.argmax(result))"],"metadata":{"id":"dbfkWjDI1Dp7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# истинные метки классов\n","true_labels = np.argmax(y_test, axis=1)\n","# предсказанные метки классов\n","predicted_labels = np.argmax(model.predict(X_test), axis=1)\n","\n","# отчет о качестве классификации\n","print(classification_report(true_labels, predicted_labels))\n","# вычисление матрицы ошибок\n","conf_matrix = confusion_matrix(true_labels, predicted_labels)\n","# отрисовка матрицы ошибок в виде \"тепловой карты\"\n","display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix)\n","display.plot()\n","plt.show()"],"metadata":{"id":"7MqcG_wl1EHI"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# загрузка собственного изображения\n","from PIL import Image\n","\n","for name_image in ['2.png', '5.png']:\n"," file_data = Image.open(name_image)\n"," file_data = file_data.convert('L') # перевод в градации серого\n"," test_img = np.array(file_data)\n","\n"," # вывод собственного изображения\n"," plt.imshow(test_img, cmap=plt.get_cmap('gray'))\n"," plt.show()\n","\n"," # предобработка\n"," test_img = test_img / 255\n"," test_img = np.reshape(test_img, (1,28,28,1))\n","\n"," # распознавание\n"," result = model.predict(test_img)\n"," print('I think it\\'s', np.argmax(result))"],"metadata":{"id":"ktWEeqWd1EyF"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["model_lr1 = keras.models.load_model(\"/content/drive/MyDrive/Colab Notebooks/best_model.keras\")\n","\n","model_lr1.summary()"],"metadata":{"id":"DblXqn3l1FL2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# развернем каждое изображение 28*28 в вектор 784\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 = 3)\n","num_pixels = X_train.shape[1] * X_train.shape[2]\n","X_train = X_train.reshape(X_train.shape[0], num_pixels) / 255\n","X_test = X_test.reshape(X_test.shape[0], num_pixels) / 255\n","print('Shape of transformed X train:', X_train.shape)\n","print('Shape of transformed X train:', 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":{"id":"0ki8fhJrEyEt"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Оценка качества работы модели на тестовых данных\n","scores = model_lr1.evaluate(X_test, y_test)\n","print('Loss on test data:', scores[0])\n","print('Accuracy on test data:', scores[1])"],"metadata":{"id":"0Yj0fzLNE12k"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# загрузка датасета\n","from keras.datasets import cifar10\n","\n","(X_train, y_train), (X_test, y_test) = cifar10.load_data()"],"metadata":{"id":"y0qK7eKL4Tjy"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# создание своего разбиения датасета\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 = 50000,\n"," random_state = 3)\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":{"id":"DlnFbQogKD2v"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n"," 'dog', 'frog', 'horse', 'ship', 'truck']\n","\n","plt.figure(figsize=(10,10))\n","for i in range(25):\n"," plt.subplot(5,5,i+1)\n"," plt.xticks([])\n"," plt.yticks([])\n"," plt.grid(False)\n"," plt.imshow(X_train[i])\n"," plt.xlabel(class_names[y_train[i][0]])\n","plt.show()"],"metadata":{"id":"TW8D67KEKhVE"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Зададим параметры данных и модели\n","num_classes = 10\n","input_shape = (32, 32, 3)\n","\n","# Приведение входных данных к диапазону [0, 1]\n","X_train = X_train / 255\n","X_test = X_test / 255\n","\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":{"id":"iFDpxEauLZ8j"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# создаем модель\n","model = Sequential()\n","\n","# Блок 1\n","model.add(layers.Conv2D(32, (3, 3), padding=\"same\",\n"," activation=\"relu\", input_shape=input_shape))\n","model.add(layers.BatchNormalization())\n","model.add(layers.Conv2D(32, (3, 3), padding=\"same\", activation=\"relu\"))\n","model.add(layers.BatchNormalization())\n","model.add(layers.MaxPooling2D((2, 2)))\n","model.add(layers.Dropout(0.25))\n","\n","# Блок 2\n","model.add(layers.Conv2D(64, (3, 3), padding=\"same\", activation=\"relu\"))\n","model.add(layers.BatchNormalization())\n","model.add(layers.Conv2D(64, (3, 3), padding=\"same\", activation=\"relu\"))\n","model.add(layers.BatchNormalization())\n","model.add(layers.MaxPooling2D((2, 2)))\n","model.add(layers.Dropout(0.25))\n","\n","# Блок 3\n","model.add(layers.Conv2D(128, (3, 3), padding=\"same\", activation=\"relu\"))\n","model.add(layers.BatchNormalization())\n","model.add(layers.Conv2D(128, (3, 3), padding=\"same\", activation=\"relu\"))\n","model.add(layers.BatchNormalization())\n","model.add(layers.MaxPooling2D((2, 2)))\n","model.add(layers.Dropout(0.4))\n","\n","model.add(layers.Flatten())\n","model.add(layers.Dense(128, activation='relu'))\n","model.add(layers.Dropout(0.5))\n","model.add(layers.Dense(num_classes, activation=\"softmax\"))\n","\n","\n","model.summary()"],"metadata":{"id":"YhAD5CllLlv7"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# компилируем и обучаем модель\n","batch_size = 64\n","epochs = 50\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)"],"metadata":{"id":"3otvqMjjOdq5"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Оценка качества работы модели на тестовых данных\n","scores = model.evaluate(X_test, y_test)\n","print('Loss on test data:', scores[0])\n","print('Accuracy on test data:', scores[1])"],"metadata":{"id":"SaDxydiyLmRX"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# вывод двух тестовых изображений и результатов распознавания\n","\n","for n in [3,26]:\n"," result = model.predict(X_test[n:n+1])\n"," print('NN output:', result)\n","\n"," plt.imshow(X_test[n].reshape(32,32,3), cmap=plt.get_cmap('gray'))\n"," plt.show()\n"," print('Real mark: ', np.argmax(y_test[n]))\n"," print('NN answer: ', np.argmax(result))"],"metadata":{"id":"t3yGj1MlLm9H"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# истинные метки классов\n","true_labels = np.argmax(y_test, axis=1)\n","# предсказанные метки классов\n","predicted_labels = np.argmax(model.predict(X_test), axis=1)\n","\n","# отчет о качестве классификации\n","print(classification_report(true_labels, predicted_labels, target_names=class_names))\n","# вычисление матрицы ошибок\n","conf_matrix = confusion_matrix(true_labels, predicted_labels)\n","# отрисовка матрицы ошибок в виде \"тепловой карты\"\n","fig, ax = plt.subplots(figsize=(6, 6))\n","disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix,display_labels=class_names)\n","disp.plot(ax=ax, xticks_rotation=45) # поворот подписей по X и приятная палитра\n","plt.tight_layout() # чтобы всё влезло\n","plt.show()"],"metadata":{"id":"od56oyyzM0nw"},"execution_count":null,"outputs":[]}]} \ No newline at end of file