import torch import torch.nn.functional as F from torchvision import transforms, datasets from torch.utils.data import DataLoader import torch.nn as nn # Add data augmentation transforms transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # Define the neural network model class Net(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = torch.flatten(x, 1) # flatten all dimensions except batch x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x # Set device for training device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Load the CIFAR-10 dataset train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) # Define the dataloaders batch_size = 128 train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=4) test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, drop_last=True,num_workers=4) # Define the optimizer and loss function model = Net().to(device) optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9) criterion = nn.CrossEntropyLoss() def test_model(dataloader): model.eval() correct = 0 total = 0 with torch.no_grad(): for inputs, labels in dataloader: inputs = inputs.to(device) labels = labels.to(device) outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() return 100 * correct / total # Train the model epochs = 5 for epoch in range(epochs): running_loss = 0.0 model.train() for i, (inputs, labels) in enumerate(train_dataloader): inputs = inputs.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: # print every 2000 mini-batches print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 100:.3f}') running_loss = 0.0 train_accuracy = test_model(train_dataloader) test_accuracy = test_model(test_dataloader) print(f'Epoch [{epoch+1}/{epochs}], Train Accuracy: {train_accuracy:.2f}%, Test Accuracy: {test_accuracy:.2f}%') # print training accuracy train_accuracy = test_model(train_dataloader) test_accuracy = test_model(test_dataloader) print (f'Train Accuracy: {train_accuracy:.2f}%, Test Accuracy: {test_accuracy:.2f}%') # Save the predictions to submission.csv import pandas as pd submission = pd.DataFrame(columns=list(range(10)), index=range(len(test_dataset))) model.eval() for idx, data in enumerate(test_dataset): inputs = data[0].unsqueeze(0).to(device) pred = model(inputs) pred = torch.softmax(pred[0], dim=0) # Get per-class probabilities submission.loc[idx] = pred.tolist() submission.to_csv('submission.csv')