Загрузка данных
# ==============================================================================
# РАБОЧАЯ ТЕТРАДЬ № 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}%")