
Интеллектуальные информационные системы 4 курс Попов / Кольцова АА ЛР6
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Сочинский государственный университет»
Кафедра Информационных технологий
ОТЧЁТ
по лабораторной работе № 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()