| import torch |
| import torch.nn as nn |
| import torch.optim as optim |
| import torch.optim.lr_scheduler as lr_scheduler |
| from dataloader import batch_size |
| from dataloader import data_transform, data_loader |
| from blocknet10 import CustomCIFAR10Net |
| from analytics import model_analytics |
| from push_to_hf import HF |
|
|
| torch.manual_seed(42) |
|
|
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| print(f"Using device: {device}") |
|
|
| transform_train, transform_test = data_transform() |
| train_loader, test_loader = data_loader(transform_train, transform_test) |
|
|
| def arch_tester(): |
| model = CustomCIFAR10Net() |
| input_data = torch.randn(batch_size, 3, 32, 32) |
| output = model(input_data) |
| return output.shape |
|
|
| arch_tester_output = arch_tester() |
| print(arch_tester_output) |
|
|
| model = CustomCIFAR10Net().to(device) |
|
|
| criterion = nn.CrossEntropyLoss() |
| optimizer = optim.AdamW(model.parameters(), lr=0.01, betas=(0.8, 0.95), weight_decay=0.0005, amsgrad=True, eps=1e-8) |
| scheduler = lr_scheduler.CosineAnnealingLR(optimizer, T_max=200) |
|
|
| train_losses = [] |
| train_accuracies = [] |
| test_accuracies = [] |
|
|
| num_epochs = 50 |
| total_steps = len(train_loader) * num_epochs |
| step_count = 0 |
|
|
| for epoch in range(num_epochs): |
| running_loss = 0.0 |
| correct_train = 0 |
| total_train = 0 |
|
|
| for i, (inputs, labels) in enumerate(train_loader, 0): |
| inputs, labels = inputs.to(device), labels.to(device) |
| optimizer.zero_grad() |
| outputs = model(inputs) |
| loss = criterion(outputs, labels) |
| loss.backward() |
| optimizer.step() |
| running_loss += loss.item() |
| step_count += 1 |
| if step_count % 100 == 0: |
| train_losses.append(running_loss / 100) |
| print(f'[Epoch: {epoch + 1}, Step: {step_count:5d}/{total_steps}] loss: {running_loss / 100:.3f}') |
| running_loss = 0.0 |
|
|
| if i == len(train_loader) - 1: |
| model.eval() |
| with torch.no_grad(): |
| for images, labels in train_loader: |
| images, labels = images.to(device), labels.to(device) |
| outputs = model(images) |
| _, predicted = torch.max(outputs.data, 1) |
| total_train += labels.size(0) |
| correct_train += (predicted == labels).sum().item() |
|
|
| train_accuracy = 100 * correct_train / total_train |
| train_accuracies.append(train_accuracy) |
|
|
| scheduler.step() |
|
|
| model.eval() |
| correct_test = 0 |
| total_test = 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.data, 1) |
| total_test += labels.size(0) |
| correct_test += (predicted == labels).sum().item() |
|
|
| test_accuracy = 100 * correct_test / total_test |
| test_accuracies.append(test_accuracy) |
|
|
| print(f'Epoch {epoch + 1}: Test Accuracy = {test_accuracy:.2f}%') |
|
|
|
|
| print("Last Train Losses:" + str(train_losses[-1])) |
| print("Last Train Accuracy:" + str(train_accuracies[-1])) |
| print("Last Test Accuracy:" + str(test_accuracies[-1])) |
|
|
| analytics = model_analytics(train_losses, train_accuracies, test_accuracies) |
|
|
| huggingface = HF() |
| push_to_face = huggingface.push_to_face(model=model) |
| print(push_to_face) |