243 lines
35 KiB
Plaintext
243 lines
35 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": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"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": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAADrCAYAAACICmHVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAACtBJREFUeJzt3clzFMYdxfGeGY00Go00aMFIQsuAAS1sCRgHbzlQ+XuT3OJyqlwVgzG2K8QYl7GRBEILEpKAGe27csmRfk1ZdpI38/1cHz1aiqc+/Kq7M0dHRwHA/7/s//obAPB2KCtggrICJigrYIKyAiYoK2CCsgImmt7mH936+CrD2DfI5XIyz2b138K9vb1f89v5r+nu6pZ5tfpa5geHh7/mt1M3Pr/zIKNydlbABGUFTFBWwARlBUxQVsAEZQVMUFbAxFvNWRvVn27dknmxWEx8ghybhaOj+Lzx1Ws9q1xbW5d5bbUm877eXplfHB+PZjMzs3Jtvjkv85WVFZl/8+23Mm9U7KyACcoKmKCsgAnKCpigrIAJygqYoKyAiYaes7a2tso816R/PU+np2Xe39cn8+7unmiWzeqzsj098bUhhPDF7dsy/+Sjj2W+vLwczVIz3HyTnrOeP3dO5o8nJqJZtVqVa+sZOytggrICJigrYIKyAiYoK2CCsgImGnp0M3LhgsxLbW0yHzh9Wubt7e0y39rajGbZrD5et7W1LfPxsTGZP3r0SObZXPzv+MHBgVzbe0ofv+s80Snzq5evRLN/3P5Crq1n7KyACcoKmKCsgAnKCpigrIAJygqYoKyAiYaes6auEk092djdrZ8+zGT0rHRufj6aTU1NybW9iatEz72rj6F1dHTI/O5Xd6PZ8NCwXNucuIo0dcRufUNfs9qo2FkBE5QVMEFZAROUFTBBWQETlBUwQVkBEw09Z20tFGSeyei/ZamnC4+OjmR+plKJZqMjI3Lt1JMnia8df04yhBCWl5dkXiqV4mtX4teUhhBCIfF7zeX0f7tLFy9Gs3/evy/X1jN2VsAEZQVMUFbABGUFTFBWwARlBUxQVsBEQ89Z+/v7j7VePdkYQgg7O/pu32Jr/DztprhTOIQQ+nr1c5J7e7syn0yclx0aHIpmJ0/qnzsxXg6Hh/re4RMnTkSzXE4/hZm609gZOytggrICJigrYIKyAiYoK2CCsgImGnp0o46BhRDC8rI+Cra1nXh2cXRU5ve+/iaapa7zHBgYkPnS0guZj4+Ny3xQfP5S4nhduaMs89RVoxMTk9GsnkczKeysgAnKCpigrIAJygqYoKyACcoKmKCsgIm6n7OqI1UbGxtyberJx9RZsJnZOZkvLC5EsyuXL8u1X96NP8kYQghjo2My7+09JXN11WlbW5tcm7qCNXWETn1vLc3Ncu3Orj4a6IydFTBBWQETlBUwQVkBE5QVMEFZAROUFTBR93PW1tbWaDYxMSHXps58ps7Dpp5l/OMnn0SzlZWXcu3g4KDMu7u7ZX77zh2Zd4rrQGurNbm2UGiReVOTvk60q7Mrml27dk2u/erePZk7Y2cFTFBWwARlBUxQVsAEZQVMUFbABGUFTNT9nLXQEp/5jYyMHOuzsxn9t64yPCzzpaX4vcTbiTuJ24r6TOnDHx7KfHhIf2+nxXOYPz9+LNceHh7KPOWxmH/PzMwc67OdsbMCJigrYIKyAiYoK2CCsgImKCtggrICJup+zlosFqPZ8sqKXJsJGZkvLMTv/Q0hhEqlonMxh11YXJRr55/Py1z93CGEsLa2JvOvvv46mqXOq87N6e+tX8xwQwghI37tHR0dcu388+cyd8bOCpigrIAJygqYoKyACcoKmKCsgIm6H92cOhV/PrA5r58PrFaric9+R+adnfHrPEMIYWIyfhSsvb1drh0eGpL5euo5SzUfCSGUy+X42pz+G7+7syPzxJcO58+dj2ZnEuOwRz/9pD/cGDsrYIKyAiYoK2CCsgImKCtggrICJigrYKLu56w7O7vRrL1dP9m4vb0l877ePpmnjtitr8dnoU+np+VaNQcNIYR3z56V+daWvur02cyzaHb+3Dm5tpKYAe/u7cv81etX0ex5HR+BS2FnBUxQVsAEZQVMUFbABGUFTFBWwARlBUzU/Zx1dm42ml25fEmuHRgYlPn9f92Xeers5bC4irRU0k86toinLENIX9lZKLTKfGExfs3qwoK+JnV3b0/mHYmzuvv78Tls6ueuZ+ysgAnKCpigrIAJygqYoKyACcoKmKCsgIm6n7OOjoxEs0JLQa5tasrJfGhQz2Gr1ZrM+/p6o9nF8Yty7U8/6/txFxdfyHxpeUnmGXG5b1dXl1zbnM/LPHUfc0/PyWjW2dkp19YzdlbABGUFTFBWwARlBUxQVsAEZQVMUFbARN3PWXPZ+Ky0WtPzPnWuMoQQSiV9LnNgYEDmL17EZ6HfPfhOrh0dGZX59LP4vb8h6N9LCCHceO96NJubn5drUwoFPd8ul+Nncf/26afH+trO2FkBE5QVMEFZAROUFTBBWQETlBUwUfejG6XcoZ9NnJ2bk/miGL2EEMK13/1e5l/evRvNPrh5U6598PB7maeu+3z//RsyV8fY1PG5EELI5fRYqFZb/cV5c3OzXFvP2FkBE5QVMEFZAROUFTBBWQETlBUwQVkBE3U/Z11di8/sNrc25drUlZurq3pe+PCHH2R+/Vr8GNr29rZc++rVa5mfPXNG5hMTkzJffBF/1nF8bEyurdX0FazFon5uMp+P/7dMXdGa+p07Y2cFTFBWwARlBUxQVsAEZQVMUFbABGUFTNT9nHVmdjaaVYYrcu36xrrMz57Vs8zUuc7NzS2R7cq1N//wvswnp6Zk3p64RvV0f380e/C9Pkv70YcfyfzevXsyPzqKZ0+ePpFr6xk7K2CCsgImKCtggrICJigrYIKyAiYoK2Aic6SGWv9x6+Or6X/UgG68957MR0dGZK7u303dWfzy5UuZN+f1/bqVyrDM1d29u7s7cm13d4/M//zXv8i8UX1+54G8kJmdFTBBWQETlBUwQVkBE5QVMEFZARN1f0Tut1QsFmV+cHAo88PDg2jW090t1w4PDclcHQ0MIYRqVV8XWq3Fn3x85+RJuTZ11Sh+GXZWwARlBUxQVsAEZQVMUFbABGUFTFBWwARz1mO4cV0fkXs280zmK+KYW74pL9cuLMSfZAwhhP7+Ppmnnow8U9HXrCrt7fqa03xe/2x7e3vRTB0rDCGEtzny6YqdFTBBWQETlBUwQVkBE5QVMEFZAROUFTDBnPUYJp/oZxVzWf3kY60WP1OamoN++MFNmXd1dcl8eWVF5pNTk9FMPQcZQgjLy/ocbz3PQn9L7KyACcoKmKCsgAnKCpigrIAJygqYoKyACeasx7C2tibzE+UTMr9y6XI0W99Yl2s3NjdlvrW1LfOW5haZq1loqVSSa9fX9fe+v78vc7wZOytggrICJigrYIKyAiYoK2CCsgImKCtggjnrMRzsx99XDSGEXE7/LTwQ77Nms3pta6Eg88ePJ2Te1dUp88uXLkWz1cR8uZyYLzfy3b/Hwc4KmKCsgAnKCpigrIAJygqYoKyACUY3x5C67rOjvUPmz2ZmollleFiuffkq/lxkCCFcuHBB5oMDp2X+dHo6mrWX9JOOu7u7Ms/l9BWtHKF7M3ZWwARlBUxQVsAEZQVMUFbABGUFTFBWwARz1mP47O+fybxcLsu8WCxGs8kp/ZxkU5OeVfae6pX5j49+lHk+n49mpba2xGc/kvlx5qiNfHyOnRUwQVkBE5QVMEFZAROUFTBBWQETlBUwkWnkuRXghJ0VMEFZAROUFTBBWQETlBUwQVkBE5QVMEFZARP/BhSuM9ofXfKHAAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"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": 6,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from torch import nn, optim\n",
|
|
"import torch.nn.functional as F"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# TODO: Define your network architecture here\n",
|
|
"class Classifier(nn.Module):\n",
|
|
" def __init__(self):\n",
|
|
" super().__init__()\n",
|
|
" self.fc1 = nn.Linear(784, 256)\n",
|
|
" self.fc2 = nn.Linear(256, 128)\n",
|
|
" self.fc3 = nn.Linear(128, 64)\n",
|
|
" self.fc4 = nn.Linear(64, 10)\n",
|
|
" \n",
|
|
" def forward(self, x):\n",
|
|
" # make sure input tensor is flattened\n",
|
|
" x = x.view(x.shape[0], -1)\n",
|
|
" \n",
|
|
" x = F.relu(self.fc1(x))\n",
|
|
" x = F.relu(self.fc2(x))\n",
|
|
" x = F.relu(self.fc3(x))\n",
|
|
" x = F.log_softmax(self.fc4(x), dim=1)\n",
|
|
" \n",
|
|
" return x"
|
|
]
|
|
},
|
|
{
|
|
"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` or `nn.NLLLoss`) 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": 13,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# TODO: Create the network, define the criterion and optimizer\n",
|
|
"model = Classifier()\n",
|
|
"criterion = nn.NLLLoss()\n",
|
|
"optimizer = optim.Adam(model.parameters(), lr=0.003)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Training loss: 283.4510831311345\n",
|
|
"Training loss: 274.7842669263482\n",
|
|
"Training loss: 267.907463490963\n",
|
|
"Training loss: 258.2156918346882\n",
|
|
"Training loss: 251.79347000271082\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# TODO: Train the network here\n",
|
|
"epochs = 5\n",
|
|
"\n",
|
|
"for e in range(epochs):\n",
|
|
" running_loss = 0\n",
|
|
" for images, labels in trainloader:\n",
|
|
" log_ps = model(images)\n",
|
|
" loss = criterion(log_ps, labels)\n",
|
|
" \n",
|
|
" optimizer.zero_grad()\n",
|
|
" loss.backward()\n",
|
|
" optimizer.step()\n",
|
|
" \n",
|
|
" running_loss += loss.item()\n",
|
|
" else:\n",
|
|
" print(f\"Training loss: {running_loss}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x648 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"image/png": {
|
|
"height": 204,
|
|
"width": 423
|
|
}
|
|
},
|
|
"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[1]\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, ps, version='Fashion')"
|
|
]
|
|
}
|
|
],
|
|
"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.6.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|