-
-
Save johnolafenwa/96b3322aabb61d4d36fd870a77f02aa3 to your computer and use it in GitHub Desktop.
| #Import needed packages | |
| import torch | |
| import torch.nn as nn | |
| from torchvision.datasets import CIFAR10 | |
| from torchvision.transforms import transforms | |
| from torch.utils.data import DataLoader | |
| from torch.optim import Adam | |
| from torch.autograd import Variable | |
| import numpy as np | |
| class Unit(nn.Module): | |
| def __init__(self,in_channels,out_channels): | |
| super(Unit,self).__init__() | |
| self.conv = nn.Conv2d(in_channels=in_channels,kernel_size=3,out_channels=out_channels,stride=1,padding=1) | |
| self.bn = nn.BatchNorm2d(num_features=out_channels) | |
| self.relu = nn.ReLU() | |
| def forward(self,input): | |
| output = self.conv(input) | |
| output = self.bn(output) | |
| output = self.relu(output) | |
| return output | |
| class SimpleNet(nn.Module): | |
| def __init__(self,num_classes=10): | |
| super(SimpleNet,self).__init__() | |
| #Create 14 layers of the unit with max pooling in between | |
| self.unit1 = Unit(in_channels=3,out_channels=32) | |
| self.unit2 = Unit(in_channels=32, out_channels=32) | |
| self.unit3 = Unit(in_channels=32, out_channels=32) | |
| self.pool1 = nn.MaxPool2d(kernel_size=2) | |
| self.unit4 = Unit(in_channels=32, out_channels=64) | |
| self.unit5 = Unit(in_channels=64, out_channels=64) | |
| self.unit6 = Unit(in_channels=64, out_channels=64) | |
| self.unit7 = Unit(in_channels=64, out_channels=64) | |
| self.pool2 = nn.MaxPool2d(kernel_size=2) | |
| self.unit8 = Unit(in_channels=64, out_channels=128) | |
| self.unit9 = Unit(in_channels=128, out_channels=128) | |
| self.unit10 = Unit(in_channels=128, out_channels=128) | |
| self.unit11 = Unit(in_channels=128, out_channels=128) | |
| self.pool3 = nn.MaxPool2d(kernel_size=2) | |
| self.unit12 = Unit(in_channels=128, out_channels=128) | |
| self.unit13 = Unit(in_channels=128, out_channels=128) | |
| self.unit14 = Unit(in_channels=128, out_channels=128) | |
| self.avgpool = nn.AvgPool2d(kernel_size=4) | |
| #Add all the units into the Sequential layer in exact order | |
| self.net = nn.Sequential(self.unit1, self.unit2, self.unit3, self.pool1, self.unit4, self.unit5, self.unit6 | |
| ,self.unit7, self.pool2, self.unit8, self.unit9, self.unit10, self.unit11, self.pool3, | |
| self.unit12, self.unit13, self.unit14, self.avgpool) | |
| self.fc = nn.Linear(in_features=128,out_features=num_classes) | |
| def forward(self, input): | |
| output = self.net(input) | |
| output = output.view(-1,128) | |
| output = self.fc(output) | |
| return output | |
| #Define transformations for the training set, flip the images randomly, crop out and apply mean and std normalization | |
| train_transformations = 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)) | |
| ]) | |
| batch_size = 32 | |
| #Load the training set | |
| train_set = CIFAR10(root="./data",train=True,transform=train_transformations,download=True) | |
| #Create a loder for the training set | |
| train_loader = DataLoader(train_set,batch_size=batch_size,shuffle=True,num_workers=4) | |
| #Define transformations for the test set | |
| test_transformations = transforms.Compose([ | |
| transforms.ToTensor(), | |
| transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)) | |
| ]) | |
| #Load the test set, note that train is set to False | |
| test_set = CIFAR10(root="./data",train=False,transform=test_transformations,download=True) | |
| #Create a loder for the test set, note that both shuffle is set to false for the test loader | |
| test_loader = DataLoader(test_set,batch_size=batch_size,shuffle=False,num_workers=4) | |
| #Check if gpu support is available | |
| cuda_avail = torch.cuda.is_available() | |
| #Create model, optimizer and loss function | |
| model = SimpleNet(num_classes=10) | |
| if cuda_avail: | |
| model.cuda() | |
| optimizer = Adam(model.parameters(), lr=0.001,weight_decay=0.0001) | |
| loss_fn = nn.CrossEntropyLoss() | |
| #Create a learning rate adjustment function that divides the learning rate by 10 every 30 epochs | |
| def adjust_learning_rate(epoch): | |
| lr = 0.001 | |
| if epoch > 180: | |
| lr = lr / 1000000 | |
| elif epoch > 150: | |
| lr = lr / 100000 | |
| elif epoch > 120: | |
| lr = lr / 10000 | |
| elif epoch > 90: | |
| lr = lr / 1000 | |
| elif epoch > 60: | |
| lr = lr / 100 | |
| elif epoch > 30: | |
| lr = lr / 10 | |
| for param_group in optimizer.param_groups: | |
| param_group["lr"] = lr | |
| def save_models(epoch): | |
| torch.save(model.state_dict(), "cifar10model_{}.model".format(epoch)) | |
| print("Checkpoint saved") | |
| def test(): | |
| model.eval() | |
| test_acc = 0.0 | |
| for i, (images, labels) in enumerate(test_loader): | |
| if cuda_avail: | |
| images = Variable(images.cuda()) | |
| labels = Variable(labels.cuda()) | |
| #Predict classes using images from the test set | |
| outputs = model(images) | |
| _,prediction = torch.max(outputs.data, 1) | |
| prediction = prediction.cpu().numpy() | |
| test_acc += torch.sum(prediction == labels.data) | |
| #Compute the average acc and loss over all 10000 test images | |
| test_acc = test_acc / 10000 | |
| return test_acc | |
| def train(num_epochs): | |
| best_acc = 0.0 | |
| for epoch in range(num_epochs): | |
| model.train() | |
| train_acc = 0.0 | |
| train_loss = 0.0 | |
| for i, (images, labels) in enumerate(train_loader): | |
| #Move images and labels to gpu if available | |
| if cuda_avail: | |
| images = Variable(images.cuda()) | |
| labels = Variable(labels.cuda()) | |
| #Clear all accumulated gradients | |
| optimizer.zero_grad() | |
| #Predict classes using images from the test set | |
| outputs = model(images) | |
| #Compute the loss based on the predictions and actual labels | |
| loss = loss_fn(outputs,labels) | |
| #Backpropagate the loss | |
| loss.backward() | |
| #Adjust parameters according to the computed gradients | |
| optimizer.step() | |
| train_loss += loss.cpu().data[0] * images.size(0) | |
| _, prediction = torch.max(outputs.data, 1) | |
| train_acc += torch.sum(prediction == labels.data) | |
| #Call the learning rate adjustment function | |
| adjust_learning_rate(epoch) | |
| #Compute the average acc and loss over all 50000 training images | |
| train_acc = train_acc / 50000 | |
| train_loss = train_loss / 50000 | |
| #Evaluate on the test set | |
| test_acc = test() | |
| # Save the model if the test acc is greater than our current best | |
| if test_acc > best_acc: | |
| save_models(epoch) | |
| best_acc = test_acc | |
| # Print the metrics | |
| print("Epoch {}, Train Accuracy: {} , TrainLoss: {} , Test Accuracy: {}".format(epoch, train_acc, train_loss,test_acc)) | |
| if __name__ == "__main__": | |
| train(200) | |
thanks dude.it works on my pc.
Hello, can you help me solve my problem?
Traceback (most recent call last):
File "D:\pytorch\test.py", line 190, in
train(200)
File "D:\pytorch\test.py", line 166, in train
for i, (images, labels) in enumerate(train_loader):
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\utils\data\dataloader.py", line 352, in iter
return self._get_iterator()
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\utils\data\dataloader.py", line 294, in _get_iterator
return _MultiProcessingDataLoaderIter(self)
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\site-packages\torch\utils\data\dataloader.py", line 801, in init
w.start()
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\multiprocessing\context.py", line 327, in _Popen
return Popen(process_obj)
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\multiprocessing\popen_spawn_win32.py", line 93, in init
reduction.dump(process_obj, to_child)
File "C:\Users\Ding\AppData\Local\Programs\Python\Python39\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
OSError: [Errno 22] Invalid argument
Hello,
Your GPU is working properly, its good. Which dataset you are using for training? I used CIFAR-10 and it worked properly for me. The execution time depends on your dataset too.