Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
17.12.2023
Размер:
496.07 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Сочинский государственный университет»

Кафедра Информационных технологий

ОТЧЁТ

по лабораторной работе № 6

«РАСПОЗНАВАНИЕ ЦИФР ИЗ НАБОРА MNIST»

Выполнила: студентка группы 20-ПИ

Кольцова Адриана Андреевна

Дата: 11.11.2023

Проверил: д.т.н. проф. Попов Д.И.

Дата: _______________

Сочи 2023

1 задание

Эта программа создает, обучает и сохраняет простую нейронную сеть для классификации изображений из набора данных MNIST, который состоит из рукописных цифр от 0 до 9.

Код программы:

from keras.datasets import mnist

from keras.utils import to_categorical

from keras import backend as keras_backend

from keras.models import Sequential, load_model, model_from_yaml

from keras.layers import Dense

from tensorflow.keras.utils import plot_model  # Изменилась строка

import numpy as np

import matplotlib.pyplot as plt

# Загрузка данных из набора MNIST

(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Вывод информации о данных

print('X_train: ' + str(X_train.shape))

print('Y_train: ' + str(y_train.shape))

print('X_test: ' + str(X_test.shape))

print('Y_test: ' + str(y_test.shape))

# Визуализация изображений

for i in range(9):

    plt.subplot(330 + 1 + i)

    plt.imshow(X_train[i], cmap=plt.get_cmap('gray'))

plt.show()

# Подготовка данных

image_height = X_train.shape[1]

image_width = X_train.shape[2]

number_of_pixels = image_height * image_width

X_train = keras_backend.cast_to_floatx(X_train)

X_test = keras_backend.cast_to_floatx(X_test)

X_train /= 255.0

X_test /= 255.0

y_train = to_categorical(y_train, num_classes=10)

y_test = to_categorical(y_test, num_classes=10)

X_train = np.reshape(X_train, [X_train.shape[0], number_of_pixels])

X_test = np.reshape(X_test, [X_test.shape[0], number_of_pixels])

# Создание модели нейронной сети

model = Sequential()

dense_layer = Dense(number_of_pixels, activation='relu', input_shape=[number_of_pixels])

model.add(dense_layer)

model.add(Dense(10, activation='softmax'))

model.summary()

# Компиляция и обучение модели

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=30, batch_size=256, verbose=2)

# Визуализация ошибок обучения и точности

plt.figure(figsize=(12, 4))

# График ошибок обучения и проверки

plt.subplot(1, 2, 1)

plt.plot(history.history['loss'])

plt.plot(history.history['val_loss'])

plt.title('Model loss')

plt.ylabel('Loss')

plt.xlabel('Epoch')

plt.legend(['Train', 'Test'], loc='upper left')

# График точности обучения и проверки

plt.subplot(1, 2, 2)

plt.plot(history.history['accuracy'])

plt.plot(history.history['val_accuracy'])

plt.title('Model accuracy')

plt.ylabel('Accuracy')

plt.xlabel('Epoch')

plt.legend(['Train', 'Test'], loc='upper left')

plt.tight_layout()

plt.show()

# Визуализация результатов распознавания на проверочном наборе

predictions = model.predict(X_test)

num_rows = 5

num_cols = 3

num_images = num_rows * num_cols

plt.figure(figsize=(2 * 2 * num_cols, 2 * num_rows))

for i in range(num_images):

    plt.subplot(num_rows, 2 * num_cols, 2 * i + 1)

    plt.imshow(X_test[i].reshape(28, 28), cmap='gray')

    plt.title(f"True: {np.argmax(y_test[i])}\nPredicted: {np.argmax(predictions[i])}")

    plt.axis('off')

plt.show()

# Визуализация модели

plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)

# Сохранение модели

model.save('Two_layer_model.h5')

# Загрузка модели и весов

model2 = load_model('Two_layer_model.h5')

model.save_weights('Two_layer_model_weights_only.h5')

# Сохранение и загрузка архитектуры сети без весов

filename = 'Two_layer_model_architecture_only.h5'

yaml_string = model.to_yaml()

with open(filename, 'w') as outfile:

    outfile.write(yaml_string)

with open(filename) as yaml_data:

    yaml_string = yaml_data.read()

model = model_from_yaml(yaml_string)

2 задание

Этот код выполняет следующие действия:

Загружает набор данных Fashion-MNIST, который содержит изображения одежды и соответствующие им метки (классы).

Визуализирует первые 25 изображений из обучающего набора данных, сопровождая их метками.

Подготавливает данные, нормализуя значения пикселей изображений и преобразуя метки в категориальный формат.

Создает простую нейронную сеть с использованием библиотеки Keras. Сеть состоит из входного слоя (Flatten), скрытого слоя с 128 нейронами и функцией активации ReLU, а также выходного слоя с 10 нейронами и функцией активации softmax.

Компилирует модель, используя оптимизатор Adam, функцию потерь categorical_crossentropy и метрику accuracy.

Обучает модель на данных обучения в течение 10 эпох с использованием проверочного набора данных.

Визуализирует графики ошибок обучения и точности распознавания на обучающем и проверочном наборах данных.

Проводит распознавание на тестовом наборе данных и визуализирует первые 25 изображений с указанием истинной и предсказанной меток. Метки, которые совпадают, выделены зеленым цветом, а несовпадающие - красным.

Код программы:

import numpy as np

import matplotlib.pyplot as plt

from keras.datasets import fashion_mnist

from keras.models import Sequential

from keras.layers import Dense, Flatten

from keras.utils import to_categorical

# Загрузка данных

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

# Визуализация нескольких изображений

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(train_images[i], cmap=plt.cm.binary)

    plt.xlabel(train_labels[i])

plt.show()

# Подготовка данных

train_images = train_images / 255.0

test_images = test_images / 255.0

# Преобразование меток в категориальный формат

train_labels = to_categorical(train_labels)

test_labels = to_categorical(test_labels)

# Создание модели

model = Sequential()

model.add(Flatten(input_shape=(28, 28)))  # Входной слой

model.add(Dense(128, activation='relu'))  # Скрытый слой с 128 нейронами

model.add(Dense(10, activation='softmax'))  # Выходной слой с 10 нейронами (по числу классов)

# Компиляция модели

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Обучение модели

history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

# Графики ошибок обучения и точности распознавания

plt.plot(history.history['loss'], label='Training Loss')

plt.plot(history.history['val_loss'], label='Validation Loss')

plt.xlabel('Epochs')

plt.ylabel('Loss')

plt.legend()

plt.show()

plt.plot(history.history['accuracy'], label='Training Accuracy')

plt.plot(history.history['val_accuracy'], label='Validation Accuracy')

plt.xlabel('Epochs')

plt.ylabel('Accuracy')

plt.legend()

plt.show()

# Результаты распознавания на проверочном наборе

predictions = model.predict(test_images)

# Визуализация результатов

plt.figure(figsize=(15, 15))

for i in range(25):

    plt.subplot(5, 5, i + 1)

    plt.xticks([])

    plt.yticks([])

    plt.grid(False)

    plt.imshow(test_images[i], cmap=plt.cm.binary)

    true_label = np.argmax(test_labels[i])

    predicted_label = np.argmax(predictions[i])

    if true_label == predicted_label:

        color = 'green'

    else:

        color = 'red'

    plt.xlabel(f"True: {true_label}, Predicted: {predicted_label}", color=color)

plt.show()