From ef85b5cf8f9d02ffd874fe9db3b2f3590c20c301 Mon Sep 17 00:00:00 2001 From: VatkovAS Date: Mon, 8 Dec 2025 21:39:11 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'labworks/LW3/report.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labworks/LW3/report.md | 235 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 233 insertions(+), 2 deletions(-) diff --git a/labworks/LW3/report.md b/labworks/LW3/report.md index 9b43603..1cde313 100644 --- a/labworks/LW3/report.md +++ b/labworks/LW3/report.md @@ -149,7 +149,7 @@ print('Accuracy on test data:', scores[1]) **Результат выполнения:** ``` -313/313 ━━━━━━━━━━━━━━━━━━━━ 3s 7ms/step - accuracy: 0.9869 - loss: 0.0416 +accuracy: 0.9869 - loss: 0.0416 Loss on test data: 0.03736430034041405 Accuracy on test data: 0.987500011920929 ``` @@ -272,7 +272,7 @@ print('Accuracy on test data:', scores[1]) **Результат выполнения:** ``` -313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9163 - loss: 0.2937 +accuracy: 0.9163 - loss: 0.2937 Loss on test data: 0.2963277995586395 Accuracy on test data: 0.914900004863739 ``` @@ -294,6 +294,237 @@ Accuracy on test data: 0.914900004863739 ## Задание 2 +### В новом блокноте выполнили п. 2–8 задания 1, изменив набор данных MNIST на CIFAR-10, содержащий размеченные цветные изображения объектов, разделенные на 10 классов. + +### При этом: +* в п.3 разбиение данных на обучающие и тестовые произвести в соотношении 50000:10000 +* после разбиения данных(между п. 3 и 4)вывести 25 изображений из обучающей выборки с подписями классов +* в п.7 одно из тестовых изображений должно распознаваться корректно, а другое – ошибочно. + +### 1) Загрузили набор данных CIFAR-10, содержащий цветные изображения размеченные на 10 классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль, грузовик. + +```python +# загрузка датасета +from keras.datasets import cifar10 + +(X_train, y_train), (X_test, y_test) = cifar10.load_data() +``` + +### 2) Разбили набор данных на обучающие и тестовые данные в соотношении 50 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=7, где k=2 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных. + +```python +# создание своего разбиения датасета +from sklearn.model_selection import train_test_split +# объединяем в один набор +X = np.concatenate((X_train, X_test)) +y = np.concatenate((y_train, y_test)) + +# разбиваем по вариантам +X_train, X_test, y_train, y_test = train_test_split( + X, y,test_size = 10000,train_size = 50000,random_state = 7 + ) +# вывод размерностей +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: (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 изображений из обучающей выборки с подписью классов. + +```python +class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer','dog', 'frog', 'horse', 'ship', 'truck'] + +plt.figure(figsize=(10,10)) +for i in range(25): + plt.subplot(5,5,i+1) + plt.xticks([]) + plt.yticks([]) + plt.grid(False) + plt.imshow(X_train[i]) + plt.xlabel(class_names[y_train[i][0]]) +plt.show() +``` + +**Результат выполнения:** + +![](pictures.png) + +### 3) Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения сверточной нейронной сети. Входные данные принимают значения от 0 до 1, метки цифр закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных. + +```python +# Зададим параметры данных и модели +num_classes = 10 +input_shape = (32, 32, 3) + +# Приведение входных данных к диапазону [0, 1] +X_train = X_train / 255 +X_test = X_test / 255 + +print('Shape of transformed X train:', X_train.shape) +print('Shape of transformed X test:', X_test.shape) + +# переведем метки в one-hot +y_train = keras.utils.to_categorical(y_train, num_classes) +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) Реализовали модель сверточной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. + +```python +model = Sequential() +model.add(layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=input_shape)) +model.add(layers.MaxPooling2D(pool_size=(2, 2))) +model.add(layers.Conv2D(64, kernel_size=(3, 3), activation="relu")) +model.add(layers.MaxPooling2D(pool_size=(2, 2))) +model.add(layers.Conv2D(128, kernel_size=(3, 3), activation="relu")) +model.add(layers.MaxPooling2D(pool_size=(2, 2))) +model.add(layers.Flatten()) +model.add(layers.Dense(128, activation='relu')) +model.add(layers.Dropout(0.5)) +model.add(layers.Dense(num_classes, activation="softmax")) +model.summary() +``` + +**Результат выполнения:** +``` +Model: "sequential_1" +┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ +┃ Layer (type) ┃ Output Shape ┃ Param # ┃ +┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ +│ conv2d (Conv2D) │ (None, 30, 30, 32) │ 896 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ max_pooling2d (MaxPooling2D) │ (None, 15, 15, 32) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ conv2d_1 (Conv2D) │ (None, 13, 13, 64) │ 18,496 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ max_pooling2d_1 (MaxPooling2D) │ (None, 6, 6, 64) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ conv2d_2 (Conv2D) │ (None, 4, 4, 128) │ 73,856 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ max_pooling2d_2 (MaxPooling2D) │ (None, 2, 2, 128) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ flatten (Flatten) │ (None, 512) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense (Dense) │ (None, 128) │ 65,664 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dropout (Dropout) │ (None, 128) │ 0 │ +├─────────────────────────────────┼────────────────────────┼───────────────┤ +│ dense_1 (Dense) │ (None, 10) │ 1,290 │ +└─────────────────────────────────┴────────────────────────┴───────────────┘ + Total params: 160,202 (625.79 KB) + Trainable params: 160,202 (625.79 KB) + Non-trainable params: 0 (0.00 B) + ``` + + ```python + # компилируем и обучаем модель +batch_size = 64 +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) +``` + +### 5) Оценили качество обучения на тестовых данных. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных. + +```python +# Оценка качества работы модели на тестовых данных +scores = model.evaluate(X_test, y_test) +print('Loss on test data:', scores[0]) +print('Accuracy on test data:', scores[1]) +``` + +**Результат выполнения:** +``` +accuracy: 0.7221 - loss: 1.3448 +Loss on test data: 1.3755847215652466 +Accuracy on test data: 0.7161999940872192 +``` + +### 6) Подали на вход обученной модели два тестовых изображения. Вывели изображения, истинные метки и результаты распознавания. + +```python +# вывод двух тестовых изображений и результатов распознавания + +for n in [3,15]: + result = model.predict(X_test[n:n+1]) + print('NN output:', result) + + plt.imshow(X_test[n].reshape(32,32,3), cmap=plt.get_cmap('gray')) + plt.show() + print('Real mark: ', np.argmax(y_test[n])) + print('NN answer: ', np.argmax(result)) +``` + +**Результат выполнения:** + +``` +NN output: [[6.5008247e-14 2.3088744e-24 9.9999559e-01 1.2591926e-10 4.3790410e-06 + 3.5441555e-08 3.6621060e-14 1.2152020e-17 3.1557848e-24 7.1617705e-22]] +``` + +![](2_6-1.png) + +``` +Real mark: 2 +NN answer: 2 + +NN output: [[3.0706801e-02 1.1524949e-06 9.5588940e-01 1.4628977e-06 1.8517934e-05 + 2.2070046e-09 1.3382627e-02 7.1595925e-13 1.4458233e-07 3.5801229e-09]] +``` + +![](2_6-2.png) + +``` +Real mark: 2 +NN answer: 2 +``` + +### 7) Вывели отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки. + +```python +# истинные метки классов +true_labels = np.argmax(y_test, axis=1) +# предсказанные метки классов +predicted_labels = np.argmax(model.predict(X_test), axis=1) + +# отчет о качестве классификации +print(classification_report(true_labels, predicted_labels, target_names=class_names)) +# вычисление матрицы ошибок +conf_matrix = confusion_matrix(true_labels, predicted_labels) +# отрисовка матрицы ошибок в виде "тепловой карты" +fig, ax = plt.subplots(figsize=(6, 6)) +disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix,display_labels=class_names) +disp.plot(ax=ax, xticks_rotation=45) # поворот подписей по X и приятная палитра +plt.tight_layout() # чтобы всё влезло +plt.show() +``` + +**Результат выполнения:** + +![](2_7-1.png) + +![](2_7-2.png) + +