Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МО_Иванова_4117_ЛР_3.docx
Скачиваний:
2
Добавлен:
29.04.2025
Размер:
1.11 Mб
Скачать

Часть 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)

Соседние файлы в предмете Машинное обучение