- •Санкт-Петербург 2024
- •Часть 1. В начале импортируются необходимые для работы библиотеки, большая часть из которых наборы данных и различные виды слоёв Keras для описания структуры нейросети.
- •Часть 2. Определение предложенных классов из набора cifar-10. Сверточная нс.
- •Приложение а. Подготовка к работе. Эксперимент 1.
- •Приложение г. Эксперимент 4.
- •Приложение д. Эксперимент 5.
- •Приложение е. Эксперимент 6 и сравнение результатов.
- •Приложение ё. Часть 2 – распознавание изображений из набора cifar-10
Часть 2. Определение предложенных классов из набора cifar-10. Сверточная нс.
Набор данных CIFAR-10 состоит из 60 000 цветных изображений размером 32x32 в 10 классах, по 6000 изображений в каждом классе. Имеется 50 000 обучающих изображений и 10 000 тестовых изображений.
Набор данных разделен на пять обучающих пакетов и один тестовый пакет, каждый из которых содержит 10 000 изображений. Тестовый пакет содержит ровно 1000 случайно выбранных изображений из каждого класса. Обучающие пакеты содержат оставшиеся изображения в случайном порядке, но некоторые обучающие пакеты могут содержать больше изображений из одного класса, чем из другого. В общей сложности обучающие пакеты содержат ровно 5000 изображений из каждого класса.
Рассматриваемые изображения (классы): самолет, автомобиль, птица, кот, олень, собака, лягушка, лошадь, корабль, грузовик.
Создана модель сверточной нейросети, состоящая из 2 сверточных слоёв, 2 слоёв пуллинга, 2 полно связных слоёв, Flatten слоя для преобразования и слоя Dropout для снижения возможности переобучения. Обучение проведено в 40 эпох. Полный код находится в Приложении Ё
На примере 10 изображений из валидационной выборки выполняется предсказание. В большинстве случаев НС корректно определяет, к каком классу относится переданное изображение (Рисунок 24). Также построены графики зависимости потерь и точности от проведенных эпох. Можно заметить, с увеличением числа эпох точность предсказания растет, а потери уменьшаются. При этом значения точности составляют, что является неплохим результатом. На рисунке 25 представлены графики зависимости уровня потерь и точности модели, от количества проведенных эпох.
Рисунок 24 – Выполненное предсказание
Рисунок 25 – Графики потерь и точности для сети распознавания на основе набора cifar-10
Вывод:
В ходе выполнения лабораторной работы получено представление о работе сверточной нейронной сети. Было решено 2 задачи классификации в виде распознавания образов, относящихся к конкретным классам.
В первой задаче успешно решена проблема распознавания рукописных цифр. Для этого было разработано 6 различных НС, 2 из которых - сверточные. Проведены эксперименты в выполнении предсказаний и оценке результатов. Все данные построенных моделей были записаны в датафрейм. В последствии выяснено, что наилучший результаты показали сверточные модели, причем, более сложная структура показала чуть более низкие результаты. Точность наилучшей модели составила 0.99.
Во второй задаче была решена проблема распознавания цветного изображения, относящегося к одному из 10 классов. Была использована сверточная нейронная сеть, имеющая точность в 70-80 %. Что говорит о высокой распознавательской способности.
Приложение а. Подготовка к работе. Эксперимент 1.
# Импорт библиотек
import numpy
from keras.utils import to_categorical
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns
import numpy as np
from sklearn.metrics import classification_report
import random
import pandas as pd
from keras.layers import Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras import backend as K
(X_train, y_train), (X_test, y_test) = mnist.load_data() # загрузка данных
def vis_img(res,title):
r = random.sample(range(0, len(res)), 4)
plt.subplot(221)
plt.imshow(res[r[0]], cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(res[r[1]], cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(res[r[2]], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(res[r[3]], cmap=plt.get_cmap('gray'))
# show the plot
plt.figtext(0.5, 1, title, ha='center', va='center')
plt.show()
vis_img(X_train, "Тренировочный набор")
vis_img(X_test, "Валидационный набор")
num_pixels = X_train.shape[1] * X_train.shape[2]
print(num_pixels)
X_train = X_train.reshape(X_train.shape[0], num_pixels)
X_test = X_test.reshape(X_test.shape[0], num_pixels)
# Нормализация
X_train = X_train / 255
X_test = X_test / 255
# преобразование ответа
y_train = to_categorical(y_train) #преобразование правильных ответов в one-hot представление: векторы, в которых единственная единица на месте нужной цифры
y_test = to_categorical(y_test)
num_classes = y_test.shape[1]
print(num_classes)
print(y_test.shape)
y_train.shape
model_1 = Sequential()
model_1.add(Dense(64,input_dim=num_pixels, activation=None))
model_1.add(Dense(10, activation='softmax'))
model_1.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
def make_history(model, epochs):
history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=200, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=0)
print('\nTest loss:', scores[0])
print('Test accuracy:', scores[1])
return history, scores
history_1, scores_1 = make_history(model_1,20)
y_test_digits = np.argmax(y_test, axis=1)
def prediction(model):
# преобразование вида ожидаемых ответов
print(f'Истинные значения:{y_test_digits}')
# Выполнение предсказания
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
print(f'Предсказанные значения:{y_pred}')
return y_pred
y_pred_1 = prediction(model_1)
results_df = pd.DataFrame(columns=['N','Модель','Архитектура','Кол-во слоев','Функция активации','Точность','Потери'])
def add_model_results(model_number, model_type, structure, layers, activation, accuracy, loss):
global results_df
new_row = {"N": model_number, "Модель": model_type, "Архитектура": structure,"Кол-во слоев": layers, "Функция активации": activation, "Точность": accuracy, "Потери": loss}
results_df.loc[len(results_df)] = [model_number, model_type, structure, layers, activation, accuracy, loss]
# Добавление результатов о 1 эксперименте
add_model_results(1,"DNN","D-64",2,"Линейная", scores_1[1], scores_1[0])
# Вывод результатов
results_df
def network_report(y_pred):
report = classification_report(y_test_digits, y_pred)
cm = confusion_matrix(y_test_digits, y_pred)
cmn = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
fig, ax = plt.subplots(figsize=(8, 8))
sns.heatmap(cmn, annot=True, fmt='.2f')
print(report)
network_report(y_pred_1)
def plot_loss(history):
plt.plot(history.history['loss'], label='loss')
plt.plot(history.history['val_loss'], label = 'val_loss')
plt.xlabel('Эпохи')
plt.ylabel('Потери')
plt.legend(loc='upper right')
plt.show()
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Эпохи')
plt.ylabel('Точность')
plt.legend(loc='lower right')
plt.show()
plot_loss(history_1)
ПРИЛОЖЕНИЕ Б. ЭКСПЕРИМЕНТ 2.
# Эксперимент 2
model_2 = Sequential()
model_2.add(Dense(64,input_dim=num_pixels, activation='relu'))
model_2.add(Dense(10, activation='softmax'))
model_2.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
history_2, scores_2 = make_history(model_2, 20)
y_pred_2 = prediction(model_2)
add_model_results(2,"DNN","D-64",2,"ReLU", scores_2[1], scores_2[0])
network_report(y_pred_2)
plot_loss(history_2)
ПРИЛОЖЕНИЕ В. ЭКСПЕРИМЕНТ 3.
# Эксперимент 3
model_3 = Sequential()
model_3.add(Dense(256,input_dim=num_pixels, activation='relu'))
model_3.add(Dense(128,input_dim=num_pixels, activation='relu'))
model_3.add(Dense(64,input_dim=num_pixels, activation='relu'))
model_3.add(Dense(10, activation='softmax'))
model_3.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
history_3, scores_3 = make_history(model_3, 40)
y_pred_3 = prediction(model_3)
add_model_results(3,"DNN","D-256, D-128, D-64",4,"ReLU", scores_3[1], scores_3[0])
network_report(y_pred_3)
plot_loss(history_3)
