/
Durbolay
/
Lab1
Обзор
Документация
Войти
/
Durbolay
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab1.py
124 строки
6 KB
Durbolay
create Lab1.py
17 ноя 2025, 18:01
17 ноя 2025, 18:01
ab8f193
Код
Авторство
О чём код?
# Импортируем библиотеки import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt # Загружаем dataset Fashion MNIST (x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data() # Смотрим на размерности массивов print("x_train shape:", x_train.shape, "y_train shape:", y_train.shape) print("x_test shape:", x_test.shape, "y_test shape:", y_test.shape) # Создаем список с названиями классов (категорий одежды) class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot'] # Выведем несколько изображений из тренировочного набора 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], cmap=plt.cm.binary) plt.xlabel(class_names[y_train[i]]) plt.show() # Нормализуем значения пикселей (от 0 до 1) x_train = x_train.astype('float32') / 255 x_test = x_test.astype('float32') / 255 # Добавляем измерение для канала цвета (для черно-белых изображений канал = 1) # Было: (60000, 28, 28) -> Стало: (60000, 28, 28, 1) x_train = np.expand_dims(x_train, -1) x_test = np.expand_dims(x_test, -1) # Преобразуем метки в one-hot encoding (категориальный формат) # Например, метка 2 (Pullover) становится [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] y_train_categorical = keras.utils.to_categorical(y_train, 10) y_test_categorical = keras.utils.to_categorical(y_test, 10) # Выводим новую форму данных print("x_train shape:", x_train.shape) print("y_train_categorical shape:", y_train_categorical.shape) # Создаем последовательную модель model = keras.Sequential() # Первый сверточный блок model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # 32 фильтра размером 3x3 model.add(keras.layers.MaxPooling2D((2, 2))) # Слой пулинга, уменьшает размерность в 2 раза # Второй сверточный блок (увеличиваем количество фильтров) model.add(keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(keras.layers.MaxPooling2D((2, 2))) # Третий сверточный блок model.add(keras.layers.Conv2D(64, (3, 3), activation='relu')) # "Разворачиваем" 3D-тензор в 1D-вектор для подачи в полносвязные слои model.add(keras.layers.Flatten()) # Полносвязные слои model.add(keras.layers.Dense(64, activation='relu')) model.add(keras.layers.Dense(10, activation='softmax')) # Выходной слой на 10 классов # Выводим архитектуру модели model.summary() # Компилируем модель model.compile(optimizer='adam', loss='categorical_crossentropy', # Используем эту функцию потерь для one-hot encoded меток metrics=['accuracy']) # Обучаем модель (увеличим количество эпох до 10 для лучшего результата) history = model.fit(x_train, y_train_categorical, epochs=5, batch_size=64, validation_split=0.2) # Часть тренировочных данных используем для валидации во время обучения # Строим графики обучения plt.plot(history.history['accuracy'], label='Точность на обучении') plt.plot(history.history['val_accuracy'], label='Точность на валидации') plt.xlabel('Эпоха') plt.ylabel('Точность') plt.legend() plt.show() # Оцениваем модель на тестовых данных test_loss, test_acc = model.evaluate(x_test, y_test_categorical, verbose=2) print('\nТочность на тестовых данных (никогда не виденных моделью):', test_acc) # Делаем предсказания для всего тестового набора predictions = model.predict(x_test) # Функция для красивого отображения результата предсказания def plot_image(i, predictions_array, true_label, img): true_label, img = true_label[i], img[i] plt.grid(False) plt.xticks([]) plt.yticks([]) plt.imshow(img.squeeze(), cmap=plt.cm.binary) # Убираем размерность канала для отображения predicted_label = np.argmax(predictions_array) color = 'blue' if predicted_label == true_label else 'red' plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label], 100*np.max(predictions_array), class_names[true_label]), color=color) # Выбираем несколько случайных изображений для отображения num_rows = 5 num_cols = 3 num_images = num_rows*num_cols start_index = 10 # Начинаем с какого-то индекса, чтобы не всегда показывать первые plt.figure(figsize=(2*2*num_cols, 2*num_rows)) for i in range(num_images): index = i + start_index plt.subplot(num_rows, 2*num_cols, 2*i+1) plot_image(index, predictions[index], y_test, x_test) plt.tight_layout() plt.show()