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


# ==============================================================================
# РАБОЧАЯ ТЕТРАДЬ № 7. ОСНОВЫ МАШИННОГО ОБУЧЕНИЯ
# ==============================================================================

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist, cifar10
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import SGD

# ------------------------------------------------------------------------------
# ЗАДАНИЕ 1: Модификация бинарной классификации[cite: 3]
# ------------------------------------------------------------------------------
print("--- Выполнение Задания 1 ---")

# Генерация синтетических данных
X_gen = np.random.rand(1000, 20)
y_gen = np.random.randint(2, size=(1000, 1))

# Создание модели по заданным параметрам: 
# 128 нейронов (tanh), 1 нейрон (softmax), оптимизатор rmsprop[cite: 3]
model1 = models.Sequential([
    layers.Dense(128, input_dim=20, activation='tanh'),
    layers.Dense(1, activation='softmax') # Примечание: softmax для 1 выхода всегда даст 1.0[cite: 3]
])

model1.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
model1.fit(X_gen, y_gen, epochs=5, batch_size=32, verbose=0)
print("Задание 1 завершено успешно.\n")


# ------------------------------------------------------------------------------
# ЗАДАНИЕ 2: Классификация MNIST (64 batch_size, 20 epochs)[cite: 3]
# ------------------------------------------------------------------------------
print("--- Выполнение Задания 2 (MNIST) ---")

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28)).astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28)).astype("float32") / 255

model2 = models.Sequential([
    layers.Dense(512, activation="relu"),
    layers.Dense(10, activation="softmax")
])

model2.compile(optimizer="rmsprop",
               loss="sparse_categorical_crossentropy",
               metrics=["accuracy"])

# Обучение с измененными гиперпараметрами[cite: 3]
model2.fit(train_images, train_labels, epochs=20, batch_size=64, verbose=1)

test_loss, test_acc = model2.evaluate(test_images, test_labels)
print(f"Точность на MNIST (Задание 2): {test_acc:.4f}\n")


# ------------------------------------------------------------------------------
# ЗАДАНИЕ 3: Глубокая CNN (5 Conv2D, 4 MaxPooling2D)[cite: 3]
# ------------------------------------------------------------------------------
print("--- Выполнение Задания 3 (Сложная CNN) ---")

# Входной формат более 80 пикселей (выберем 100x100)[cite: 3]
model3 = models.Sequential([
    layers.Input(shape=(100, 100, 3)),
    
    layers.Conv2D(32, 3, activation="relu"),
    layers.MaxPooling2D(2), # 1
    
    layers.Conv2D(64, 3, activation="relu"),
    layers.MaxPooling2D(2), # 2
    
    layers.Conv2D(128, 3, activation="relu"),
    layers.MaxPooling2D(2), # 3
    
    layers.Conv2D(256, 3, activation="relu"),
    layers.MaxPooling2D(2), # 4
    
    layers.Conv2D(512, 3, activation="relu"), # 5
    
    layers.Flatten(),
    layers.Dense(10, activation="softmax")
])

model3.compile(optimizer="rmsprop", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model3.summary()
print("Архитектура Задания 3 построена.\n")


# ------------------------------------------------------------------------------
# ЗАДАНИЕ 4: Оптимизация CIFAR-10[cite: 3]
# ------------------------------------------------------------------------------
print("--- Выполнение Задания 4 (CIFAR-10) ---")

(X_train_c, y_train_c), (X_test_c, y_test_c) = cifar10.load_data()
X_train_c = X_train_c.astype('float32') / 255
X_test_c = X_test_c.astype('float32') / 255
Y_train_c = to_categorical(y_train_c, 10)
Y_test_c = to_categorical(y_test_c, 10)

# Улучшенная архитектура для CIFAR-10[cite: 3]
model4 = models.Sequential([
    layers.Conv2D(64, (3, 3), padding='same', input_shape=(32, 32, 3), activation='relu'),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Dropout(0.3),

    layers.Conv2D(128, (3, 3), padding='same', activation='relu'),
    layers.Conv2D(128, (3, 3), activation='relu'),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Dropout(0.4),

    layers.Flatten(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax')
])

# Использование SGD с моментом для лучшей сходимости[cite: 3]
sgd = SGD(learning_rate=0.01, momentum=0.9, nesterov=True)
model4.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# Обучение на полном объеме данных (50 эпох для качества)[cite: 3]
print("Запуск длительного обучения CIFAR-10...")
model4.fit(X_train_c, Y_train_c, batch_size=64, epochs=50, shuffle=True, verbose=1)

scores = model4.evaluate(X_test_c, Y_test_c, verbose=0)
print(f"Итоговая точность на CIFAR-10 (Задание 4): {scores[1]*100:.2f}%")