diff --git a/labworks/LW3/report.md b/labworks/LW3/report.md index d48005a..42cba03 100644 --- a/labworks/LW3/report.md +++ b/labworks/LW3/report.md @@ -103,37 +103,57 @@ model.add(layers.Flatten()) model.add(layers.Dense(num_classes, activation="softmax")) model.summary() -``` + **Model: "sequential"** + | Layer (type) | Output Shape | Param # | + |--------------------------------|---------------------|--------:| + | conv2d (Conv2D) | (None, 26, 26, 32) | 320 | + | max_pooling2d_8 (MaxPooling2D) | (None, 13, 13, 32) | 0 | + | conv2d_1 (Conv2D) | (None, 11, 11, 64) | 18,496 | + | max_pooling2d_9 (MaxPooling2D) | (None, 5, 5, 64) | 0 | + | dropout (Dropout) | (None, 5, 5, 64) | 0 | + | flatten (Flatten) | (None, 1600) | 0 | + | dense (Dense) | (None, 10) | 16,010 | + **Total params:** 34,826 (136.04 KB) + **Trainable params:** 34,826 (136.04 KB) + **Non-trainable params:** 0 (0.00 B) + ```python batch_size = 512 epochs = 15 model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) ``` -``` + Epoch 1/15 + 106/106 ━━━━━━━━━━━━━━━━━━━━ 6s 34ms/step - accuracy: 0.5991 - loss: 1.2739 - val_accuracy: 0.9427 - val_loss: 0.1933 + Epoch 2/15 + 106/106 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - accuracy: 0.9363 - loss: 0.2175 - val_accuracy: 0.9645 - val_loss: 0.1128 + ... + Epoch 15/15 + 106/106 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - accuracy: 0.9851 - loss: 0.0460 - val_accuracy: 0.9895 - val_loss: 0.0350 + -``` + ### 6) Оценили качество обучения на тестовых данных. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. ```python @@ -141,11 +161,14 @@ scores = model.evaluate(X_test, y_test) print('Loss on test data:', scores[0]) print('Accuracy on test data:', scores[1]) ``` -``` + 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9867 - loss: 0.0411 + Loss on test data: 0.04398002102971077 + Accuracy on test data: 0.9865000247955322 -``` + + ### 7) Подали на вход обученной модели два тестовых изображения. Вывели изображения, истинные метки и результаты распознавания. @@ -160,24 +183,29 @@ for n in [3,26]: print('Real mark: ', np.argmax(y_test[n])) print('NN answer: ', np.argmax(result)) ``` -``` + 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 332ms/step + NN output: [[1.9338373e-09 8.8185527e-12 4.5429974e-08 2.5885814e-04 1.7587592e-08 9.9952632e-01 1.1317411e-08 1.5951617e-08 1.6658140e-08 2.1473359e-04]] -``` + ![picture](7.png) -``` + Real mark: 5 + NN answer: 5 + 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step + NN output: [[2.6663812e-04 5.6896381e-09 3.4766167e-04 2.4042051e-09 2.7227568e-04 6.0989500e-08 9.9911338e-01 2.0191379e-08 4.6584045e-08 1.9427532e-08]] -``` + ![picture](7_1.png) -``` + Real mark: 6 + NN answer: 6 -``` + ### 8) Вывели отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки. @@ -196,25 +224,40 @@ display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix) display.plot() plt.show() ``` -``` + 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step + precision recall f1-score support + 0 0.99 0.99 0.99 1009 + 1 0.99 1.00 1.00 1147 + 2 0.98 0.98 0.98 969 + 3 0.98 0.99 0.99 1025 + 4 0.99 0.98 0.99 939 + 5 0.98 0.98 0.98 881 + 6 0.99 0.99 0.99 1037 + 7 0.98 0.99 0.98 1001 + 8 0.99 0.98 0.98 950 + 9 0.99 0.98 0.98 1042 + accuracy 0.99 10000 + macro avg 0.99 0.99 0.99 10000 + weighted avg 0.99 0.99 0.99 10000 -``` + + ![picture](8.png) ### 9) Загрузили, предобработали и подали на вход обученной нейронной сети собственное изображение, созданное при выполнении лабораторной работы №1. Вывели изображение и результат распознавания. @@ -241,13 +284,13 @@ for name_image in ['цифра 3.png', 'цифра 6.png']: print('I think it\'s', np.argmax(result)) ``` ![picture](9.png) -``` + I think it's 2 -``` + ![picture](9_2.png) -``` + I think it's 5 -``` + ### 10) Загрузили с диска модель, сохраненную при выполнении лабораторной работы №1. Вывели информацию об архитектуре модели. Повторили для этой модели п. 6. @@ -257,13 +300,21 @@ model_lr1 = keras.models.load_model("model_1h100_2h50.keras") model_lr1.summary() ``` **Model: "sequential_10"** + | Layer (type) | Output Shape | Param # | + |------------------|-------------:|--------:| + | dense_1 (Dense) | (None, 100) | 78,500 | + | dense_2 (Dense) | (None, 10) | 1,010 | + **Total params:** 79,512 (310.60 KB) -**Trainable params:** 79,510 (310.59 KB) + +**Trainable params:** 79,510 (310.59 KB) + **Non-trainable params:** 0 (0.00 B) + **Optimizer params:** 2 (12.00 B) @@ -285,12 +336,15 @@ y_test = keras.utils.to_categorical(y_test, num_classes) print('Shape of transformed y train:', y_train.shape) print('Shape of transformed y test:', y_test.shape) ``` -``` + Shape of transformed X train: (60000, 784) + Shape of transformed X train: (10000, 784) + Shape of transformed y train: (60000, 10) + Shape of transformed y test: (10000, 10) -``` + ```python # Оценка качества работы модели на тестовых данных @@ -298,11 +352,13 @@ scores = model_lr1.evaluate(X_test, y_test) print('Loss on test data:', scores[0]) print('Accuracy on test data:', scores[1]) ``` -``` + 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9452 - loss: 0.1976 + Loss on test data: 0.19490210711956024 + Accuracy on test data: 0.944599986076355 -``` + ### 11) Сравнили обученную модель сверточной сети и наилучшую модель полносвязной сети из лабораторной работы №1 по следующим показателям: ### - количество настраиваемых параметров в сети @@ -310,24 +366,19 @@ Accuracy on test data: 0.944599986076355 ### - качество классификации тестовой выборки. ### Сделали выводы по результатам применения сверточной нейронной сети для распознавания изображений. -Таблица1: - | Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки | + |----------|-------------------------------------|---------------------------|-----------------------------------------| + | Сверточная | 34 826 | 15 | accuracy:0.986 ; loss:0.044 | + | Полносвязная | 84 062 | 50 | accuracy:0.944 ; loss:0.195 | -##### По результатам применения сверточной НС, а также по результатам таблицы 1 делаем выводы, что сверточная НС намного лучше справляется с задачами распознования изображений, чем полносвязная - имеет меньше настраиваемых параметров, быстрее обучается, имеет лучшие показатели качества. +##### Вывод:Сравнительный анализ показывает явное преимущество свёрточной нейронной сети перед полносвязной в задачах распознавания изображений: при вдвое меньшем количестве параметров (34 826 против 79 512) и трёхкратном сокращении числа эпох обучения (15 против 50) CNN достигает более высокой точности (98,65% против 94,46%) и значительно меньшей ошибки (0,044 против 0,195). ## Задание 2 -### В новом блокноте выполнили п. 2–8 задания 1, изменив набор данных MNIST на CIFAR-10, содержащий размеченные цветные изображения объектов, разделенные на 10 классов. -### При этом: -### - в п. 3 разбиение данных на обучающие и тестовые произвели в соотношении 50 000:10 000 -### - после разбиения данных (между п. 3 и 4) вывели 25 изображений из обучающей выборки с подписями классов -### - в п. 7 одно из тестовых изображений должно распознаваться корректно, а другое – ошибочно. - ### 1) Загрузили набор данных CIFAR-10, содержащий цветные изображения размеченные на 10 классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль, грузовик. ```python @@ -357,12 +408,15 @@ 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: (50000, 32, 32, 3) + Shape of y train: (50000, 1) + Shape of X test: (10000, 32, 32, 3) + Shape of y test: (10000, 1) -``` + ### Вывели 25 изображений из обучающей выборки с подписью классов. @@ -402,12 +456,15 @@ y_test = keras.utils.to_categorical(y_test, num_classes) print('Shape of transformed y train:', y_train.shape) print('Shape of transformed y test:', y_test.shape) ``` -``` + Shape of transformed X train: (50000, 32, 32, 3) + Shape of transformed X test: (10000, 32, 32, 3) + Shape of transformed y train: (50000, 10) + Shape of transformed y test: (10000, 10) -``` + ### 4) Реализовали модель сверточной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. @@ -449,32 +506,59 @@ model.add(layers.Dense(num_classes, activation="softmax")) model.summary() ``` **Model: "sequential_9"** + | Layer (type) | Output Shape | Param # | + |--------------------------------------------|-------------------|---------:| + | conv2d_16 (Conv2D) | (None, 32, 32, 32) | 896 | + | batch_normalization_12 (BatchNormalization) | (None, 32, 32, 32) | 128 | + | conv2d_17 (Conv2D) | (None, 32, 32, 32) | 9,248 | + | batch_normalization_13 (BatchNormalization) | (None, 32, 32, 32) | 128 | + | max_pooling2d_10 (MaxPooling2D) | (None, 16, 16, 32) | 0 | + | dropout_10 (Dropout) | (None, 16, 16, 32) | 0 | + | conv2d_18 (Conv2D) | (None, 16, 16, 64) | 18,496 | + | batch_normalization_14 (BatchNormalization) | (None, 16, 16, 64) | 256 | + | conv2d_19 (Conv2D) | (None, 16, 16, 64) | 36,928 | + | batch_normalization_15 (BatchNormalization) | (None, 16, 16, 64) | 256 | + | max_pooling2d_11 (MaxPooling2D) | (None, 8, 8, 64) | 0 | + | dropout_11 (Dropout) | (None, 8, 8, 64) | 0 | + | conv2d_20 (Conv2D) | (None, 8, 8, 128) | 73,856 | + | batch_normalization_16 (BatchNormalization)| (None, 8, 8, 128) | 512 | + | conv2d_21 (Conv2D) | (None, 8, 8, 128) | 147,584 | + | batch_normalization_17 (BatchNormalization)| (None, 8, 8, 128) | 512 | + | max_pooling2d_12 (MaxPooling2D) | (None, 4, 4, 128) | 0 | + | dropout_12 (Dropout) | (None, 4, 4, 128) | 0 | + | flatten_4 (Flatten) | (None, 2048) | 0 | + | dense_6 (Dense) | (None, 128) | 262,272 | + | dropout_13 (Dropout) | (None, 128) | 0 | + | dense_7 (Dense) | (None, 10) | 1,290 | + **Total params:** 552,362 (2.11 MB) + **Trainable params:** 551,466 (2.10 MB) + **Non-trainable params:** 896 (3.50 KB) ```python @@ -484,16 +568,24 @@ epochs = 50 model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) ``` -``` + Epoch 1/50 + 704/704 ━━━━━━━━━━━━━━━━━━━━ 25s 21ms/step - accuracy: 0.2474 - loss: 2.1347 - val_accuracy: 0.5014 - val_loss: 1.3804 + Epoch 2/50 + 704/704 ━━━━━━━━━━━━━━━━━━━━ 7s 10ms/step - accuracy: 0.4517 - loss: 1.4843 - val_accuracy: 0.5648 - val_loss: 1.2039 + ... + Epoch 50/50 + 704/704 ━━━━━━━━━━━━━━━━━━━━ 9s 13ms/step - accuracy: 0.9183 - loss: 0.2363 - val_accuracy: 0.8370 - val_loss: 0.5748 + -``` + + ### 5) Оценили качество обучения на тестовых данных. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. @@ -503,11 +595,13 @@ scores = model.evaluate(X_test, y_test) print('Loss on test data:', scores[0]) print('Accuracy on test data:', scores[1]) ``` -``` + 313/313 ━━━━━━━━━━━━━━━━━━━━ 3s 5ms/step - accuracy: 0.8535 - loss: 0.5236 + Loss on test data: 0.5263504981994629 + Accuracy on test data: 0.8525000214576721 -``` + ### 6) Подали на вход обученной модели два тестовых изображения. Вывели изображения, истинные метки и результаты распознавания. @@ -523,24 +617,30 @@ for n in [3,15]: print('Real mark: ', np.argmax(y_test[n])) print('NN answer: ', np.argmax(result)) ``` -``` + 1/1 ━━━━━━━━━━━━━━━━━━━━ 1s 662ms/step + NN output: [[3.9128518e-13 3.7927967e-14 9.7535979e-10 9.2453198e-11 2.2669273e-13 4.2581650e-13 1.0000000e+00 2.1332333e-19 5.8570602e-13 1.1833489e-11]] -``` + + ![picture](2_6.png) -``` + Real mark: 6 + NN answer: 6 + 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step + NN output: [[9.5250229e-08 5.8261224e-10 2.7865291e-05 2.9105169e-03 9.8321760e-01 1.3797697e-02 2.7701269e-06 4.3220436e-05 2.0006892e-08 1.8016836e-07]] -``` + ![picture](2_7.png) -``` + Real mark: 4 + NN answer: 4 -``` + ### 7) Вывели отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки. @@ -561,25 +661,40 @@ disp.plot(ax=ax, xticks_rotation=45) # поворот подписей по X plt.tight_layout() # чтобы всё влезло plt.show() ``` -``` + 313/313 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step + precision recall f1-score support + airplane 0.90 0.84 0.87 1007 + automobile 0.92 0.93 0.93 1037 + bird 0.86 0.78 0.82 1030 + cat 0.68 0.72 0.70 990 + deer 0.84 0.83 0.83 966 + dog 0.77 0.79 0.78 1009 + frog 0.78 0.94 0.86 972 + horse 0.95 0.84 0.89 991 + ship 0.94 0.93 0.94 990 + truck 0.91 0.92 0.92 1008 + accuracy 0.85 10000 + macro avg 0.86 0.85 0.85 10000 + weighted avg 0.86 0.85 0.85 10000 -``` + + ![picture](2_8.png) #### Сводная точность модели на тестовой выборке CIFAR-10 составила 85%, что свидетельствует о её эффективности в решении задачи классификации цветных изображений. \ No newline at end of file