import torch import torch.optim as optim import torch.nn as nn def train_model(model, trainloader, testloader, epochs=10, learning_rate=0.001): """ Trains the PyTorch model. """ device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print(f"Training on device: {device}") model.to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) history = {'accuracy': [], 'loss': []} for epoch in range(epochs): running_loss = 0.0 correct = 0 total = 0 model.train() for i, data in enumerate(trainloader, 0): inputs, labels = data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() epoch_loss = running_loss / len(trainloader) epoch_acc = correct / total history['loss'].append(epoch_loss) history['accuracy'].append(epoch_acc) print(f'Epoch {epoch + 1}/{epochs} - Loss: {epoch_loss:.4f} - Accuracy: {epoch_acc:.4f}') print('Finished Training') return history