ответвлено от main/is_dnn
Изменил(а) на '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
|
||||
|
||||
<keras.src.callbacks.history.History at 0x78575e329e50>
|
||||
```
|
||||
|
||||
### 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]]
|
||||
```
|
||||
|
||||

|
||||
```
|
||||
|
||||
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]]
|
||||
```
|
||||
|
||||

|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
|
||||

|
||||
|
||||
### 9) Загрузили, предобработали и подали на вход обученной нейронной сети собственное изображение, созданное при выполнении лабораторной работы №1. Вывели изображение и результат распознавания.
|
||||
@@ -241,13 +284,13 @@ for name_image in ['цифра 3.png', 'цифра 6.png']:
|
||||
print('I think it\'s', np.argmax(result))
|
||||
```
|
||||

|
||||
```
|
||||
|
||||
I think it's 2
|
||||
```
|
||||
|
||||

|
||||
```
|
||||
|
||||
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
|
||||
|
||||
<keras.src.callbacks.history.History at 0x78575551f7a0>
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 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]]
|
||||
```
|
||||
|
||||
|
||||

|
||||
```
|
||||
|
||||
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]]
|
||||
```
|
||||
|
||||

|
||||
```
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
|
||||

|
||||
|
||||
#### Сводная точность модели на тестовой выборке CIFAR-10 составила 85%, что свидетельствует о её эффективности в решении задачи классификации цветных изображений.
|
||||
Ссылка в новой задаче
Block a user