%pylab inline
import torch
# Making sure we can find the data loader
import sys
sys.path.append('..')
sys.path.append('../..')
from data import load
# Let's load the dataset
train_data, train_label = load.get_dogs_and_cats_data(resize=(32,32), n_images=100)
input_size = 32*32*3
to_image = load.to_image_transform()
figure(figsize=(9,9))
# Plot the first 9 images (all cats)
for i, (data, label) in enumerate(zip(train_data[:9],train_label[:9])):
subplot(3,3,1+i)
imshow(to_image(data))
title('label = %d'%label)
axis('off')
class Network1(torch.nn.Module):
def __init__(self, n_hidden=100):
super().__init__()
self.linear1 = torch.nn.Linear(input_size, n_hidden)
self.activation = torch.nn.ReLU()
self.linear2 = torch.nn.Linear(n_hidden, 1)
def forward(self, x):
return self.linear2(self.activation(self.linear1(x.view(x.size(0), -1))))
# Create the network
net1 = Network1(100)
# Run an image through it
print( net1(train_data).view(-1).detach().numpy() )
class Network2(torch.nn.Module):
def __init__(self, *hidden_size):
super().__init__()
layers = []
# Add the hidden layers
n_in = input_size
for n_out in hidden_size:
layers.append(torch.nn.Linear(n_in, n_out))
layers.append(torch.nn.ReLU())
n_in = n_out
# Add the classifier
layers.append(torch.nn.Linear(n_out, 1))
self.network = torch.nn.Sequential(*layers)
def forward(self, x):
return self.network(x.view(x.size(0), -1))
# Create the network
net2 = Network2(100, 50, 50)
# Run an image through it
print( net2(train_data).view(-1).detach().numpy() )
plot( net2(train_data[train_label==0]).view(-1).detach().numpy(), '*', label='cats')
plot( net2(train_data[train_label==1]).view(-1).detach().numpy(), '*', label='dogs')
hlines(net2(train_data).mean(), 0, 50)
legend()