Advertisement
lamiastella

exp_loocv

Nov 25th, 2018
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | None | 0 0
  1. from __future__ import print_function, division
  2.  
  3. import torch
  4. from torch.autograd import Variable
  5. from sklearn.metrics import accuracy_score
  6. from sklearn.metrics import confusion_matrix
  7. import torch
  8. import torch.nn as nn
  9. import torch.optim as optim
  10. from torch.optim import lr_scheduler
  11. import numpy as np
  12. import torchvision
  13. from torchvision import datasets, models, transforms
  14. import matplotlib.pyplot as plt
  15. import time
  16. import os
  17. import copy
  18.  
  19.  
  20.  
  21. import torch.utils.data as data_utils
  22. from torch.utils import data
  23.  
  24.  
  25. data_transforms = {
  26.     'train': transforms.Compose([
  27.         transforms.RandomResizedCrop(224),
  28.         transforms.RandomHorizontalFlip(),
  29.         transforms.RandomRotation(20),
  30.         transforms.ColorJitter(.3, .3, .3),
  31.         transforms.ToTensor(),
  32.         transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
  33.     ])
  34. }
  35.  
  36.  
  37. data_dir = "test_images"
  38.  
  39. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  40.  
  41.  
  42.  
  43. def train_model(model, criterion, optimizer, scheduler, dataloader, num_epochs=25):
  44.     since = time.time()
  45.  
  46.     for epoch in range(num_epochs):
  47.         print('Epoch {}/{}'.format(epoch, num_epochs - 1))
  48.         print('-' * 10)
  49.  
  50.         # Each epoch has a training and validation phase
  51.  
  52.         scheduler.step()
  53.         model.train()  # Set model to training mode
  54.  
  55.  
  56.         running_loss = 0.0
  57.         running_corrects = 0
  58.  
  59.         # Iterate over data.
  60.         for inputs, labels in dataloader:
  61.             inputs = inputs.to(device)
  62.             labels = labels.to(device)
  63.  
  64.             # zero the parameter gradients
  65.             optimizer.zero_grad()
  66.  
  67.             # forward
  68.             # track history if only in train
  69.             with torch.set_grad_enabled(True):
  70.                 outputs = model(inputs)
  71.                 _, preds = torch.max(outputs, 1)
  72.                 loss = criterion(outputs, labels)
  73.                 # backward + optimize only if in training phase
  74.                 loss.backward()
  75.                 optimizer.step()
  76.             # statistics
  77.             running_loss += loss.item() * inputs.size(0)
  78.             running_corrects += torch.sum(preds == labels.data)
  79.  
  80.         epoch_loss = running_loss / dataset_size['train']
  81.         epoch_acc = running_corrects.double() / dataset_size['train']
  82.  
  83.         print('Loss: {:.4f} Acc: {:.4f}'.format(epoch_loss, epoch_acc))
  84.  
  85.  
  86.  
  87.     time_elapsed = time.time() - since
  88.     print('Training complete in {:.0f}m {:.0f}s'.format(
  89.         time_elapsed // 60, time_elapsed % 60))
  90.  
  91.  
  92.  
  93.     return model
  94.  
  95.  
  96. ######################################################################
  97. # Finetuning the convnet
  98. # ----------------------
  99. #
  100. # Load a pretrained model and reset final fully connected layer.
  101. #
  102.  
  103. '''model_ft = models.resnet50(pretrained=True)
  104.  
  105. num_ftrs = model_ft.fc.in_features
  106. model_ft.fc = nn.Linear(num_ftrs, 2)
  107.  
  108. model_ft = model_ft.to(device)
  109.  
  110. criterion = nn.CrossEntropyLoss()
  111.  
  112. # Observe that all parameters are being optimized
  113. optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
  114.  
  115. # Decay LR by a factor of 0.1 every 7 epochs
  116. exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)'''
  117.  
  118.  
  119.  
  120. #model_ft = model_ft.cuda()
  121. nb_samples = 50
  122. nb_classes = 2
  123.  
  124.  
  125.  
  126. image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
  127.                                           data_transforms[x])
  128.                   for x in ['train']}
  129.  
  130. dataset_size = {x: len(image_datasets[x]) for x in ['train']}
  131. class_names = image_datasets['train'].classes
  132.  
  133. # LOOCV
  134. loocv_preds = []
  135. loocv_targets = []
  136. for idx in range(nb_samples):
  137.  
  138.     print('Using sample {} as test data'.format(idx))
  139.  
  140.     # Get all indices and remove test sample
  141.     train_indices = list(range(len(image_datasets['train'])))
  142.     del train_indices[idx]
  143.  
  144.     # Create new sampler
  145.     sampler = data.SubsetRandomSampler(train_indices)
  146.     print('sampler size: ', len(sampler))
  147.  
  148.     dataloader = data.DataLoader(
  149.         image_datasets['train'],
  150.         num_workers=2,
  151.         batch_size=1,
  152.         sampler=sampler
  153.     )
  154.  
  155.     # Train model
  156.     #for batch_idx, (sample, target) in enumerate(dataloader):
  157.     #print('Batch {}'.format(batch_idx))
  158.     model_ft = models.resnet50(pretrained=True)
  159.  
  160.     num_ftrs = model_ft.fc.in_features
  161.     model_ft.fc = nn.Linear(num_ftrs, 2)
  162.  
  163.     model_ft = model_ft.to(device)
  164.  
  165.     criterion = nn.CrossEntropyLoss()
  166.  
  167.     # Observe that all parameters are being optimized
  168.     optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)
  169.  
  170.     # Decay LR by a factor of 0.1 every 7 epochs
  171.     exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
  172.     model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, dataloader, num_epochs=25) # do I add this line here?
  173.  
  174.     # Test on LOO sample
  175.     model_ft.eval()
  176.     test_data, test_target = image_datasets['train'][idx]
  177.     test_data = test_data.cuda()
  178.     test_target = torch.tensor(test_target)
  179.     test_target = test_target.cuda()
  180.     test_data.unsqueeze_(0)
  181.     test_target.unsqueeze_(0)
  182.     output = model_ft(test_data)
  183.     pred = torch.argmax(output, 1)
  184.     loocv_preds.append(pred)
  185.     loocv_targets.append(test_target.item())
  186.  
  187.  
  188. print("loocv preds: ", loocv_preds)
  189. print("loocv targets: ", loocv_targets)
  190. print(accuracy_score(loocv_targets, loocv_preds))
  191. print(confusion_matrix(loocv_targets, loocv_preds))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement