%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
import torch.nn.functional as F
from torchvision import datasets, transforms, models
from collections import OrderedDict
data_dir = 'Cat_Dog_data'
# Define transforms for the training data and testing data
train_transforms = transforms.Compose([transforms.RandomRotation(30),
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.Normalize([0.485, 0.456, 0.406],
test_transforms = transforms.Compose([transforms.Resize(255),
transforms.CenterCrop(224),
transforms.Normalize([0.485, 0.456, 0.406],
# Pass transforms in here, then run the next cell to see how the transforms look
train_data = datasets.ImageFolder(data_dir + '/train', transform=train_transforms)
test_data = datasets.ImageFolder(data_dir + '/test', transform=test_transforms)
trainloader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(test_data, batch_size=64)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = models.densenet121(pretrained=True)
for param in model.parameters():
param.requires_grad = False
model.classifier = nn.Sequential(OrderedDict([
('fc1', nn.Linear(1024, 500)),
('fc2', nn.Linear(500, 2)),
('output', nn.LogSoftmax(dim=1))
optimizer = optim.Adam(model.parameters(), lr=0.003)
train_losses, test_losses = [], []
for epoch in range(epochs):
for images, labels in trainloader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad() # clearing the gradients
loss = criterion(log_ps, labels)
running_loss += loss.item()
if steps %% print_every == 0:
model.eval() # set the network to evaluation mode
for images, labels in testloader:
images, labels = images.to(device), labels.to(device)
loss = criterion(logps, labels)
top_ps, top_class = ps.topk(1, dim=1)
equality = top_class == labels.view(*top_class,shape)
accuracy += torch.mean(equality.type(torch.FloatTensor)).item()
model.train() # back to training mode
print("Epoch: {}/{}.. ".format(e+1, epochs),
"Training Loss: {:.3f}.. ".format(running_loss/len(trainloader)),
"Test Loss: {:.3f}.. ".format(test_loss/len(testloader)),
"Test Accuracy: {:.3f}".format(accuracy/len(testloader)))