333 lines
9.5 KiB
Plaintext
333 lines
9.5 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"torch.Size([64, 10])\n",
|
|
"tensor([[9],\n",
|
|
" [9],\n",
|
|
" [9],\n",
|
|
" [9],\n",
|
|
" [9],\n",
|
|
" [5],\n",
|
|
" [9],\n",
|
|
" [5],\n",
|
|
" [2],\n",
|
|
" [9]])\n",
|
|
"Accuracy: 1.5625%\n",
|
|
"Epoch: 1 out of 30\n",
|
|
"Training Loss: 0.510\n",
|
|
"Test Loss: 0.454\n",
|
|
"Test Accuracy: 0.836\n",
|
|
"\n",
|
|
"Epoch: 2 out of 30\n",
|
|
"Training Loss: 0.389\n",
|
|
"Test Loss: 0.412\n",
|
|
"Test Accuracy: 0.852\n",
|
|
"\n",
|
|
"Epoch: 3 out of 30\n",
|
|
"Training Loss: 0.353\n",
|
|
"Test Loss: 0.388\n",
|
|
"Test Accuracy: 0.861\n",
|
|
"\n",
|
|
"Epoch: 4 out of 30\n",
|
|
"Training Loss: 0.330\n",
|
|
"Test Loss: 0.428\n",
|
|
"Test Accuracy: 0.847\n",
|
|
"\n",
|
|
"Epoch: 5 out of 30\n",
|
|
"Training Loss: 0.315\n",
|
|
"Test Loss: 0.381\n",
|
|
"Test Accuracy: 0.865\n",
|
|
"\n",
|
|
"Epoch: 6 out of 30\n",
|
|
"Training Loss: 0.303\n",
|
|
"Test Loss: 0.388\n",
|
|
"Test Accuracy: 0.864\n",
|
|
"\n",
|
|
"Epoch: 7 out of 30\n",
|
|
"Training Loss: 0.292\n",
|
|
"Test Loss: 0.364\n",
|
|
"Test Accuracy: 0.872\n",
|
|
"\n",
|
|
"Epoch: 8 out of 30\n",
|
|
"Training Loss: 0.281\n",
|
|
"Test Loss: 0.370\n",
|
|
"Test Accuracy: 0.869\n",
|
|
"\n",
|
|
"Epoch: 9 out of 30\n",
|
|
"Training Loss: 0.270\n",
|
|
"Test Loss: 0.365\n",
|
|
"Test Accuracy: 0.877\n",
|
|
"\n",
|
|
"Epoch: 10 out of 30\n",
|
|
"Training Loss: 0.267\n",
|
|
"Test Loss: 0.366\n",
|
|
"Test Accuracy: 0.877\n",
|
|
"\n",
|
|
"Epoch: 11 out of 30\n",
|
|
"Training Loss: 0.260\n",
|
|
"Test Loss: 0.369\n",
|
|
"Test Accuracy: 0.873\n",
|
|
"\n",
|
|
"Epoch: 12 out of 30\n",
|
|
"Training Loss: 0.254\n",
|
|
"Test Loss: 0.377\n",
|
|
"Test Accuracy: 0.876\n",
|
|
"\n",
|
|
"Epoch: 13 out of 30\n",
|
|
"Training Loss: 0.244\n",
|
|
"Test Loss: 0.369\n",
|
|
"Test Accuracy: 0.879\n",
|
|
"\n",
|
|
"Epoch: 14 out of 30\n",
|
|
"Training Loss: 0.243\n",
|
|
"Test Loss: 0.371\n",
|
|
"Test Accuracy: 0.879\n",
|
|
"\n",
|
|
"Epoch: 15 out of 30\n",
|
|
"Training Loss: 0.237\n",
|
|
"Test Loss: 0.377\n",
|
|
"Test Accuracy: 0.883\n",
|
|
"\n",
|
|
"Epoch: 16 out of 30\n",
|
|
"Training Loss: 0.230\n",
|
|
"Test Loss: 0.407\n",
|
|
"Test Accuracy: 0.874\n",
|
|
"\n",
|
|
"Epoch: 17 out of 30\n",
|
|
"Training Loss: 0.228\n",
|
|
"Test Loss: 0.370\n",
|
|
"Test Accuracy: 0.879\n",
|
|
"\n",
|
|
"Epoch: 18 out of 30\n",
|
|
"Training Loss: 0.221\n",
|
|
"Test Loss: 0.376\n",
|
|
"Test Accuracy: 0.878\n",
|
|
"\n",
|
|
"Epoch: 19 out of 30\n",
|
|
"Training Loss: 0.222\n",
|
|
"Test Loss: 0.376\n",
|
|
"Test Accuracy: 0.881\n",
|
|
"\n",
|
|
"Epoch: 20 out of 30\n",
|
|
"Training Loss: 0.217\n",
|
|
"Test Loss: 0.387\n",
|
|
"Test Accuracy: 0.880\n",
|
|
"\n",
|
|
"Epoch: 21 out of 30\n",
|
|
"Training Loss: 0.209\n",
|
|
"Test Loss: 0.401\n",
|
|
"Test Accuracy: 0.877\n",
|
|
"\n",
|
|
"Epoch: 22 out of 30\n",
|
|
"Training Loss: 0.210\n",
|
|
"Test Loss: 0.392\n",
|
|
"Test Accuracy: 0.883\n",
|
|
"\n",
|
|
"Epoch: 23 out of 30\n",
|
|
"Training Loss: 0.204\n",
|
|
"Test Loss: 0.411\n",
|
|
"Test Accuracy: 0.878\n",
|
|
"\n",
|
|
"Epoch: 24 out of 30\n",
|
|
"Training Loss: 0.202\n",
|
|
"Test Loss: 0.391\n",
|
|
"Test Accuracy: 0.882\n",
|
|
"\n",
|
|
"Epoch: 25 out of 30\n",
|
|
"Training Loss: 0.195\n",
|
|
"Test Loss: 0.392\n",
|
|
"Test Accuracy: 0.883\n",
|
|
"\n",
|
|
"Epoch: 26 out of 30\n",
|
|
"Training Loss: 0.195\n",
|
|
"Test Loss: 0.471\n",
|
|
"Test Accuracy: 0.878\n",
|
|
"\n",
|
|
"Epoch: 27 out of 30\n",
|
|
"Training Loss: 0.191\n",
|
|
"Test Loss: 0.431\n",
|
|
"Test Accuracy: 0.881\n",
|
|
"\n",
|
|
"Epoch: 28 out of 30\n",
|
|
"Training Loss: 0.195\n",
|
|
"Test Loss: 0.418\n",
|
|
"Test Accuracy: 0.882\n",
|
|
"\n",
|
|
"Epoch: 29 out of 30\n",
|
|
"Training Loss: 0.192\n",
|
|
"Test Loss: 0.390\n",
|
|
"Test Accuracy: 0.887\n",
|
|
"\n",
|
|
"Epoch: 30 out of 30\n",
|
|
"Training Loss: 0.185\n",
|
|
"Test Loss: 0.428\n",
|
|
"Test Accuracy: 0.875\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import torch\n",
|
|
"from torchvision import datasets, transforms\n",
|
|
"from torch import nn, optim\n",
|
|
"import torch.nn.functional as F\n",
|
|
"\n",
|
|
"# Define a transform to normalize the data\n",
|
|
"transform = transforms.Compose([transforms.ToTensor(),\n",
|
|
" transforms.Normalize((0.5, 0.5, 0.5),\n",
|
|
" (0.5, 0.5, 0.5))])\n",
|
|
"\n",
|
|
"# Download and load the training data\n",
|
|
"trainset = datasets.FashionMNIST(\n",
|
|
" '.pytorch/F_MNIST_data/', download=True, train=True, transform=transform)\n",
|
|
"\n",
|
|
"trainloader = torch.utils.data.DataLoader(\n",
|
|
" trainset, batch_size=64, shuffle=True)\n",
|
|
"\n",
|
|
"# Download and load the test data\n",
|
|
"testset = datasets.FashionMNIST(\n",
|
|
" '.pytorch/F_MNIST_data/', download=True, train=False,\n",
|
|
" transform=transform)\n",
|
|
"\n",
|
|
"testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)\n",
|
|
"\n",
|
|
"\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\n",
|
|
"\n",
|
|
"\n",
|
|
"model = Classifier()\n",
|
|
"\n",
|
|
"images, labels = next(iter(testloader))\n",
|
|
"\n",
|
|
"# Get the class probabilities\n",
|
|
"ps = torch.exp(model(images))\n",
|
|
"\n",
|
|
"# Make sure the shape is appropriate, we should get 10 class probabilities for\n",
|
|
"# 64 examples\n",
|
|
"print(ps.shape)\n",
|
|
"\n",
|
|
"top_p, top_class = ps.topk(1, dim=1)\n",
|
|
"# Look at the most likely classes for the first 10 examples\n",
|
|
"print(top_class[:10, :])\n",
|
|
"\n",
|
|
"\n",
|
|
"equals = top_class == labels.view(*top_class.shape)\n",
|
|
"\n",
|
|
"\n",
|
|
"accuracy = torch.mean(equals.type(torch.FloatTensor))\n",
|
|
"print(f'Accuracy: {accuracy.item()*100}%')\n",
|
|
"\n",
|
|
"\n",
|
|
"# Model begins\n",
|
|
"\n",
|
|
"model = Classifier()\n",
|
|
"criterion = nn.NLLLoss()\n",
|
|
"optimizer = optim.Adam(model.parameters(), lr=0.003)\n",
|
|
"\n",
|
|
"epochs = 30\n",
|
|
"steps = 0\n",
|
|
"\n",
|
|
"trainLosses, testLosses = [], []\n",
|
|
"for e in range(epochs):\n",
|
|
" runningLoss = 0\n",
|
|
" for images, labels in trainloader:\n",
|
|
"\n",
|
|
" optimizer.zero_grad()\n",
|
|
"\n",
|
|
" log_ps = model(images)\n",
|
|
" loss = criterion(log_ps, labels)\n",
|
|
" loss.backward()\n",
|
|
" optimizer.step()\n",
|
|
"\n",
|
|
" runningLoss += loss.item()\n",
|
|
"\n",
|
|
" else:\n",
|
|
" testLoss = 0\n",
|
|
" accuracy = 0\n",
|
|
"\n",
|
|
" # Turn off gradients for validation step\n",
|
|
" with torch.no_grad():\n",
|
|
" for images, labels in testloader:\n",
|
|
" # Get the output\n",
|
|
" log_ps = model(images)\n",
|
|
" # Get the loss\n",
|
|
" testLoss += criterion(log_ps, labels)\n",
|
|
"\n",
|
|
" # Get the probabilities\n",
|
|
" ps = torch.exp(log_ps)\n",
|
|
" # Get the most likely class for each prediction\n",
|
|
" top_p, top_class = ps.topk(1, dim=1)\n",
|
|
" # Check if the predictions match the actual label\n",
|
|
" equals = top_class == labels.view(*top_class.shape)\n",
|
|
" # Update accuracy\n",
|
|
" accuracy += torch.mean(equals.type(torch.FloatTensor))\n",
|
|
"\n",
|
|
" # Update train loss\n",
|
|
" trainLosses.append(runningLoss / len(trainloader))\n",
|
|
" # Update test loss\n",
|
|
" testLosses.append(testLoss / len(testloader))\n",
|
|
"\n",
|
|
" # Print output\n",
|
|
" print(f'Epoch: {e+1} out of {epochs}')\n",
|
|
" print(f'Training Loss: {runningLoss/len(trainloader):.3f}')\n",
|
|
" print(f'Test Loss: {testLoss/len(testloader):.3f}')\n",
|
|
" print(f'Test Accuracy: {accuracy/len(testloader):.3f}')\n",
|
|
" print()\n"
|
|
]
|
|
},
|
|
{
|
|
"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
|
|
}
|