-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbenchmark_resnet.py
More file actions
145 lines (123 loc) · 4.46 KB
/
Copy pathbenchmark_resnet.py
File metadata and controls
145 lines (123 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import torch
import torch.nn as nn
import torch_optimizer as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
import numpy as np
from multiprocessing import Pool
import multiprocessing
import json
import os.path
import os
def train_resnet_cifar10(command):
if os.path.isfile(f'data_ResNet/ResNet_{command}.json'):
print('Training was preempted')
return
else:
print(f'Starting training of {command}')
# Set device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# Hyperparameters
num_epochs = 100
batch_size = 128
# Transformations
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
# Load CIFAR-10 dataset
train_dataset = datasets.CIFAR10(root="./data", train=True, transform=transform, download=True)
test_dataset = datasets.CIFAR10(root="./data", train=False, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
# Load ResNet18 model
model = models.resnet18(pretrained=False, num_classes=10)
model = model.to(device)
# Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = eval(command)
optimization_loss = []
# Training loop
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
# Zero the parameter gradients
optimizer.zero_grad()
# Forward + backward + optimize
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
Average_loss_per_batch = running_loss/len(train_loader)
optimization_loss.append(Average_loss_per_batch)
print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {Average_loss_per_batch:.4f}")
# Evaluate the model
model.eval()
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in test_loader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
Total_accuracy = 100 * correct / total
print(f"Test Accuracy: {Total_accuracy:.2f}%")
output_data = {
"Total_accuracy": Total_accuracy,
"Optimization_path": optimization_loss
}
with open(f'data_ResNet/ResNet_{command}.json', "w") as json_file:
json.dump(output_data, json_file, indent=4)
if __name__ == "__main__":
is_parallel = False
folder_name = "data_ResNet"
# Check and create the folder if it doesn't exist
if not os.path.exists(folder_name):
os.makedirs(folder_name)
print(f"Folder '{folder_name}' created.")
algorithm_list = [
"torch.optim.SGD",
"torch.optim.Adagrad",
"optim.AggMo",
"torch.optim.Rprop",
"torch.optim.RMSprop",
"torch.optim.Adam",
"torch.optim.Adamax",
"torch.optim.NAdam",
"torch.optim.RAdam",
"torch.optim.AMSgrad",
"optim.NovoGrad",
"optim.SWATS",
"optim.DiffGrad",
"optim.Yogi",
"optim.Lamb",
"optim.AdamP",
"torch.optim.AdamW",
"optim.AdaMod",
"optim.MADGRAD",
"optim.AdaBound",
"optim.PID",
"optim.QHAdam",
]
task_list = []
for Algorithm in algorithm_list:
for learning_rate in [10**i for i in range(-3, -1)]:
if "torch.optim.AMSgrad" == Algorithm:
result = "torch.optim.Adam(model.parameters(), lr=" + str(learning_rate) + ", amsgrad=True)"
else:
result = Algorithm + "(model.parameters(), lr=" + str(learning_rate) + ")"
task_list.append((result, ))
if is_parallel:
with Pool(processes=3) as pool:
# Use starmap to pass multiple arguments
results = pool.starmap(train_resnet_cifar10, task_list, )
else:
for task in task_list:
train_resnet_cifar10(*task)