Цель работы: научиться реализовывать один из алгоритмов глубокого обучения с нуля. Задание:
1. Скачайте датасет CarDatasets
2. Реализуйте нейронную сеть с оптимизатором согласно варианту задания. Архитектуру, указанную в варианте, необходимо реализовать с использованиемNumpyис Torch/Tensorflow/Jax
3. Оцените качество модели на тесте и сравните быстродействие реализованныхвариантов. 4. Запустите обучение на классическом Adam и сравните сходимость результатов с вариантом задания. мне достался вариант с архитектурой Inception  и оптимизатором AdamW
Вот код, который у меня есть, не уверена, что он правильный, внеси свои правки если это необхлдимо
import os
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader

# Пути к данным
train_dir = 'E:/maga/3 семестр/Тестирование данных/CarDatasets/dataset/Images/Train'
test_dir = 'E:/maga/3 семестр/Тестирование данных/CarDatasets/dataset/Images/Test'

# Гиперпараметры
batch_size = 32
learning_rate = 0.001
epochs = 20

# Трансформации для изображений
transform = transforms.Compose([
    transforms.Resize((299, 299)),  # Размер для Inception
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# Загрузчики данных
train_data = datasets.ImageFolder(train_dir, transform=transform)
test_data = datasets.ImageFolder(test_dir, transform=transform)

train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size=batch_size, shuffle=False)

# Проверка классов
print(f"Классы: {train_data.classes}")

# Устройство
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')


# Загрузка модели Inception
class InceptionModel(nn.Module):
    def __init__(self, num_classes):
        super(InceptionModel, self).__init__()
        self.inception = models.inception_v3(pretrained=True)
        self.inception.aux_logits = False  # Выключаем вспомогательную ветвь
        self.inception.fc = nn.Linear(self.inception.fc.in_features, num_classes)

    def forward(self, x):
        return self.inception(x)


num_classes = len(train_data.classes)
model = InceptionModel(num_classes).to(device)


# Функция обучения
def train_model(model, train_loader, criterion, optimizer, epochs):
    model.train()
    for epoch in range(epochs):
        total_loss = 0
        for images, labels in train_loader:
            images, labels = images.to(device), labels.to(device)
            optimizer.zero_grad()
            outputs = model(images)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            total_loss += loss.item()

        print(f"Эпоха [{epoch + 1}/{epochs}], Потеря: {total_loss / len(train_loader):.4f}")


# Функция оценки
def evaluate_model(model, test_loader):
    model.eval()
    correct, total = 0, 0
    with torch.no_grad():
        for images, labels in test_loader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    accuracy = correct / total
    print(f"Точность на тестовых данных: {accuracy:.4f}")
    return accuracy


# Запуск с Adam
print("=== Обучение с Adam ===")
adam_optimizer = optim.Adam(model.parameters(), lr=learning_rate)
criterion = nn.CrossEntropyLoss()
train_model(model, train_loader, criterion, adam_optimizer, epochs)
adam_accuracy = evaluate_model(model, test_loader)

# Перезапуск модели для AdamW
model = InceptionModel(num_classes).to(device)

# Запуск с AdamW
print("\n=== Обучение с AdamW ===")
adamw_optimizer = optim.AdamW(model.parameters(), lr=learning_rate)
train_model(model, train_loader, criterion, adamw_optimizer, epochs)
adamw_accuracy = evaluate_model(model, test_loader)

# Сравнение результатов
print(f"\nТочность Adam: {adam_accuracy:.4f}")
print(f"Точность AdamW: {adamw_accuracy:.4f}")