Files
udacity/python/Deep Learning/Deep Learning with PyTorch/Part 4 - Fashion-MNIST (Exercises).ipynb

270 lines
36 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Classifying Fashion-MNIST\n",
"\n",
"Now it's your turn to build and train a neural network. You'll be using the [Fashion-MNIST dataset](https://github.com/zalandoresearch/fashion-mnist), a drop-in replacement for the MNIST dataset. MNIST is actually quite trivial with neural networks where you can easily achieve better than 97% accuracy. Fashion-MNIST is a set of 28x28 greyscale images of clothes. It's more complex than MNIST, so it's a better representation of the actual performance of your network, and a better representation of datasets you'll use in the real world.\n",
"\n",
"<img src='assets/fashion-mnist-sprite.png' width=500px>\n",
"\n",
"In this notebook, you'll build your own neural network. For the most part, you could just copy and paste the code from Part 3, but you wouldn't be learning. It's important for you to write the code yourself and get it to work. Feel free to consult the previous notebooks though as you work through this.\n",
"\n",
"First off, let's load the dataset through torchvision."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n",
"Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n",
"Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n",
"Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n",
"Processing...\n",
"Done!\n"
]
}
],
"source": [
"import torch\n",
"from torchvision import datasets, transforms\n",
"import helper\n",
"\n",
"# Define a transform to normalize the data\n",
"transform = transforms.Compose([transforms.ToTensor(),\n",
" transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n",
"# Download and load the training data\n",
"trainset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=True, transform=transform)\n",
"trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)\n",
"\n",
"# Download and load the test data\n",
"testset = datasets.FashionMNIST('~/.pytorch/F_MNIST_data/', download=True, train=False, transform=transform)\n",
"testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we can see one of the images."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fad8bf30668>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"image, label = next(iter(trainloader))\n",
"helper.imshow(image[0,:]);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building the network\n",
"\n",
"Here you should define your network. As with MNIST, each image is 28x28 which is a total of 784 pixels, and there are 10 classes. You should include at least one hidden layer. We suggest you use ReLU activations for the layers and to return the logits or log-softmax from the forward pass. It's up to you how many layers you add and the size of those layers."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# TODO: Define your network architecture here\n",
"\n",
"# Import modules\n",
"from torch import nn, optim\n",
"import torch.nn.functional as F"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"model = nn.Sequential(nn.Linear(784, 256),\n",
" nn.ReLU(),\n",
" nn.Linear(256, 128),\n",
" nn.ReLU(),\n",
" nn.Linear(128, 64),\n",
" nn.ReLU(),\n",
" nn.Linear(64, 10),\n",
" nn.LogSoftmax(dim=1))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Train the network\n",
"\n",
"Now you should create your network and train it. First you'll want to define [the criterion](http://pytorch.org/docs/master/nn.html#loss-functions) ( something like `nn.CrossEntropyLoss`) and [the optimizer](http://pytorch.org/docs/master/optim.html) (typically `optim.SGD` or `optim.Adam`).\n",
"\n",
"Then write the training code. Remember the training pass is a fairly straightforward process:\n",
"\n",
"* Make a forward pass through the network to get the logits \n",
"* Use the logits to calculate the loss\n",
"* Perform a backward pass through the network with `loss.backward()` to calculate the gradients\n",
"* Take a step with the optimizer to update the weights\n",
"\n",
"By adjusting the hyperparameters (hidden units, learning rate, etc), you should be able to get the training loss below 0.4."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"# TODO: Create the network, define the criterion and optimizer\n",
"criterion = nn.NLLLoss()\n",
"optimizer = optim.Adam(model.parameters(), lr=0.003)\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training loss: 0.5202356389940166\n",
"Training loss: 0.3878176898431422\n",
"Training loss: 0.3550535404860084\n",
"Training loss: 0.3305503525761272\n",
"Training loss: 0.31469793412000385\n"
]
}
],
"source": [
"# TODO: Train the network here\n",
"epochs = 5\n",
"\n",
"for e in range(epochs):\n",
" running_loss = 0\n",
" for image, label in trainloader:\n",
" # Flatten images\n",
" image = image.view(image.shape[0], -1)\n",
" \n",
" # Zero the gradients\n",
" optimizer.zero_grad()\n",
" \n",
" # Do a forward pass\n",
" log_ps = model.forward(image)\n",
" \n",
" # Calculate loss\n",
" loss = criterion(log_ps, label)\n",
" \n",
" # Do a backward pass to find gradients\n",
" loss.backward()\n",
" \n",
" # Update weights\n",
" optimizer.step()\n",
" \n",
" running_loss += loss.item()\n",
" else:\n",
" print(f'Training loss: {running_loss/len(trainloader)}')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fad51e31470>"
]
},
"metadata": {
"image/png": {
"height": 204,
"width": 423
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"%config InlineBackend.figure_format = 'retina'\n",
"\n",
"import helper\n",
"\n",
"# Test out your network!\n",
"\n",
"dataiter = iter(testloader)\n",
"images, labels = dataiter.next()\n",
"img = images[0]\n",
"# Convert 2D image to 1D vector\n",
"img = img.resize_(1, 784)\n",
"\n",
"# TODO: Calculate the class probabilities (softmax) for img\n",
"ps = torch.exp(model(img))\n",
"\n",
"# Plot the image and probabilities\n",
"helper.view_classify(img.resize_(1, 28, 28), ps, version='Fashion')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}