def main(): # Define network net = Net() print(net) data_transform = transforms.Compose( [Rescale(250), Normalize(), RandomCrop(224)]) train_dataset = FacialKeypointsDataset( csv_file='data/training_frames_keypoints.csv', root_dir='data/training/', transform=data_transform) # iterate through the transformed dataset and print some stats about the first few samples for i in range(4): sample = train_dataset[i] print(i, sample['image'].size, sample['keypoints'].size) train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True, num_workers=4) test_dataset = FacialKeypointsDataset( csv_file='data/test_frames_keypoints.csv', root_dir='data/test/', transform=data_transform) test_loader = DataLoader(test_dataset, batch_size=1, shuffle=True, num_workers=4) test_images, test_outputs, gt_pts = net_sample_output(net, test_loader) # print out the dimensions of the data to see if they make sense print(test_images.data.size()) print(test_outputs.data.size()) print(gt_pts.size()) # call it visualize_output(test_images, test_outputs, gt_pts, 1) criterion = nn.MSELoss() optimizer = optim.Adam(net.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8) n_epochs = 2 train_net(net, criterion, optimizer, train_loader, n_epochs) # get a sample of test data again test_images, test_outputs, gt_pts = net_sample_output(net, test_loader) print(test_images.data.size()) print(test_outputs.data.size()) print(gt_pts.size()) model_dir = 'saved_models/' model_name = 'keypoints_model_1.pt' # after training, save your model parameters in the dir 'saved_models' torch.save(net.state_dict(), model_dir + model_name) weights1 = net.conv1.weight.data w = weights1.numpy() filter_index = 0 print(w[filter_index][0]) print(w[filter_index][0].shape) # display the filter weights plt.imshow(w[filter_index][0], cmap='gray')
from torchvision import transforms, utils from torch.utils.data import Dataset, DataLoader from models import Net import torch.nn.functional as F import torch.nn as nn import torch import torchsnooper import matplotlib.pyplot as plt import numpy as np device = torch.device('cuda') net = Net() data_transform = transforms.Compose( [Rescale(256), RandomCrop(224), Normalize(), ToTensor()] ) train_dataset = FacialKeypointsDataset( "./data/training_frames_keypoints.csv", "./data/training", data_transform ) test_dataset = FacialKeypointsDataset( "./data/test_frames_keypoints.csv", "./data/test", data_transform )
running_loss += loss.item() if batch_i % 10 == 9: # print every 10 batches print('Epoch: {}, Batch: {}, Avg. Loss: {}'.format( epoch + 1, batch_i + 1, running_loss / 10)) running_loss = 0.0 print('Finished Training') if __name__ == "__main__": net = Net() # print(net) data_transform = transforms.Compose( [Rescale(225), RandomCrop(224), Normalize(), ToTensor()]) # create the transformed dataset transformed_dataset = FacialKeypointsDataset( csv_file='data/training_frames_keypoints.csv', root_dir='data/training/', transform=data_transform) print('Number of images: ', len(transformed_dataset)) # iterate through the transformed dataset and print some stats about the first few samples for i in range(4): sample = transformed_dataset[i] print(i, sample['image'].size(), sample['keypoints'].size())
# In[24]: from torch.utils.data import Dataset, DataLoader from torchvision import transforms, utils # the dataset we created in Notebook 1 is copied in the helper file `data_load.py` from data_load import FacialKeypointsDataset # the transforms we defined in Notebook 1 are ien the helper file `data_load.py` from data_load import Rescale, RandomCrop, Normalize, ToTensor ## define the data_transform using transforms.Compose([all tx's, . , .]) # order matters! i.e. rescaling should come before a smaller crop data_transform = None rescale = Rescale(100) crop = RandomCrop(50) data_transform = transforms.Compose( [Rescale(250), RandomCrop(224), Normalize(), ToTensor()]) # testing that you've defined a transform assert (data_transform is not None), 'Define a data_transform' # In[25]: # create the transformed dataset transformed_dataset = FacialKeypointsDataset( csv_file='/data/training_frames_keypoints.csv', root_dir='/data/training/', transform=data_transform) print('Number of images: ', len(transformed_dataset))
def run_epochs(config, checkpoint_path): print("CUDA is available: {}".format(torch.cuda.is_available())) # Define data loader: data preprocessing and augmentation # I use same procedures for all models that consumes imagenet-2012 dataset for simplicity imagenet_train_transform = transforms.Compose([ Rescale(256), RandomHorizontalFlip(0.5), RandomCrop(224), ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0), ToTensor(), # https://github.com/pytorch/examples/blob/master/imagenet/main.py#L195 # this is pre-calculated mean and std of imagenet dataset Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) imagenet_val_transform = transforms.Compose([ Rescale(256), CenterCrop(224), ToTensor(), Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) train_loader = initialize_train_loader(imagenet_train_transform, config) val_loader = initialize_val_loader(imagenet_val_transform, config) # Define the neural network. Model = config.get('model') model_params = config.get('model_params') if model_params is not None: net = Model(**model_params) else: net = Model() # transfer variables to GPU if present net.to(device=device) # Print the network structure given 3x32x32 input # need to put this before DataParallel to avoid "Expected more than 1 value per channel when training" error # https://github.com/pytorch/pytorch/issues/4534 summary(net, (3, 224, 224)) # Wrap it with DataParallel to train with multiple GPUs if torch.cuda.device_count() > 1: print("Using", torch.cuda.device_count(), "GPUs!") net = nn.DataParallel(net) # Define the loss function. CrossEntrophyLoss is the most common one for classification task. criterion = nn.CrossEntropyLoss() # Define the optimizer Optim = config.get('optimizer') optimizer = Optim( net.parameters(), **config.get('optimizer_params'), ) # Define the scheduler Sched = config.get('scheduler') scheduler = Sched( optimizer, **config.get('scheduler_params'), ) loggers = initialize_loggers() model_id = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime()) model_name = config.get('name') start_epoch = 1 if checkpoint_path is not None: net, optimizer, scheduler, loggers, start_epoch = load_checkpoint( checkpoint_path, net, optimizer, scheduler, loggers, ) validate(val_loader, net, criterion, 0, loggers) for epoch in range(start_epoch, config.get('total_epochs') + 1): train( train_loader, net, criterion, optimizer, epoch, loggers, ) val_loss, top1_acc, top5_acc = validate( val_loader, net, criterion, epoch, loggers, ) # for ReduceLROnPlateau scheduler, we need to use top1_acc as metric if isinstance(scheduler, optim.lr_scheduler.ReduceLROnPlateau): scheduler.step(top1_acc) else: scheduler.step() checkpoint_file = '{}-{}-epoch-{}.pt'.format( model_name, model_id, epoch, ) torch.save( { 'epoch': epoch, 'model': net.state_dict(), 'optimizer': optimizer.state_dict(), 'scheduler': scheduler.state_dict(), 'loggers': loggers, }, model_dir + checkpoint_file)
# As a note, should you want to perform data augmentation (which is optional in this project), and randomly rotate or shift these images, a square image size will be useful; rotating a 224x224 image by 90 degrees will result in the same shape of output. # In[4]: from torch.utils.data import Dataset, DataLoader from torchvision import transforms, utils # the dataset we created in Notebook 1 is copied in the helper file `data_load.py` from data_load import FacialKeypointsDataset # the transforms we defined in Notebook 1 are in the helper file `data_load.py` from data_load import Rescale, RandomCrop, Normalize, ToTensor ## TODO: define the data_transform using transforms.Compose([all tx's, . , .]) # order matters! i.e. rescaling should come before a smaller crop data_transform = transforms.Compose( [Rescale(250), RandomCrop(224), Normalize(), ToTensor()]) # testing that you've defined a transform assert (data_transform is not None), 'Define a data_transform' # In[5]: # create the transformed dataset transformed_dataset = FacialKeypointsDataset( csv_file='/data/training_frames_keypoints.csv', root_dir='/data/training/', transform=data_transform) print('Number of images: ', len(transformed_dataset))
net = Net().to(device) print(net) from torch.utils.data import Dataset, DataLoader from torchvision import transforms, utils # the dataset we created in Notebook 1 is copied in the helper file `data_load.py` #from data_load import FacialKeypointsDataset # the transforms we defined in Notebook 1 are in the helper file `data_load.py` from data_load import Rescale, RandomCrop, Normalize, ToTensor ## TODO: define the data_transform using transforms.Compose([all tx's, . , .]) # order matters! i.e. rescaling should come before a smaller crop data_transform = transforms.Compose( [Rescale(250), RandomCrop(200), Normalize(), ToTensor()]) # testing that you've defined a transform assert (data_transform is not None), 'Define a data_transform' # create the transformed dataset transformed_dataset = FacialKeypointsDataset( csv_file='./data/training_frames_keypoints.csv', root_dir='./data/training/', transform=data_transform) print('Number of images: ', len(transformed_dataset)) # iterate through the transformed dataset and print some stats about the first few samples for i in range(4):
# In[133]: from torch.utils.data import Dataset, DataLoader from torchvision import transforms, utils # the dataset we created in Notebook 1 is copied in the helper file `data_load.py` from data_load import FacialKeypointsDataset # the transforms we defined in Notebook 1 are in the helper file `data_load.py` from data_load import Rescale, RandomCrop, Normalize, ToTensor crop = 224 data_transform = transforms.Compose([Rescale(250), RandomCrop(crop), Normalize(crop), ToTensor()]) # testing that you've defined a transform assert(data_transform is not None), 'Define a data_transform' # In[134]: # create the transformed dataset transformed_dataset = FacialKeypointsDataset(csv_file='training_frames_keypoints.csv', root_dir='/home/tianbai/P1_Facial_Keypoints/data/training/', transform=data_transform)