{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Getting started with pytorch.ipynb", "version": "0.3.2", "provenance": [], "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "[View in Colaboratory](https://colab.research.google.com/github/robmarkcole/robins-google-colaboratory/blob/master/Getting_started_with_pytorch.ipynb)" ] }, { "metadata": { "id": "WvAJ1Kbd1ndE", "colab_type": "text" }, "cell_type": "markdown", "source": [ "work through https://medium.com/@chsafouane/getting-started-with-pytorch-on-google-colab-811c59a656b6\n", "\n", "The good news about Colab is that Google offers a Tesla K80 GPU. One can keep working with the GPU instance continuously up to 12 hours\n", "\n", "We can also work through the tutorials on https://notebooks.azure.com/pytorch" ] }, { "metadata": { "id": "1QwG7zWq1qfx", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 326 }, "outputId": "28431e4e-3c2e-4d90-84da-73b7459d92c8" }, "cell_type": "code", "source": [ "!pip3 install torch torchvision" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Collecting torch\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/49/0e/e382bcf1a6ae8225f50b99cc26effa2d4cc6d66975ccf3fa9590efcbedce/torch-0.4.1-cp36-cp36m-manylinux1_x86_64.whl (519.5MB)\n", "\u001b[K 100% |████████████████████████████████| 519.5MB 34kB/s \n", "tcmalloc: large alloc 1073750016 bytes == 0x592c6000 @ 0x7fb7402bf1c4 0x46d6a4 0x5fcbcc 0x4c494d 0x54f3c4 0x553aaf 0x54e4c8 0x54f4f6 0x553aaf 0x54efc1 0x54f24d 0x553aaf 0x54efc1 0x54f24d 0x553aaf 0x54efc1 0x54f24d 0x551ee0 0x54e4c8 0x54f4f6 0x553aaf 0x54efc1 0x54f24d 0x551ee0 0x54efc1 0x54f24d 0x551ee0 0x54e4c8 0x54f4f6 0x553aaf 0x54e4c8\n", "\u001b[?25hCollecting torchvision\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/ca/0d/f00b2885711e08bd71242ebe7b96561e6f6d01fdb4b9dcf4d37e2e13c5e1/torchvision-0.2.1-py2.py3-none-any.whl (54kB)\n", "\u001b[K 100% |████████████████████████████████| 61kB 20.4MB/s \n", "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from torchvision) (1.14.6)\n", "Collecting pillow>=4.1.1 (from torchvision)\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/62/94/5430ebaa83f91cc7a9f687ff5238e26164a779cca2ef9903232268b0a318/Pillow-5.3.0-cp36-cp36m-manylinux1_x86_64.whl (2.0MB)\n", "\u001b[K 100% |████████████████████████████████| 2.0MB 4.2MB/s \n", "\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from torchvision) (1.11.0)\n", "Installing collected packages: torch, pillow, torchvision\n", " Found existing installation: Pillow 4.0.0\n", " Uninstalling Pillow-4.0.0:\n", " Successfully uninstalled Pillow-4.0.0\n", "Successfully installed pillow-5.3.0 torch-0.4.1 torchvision-0.2.1\n" ], "name": "stdout" } ] }, { "metadata": { "id": "aaTVSdM73mN4", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import torch" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "gw8o5hbI3vB3", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "14ab063a-2662-4909-f97b-4ced3e40bf7a" }, "cell_type": "code", "source": [ "torch.__version__" ], "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'0.4.1'" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "metadata": { "id": "jRDQNNjP7B1r", "colab_type": "text" }, "cell_type": "markdown", "source": [ "Lets follow the tutorials on pytorch https://pytorch.org/tutorials/\n", "\n", "WHAT IS PYTORCH?\n", "It’s a Python-based scientific computing package targeted at two sets of audiences:\n", "\n", "* A replacement for NumPy to use the power of GPUs\n", "* a deep learning research platform that provides maximum flexibility and speed" ] }, { "metadata": { "id": "4uB-qwjA7FoI", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 102 }, "outputId": "11662939-4a20-482a-c334-acf27e80f8e0" }, "cell_type": "code", "source": [ "x = torch.empty(5, 3)\n", "print(x)" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ "tensor([[0.0000, 0.0000, 0.0000],\n", " [0.0000, 0.0000, 0.0000],\n", " [0.0000, 0.0000, 0.0000],\n", " [0.0000, 0.0000, 0.0000],\n", " [0.0000, 0.0000, 0.0000]])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "q-2TXTw67LEV", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "d39af7fb-9e7e-4fd4-e1df-7b32c51d4f23" }, "cell_type": "code", "source": [ "print(x.size())" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "torch.Size([5, 3])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "8Ij9Ssm-7e8T", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 102 }, "outputId": "38011873-8090-409d-a297-2f8946dff9fd" }, "cell_type": "code", "source": [ "y = torch.rand(5, 3)\n", "print(x + y)" ], "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ "tensor([[0.9888, 0.9560, 0.8291],\n", " [0.9076, 0.0924, 0.8363],\n", " [0.7985, 0.8864, 0.9040],\n", " [0.4822, 0.3815, 0.0678],\n", " [0.8329, 0.6418, 0.4497]])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "6aq5eric7iH2", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "c7ec3133-9737-47a2-fc2a-76267d206b1a" }, "cell_type": "code", "source": [ "print(x[:, 1])" ], "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ "tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "0Yjwy_yI7o24", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "e62355e9-baed-4b10-a614-2b708395b123" }, "cell_type": "code", "source": [ "x = torch.randn(4, 4)\n", "y = x.view(16)\n", "z = x.view(-1, 8) # the size -1 is inferred from other dimensions\n", "print(x.size(), y.size(), z.size())" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "text": [ "torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "Z4rWBXgL7yA0", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Converting a Torch Tensor to a NumPy Array" ] }, { "metadata": { "id": "r8TmmW_J7r0F", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "f457d0ce-f5f0-4295-c12f-b5a64d358924" }, "cell_type": "code", "source": [ "a = torch.ones(5)\n", "print(a)" ], "execution_count": 10, "outputs": [ { "output_type": "stream", "text": [ "tensor([1., 1., 1., 1., 1.])\n" ], "name": "stdout" } ] }, { "metadata": { "id": "r0j8zX3B71qd", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "c3db637b-7932-4279-f1f4-0e29c55df461" }, "cell_type": "code", "source": [ "b = a.numpy()\n", "print(b)" ], "execution_count": 11, "outputs": [ { "output_type": "stream", "text": [ "[1. 1. 1. 1. 1.]\n" ], "name": "stdout" } ] }, { "metadata": { "id": "3j4CphMu8FBZ", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## CUDA TENSORS\n", "Tensors can be moved onto any device using the .to method." ] }, { "metadata": { "id": "qfwjj3KH73Qi", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 153 }, "outputId": "01435183-fe33-485e-abfe-acf2617ae5e4" }, "cell_type": "code", "source": [ "# let us run this cell only if CUDA is available\n", "# We will use ``torch.device`` objects to move tensors in and out of GPU\n", "if torch.cuda.is_available():\n", " device = torch.device(\"cuda\") # a CUDA device object\n", " y = torch.ones_like(x, device=device) # directly create a tensor on GPU\n", " x = x.to(device) # or just use strings ``.to(\"cuda\")``\n", " z = x + y\n", " print(z)\n", " print(z.to(\"cpu\", torch.double)) # ``.to`` can also change dtype together!" ], "execution_count": 12, "outputs": [ { "output_type": "stream", "text": [ "tensor([[-1.0558, 1.1853, 0.6714, -0.8438],\n", " [ 2.3848, 1.1295, 3.0584, 0.5120],\n", " [ 0.5200, 0.8300, 0.1142, 0.9183],\n", " [-1.1471, 0.4829, -0.0223, 0.5914]], device='cuda:0')\n", "tensor([[-1.0558, 1.1853, 0.6714, -0.8438],\n", " [ 2.3848, 1.1295, 3.0584, 0.5120],\n", " [ 0.5200, 0.8300, 0.1142, 0.9183],\n", " [-1.1471, 0.4829, -0.0223, 0.5914]], dtype=torch.float64)\n" ], "name": "stdout" } ] }, { "metadata": { "id": "skcqaxqJ8crD", "colab_type": "text" }, "cell_type": "markdown", "source": [ "CUDA is a parallel computing platform and application programming interface (API) model created by Nvidia.[1] It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) for general purpose processing " ] }, { "metadata": { "id": "rUzmblFf8d2t", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "BOD_JvSC8whi", "colab_type": "text" }, "cell_type": "markdown", "source": [ "## Training a classifier\n", "http://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html" ] }, { "metadata": { "id": "rozvjV2E8xQa", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import torchvision\n", "import torchvision.transforms as transforms" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "vyhKI3ir80Yf", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "c7588462-6caa-4977-ca63-f7b1d89add98" }, "cell_type": "code", "source": [ "transform = transforms.Compose(\n", " [transforms.ToTensor(),\n", " transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])\n", "\n", "trainset = torchvision.datasets.CIFAR10(root='./data', train=True,\n", " download=True, transform=transform)\n", "trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,\n", " shuffle=True, num_workers=2)\n", "\n", "testset = torchvision.datasets.CIFAR10(root='./data', train=False,\n", " download=True, transform=transform)\n", "testloader = torch.utils.data.DataLoader(testset, batch_size=4,\n", " shuffle=False, num_workers=2)\n", "\n", "classes = ('plane', 'car', 'bird', 'cat',\n", " 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')" ], "execution_count": 14, "outputs": [ { "output_type": "stream", "text": [ "Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz\n", "Files already downloaded and verified\n" ], "name": "stdout" } ] }, { "metadata": { "id": "ycniAEMs82vL", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "7623331e-f8c2-429b-83cc-f1ca3fb97098" }, "cell_type": "code", "source": [ "ls" ], "execution_count": 15, "outputs": [ { "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mdata\u001b[0m/ \u001b[01;34msample_data\u001b[0m/\n" ], "name": "stdout" } ] }, { "metadata": { "id": "hqY0kAKY86R-", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "8fee7a04-14f9-49ff-dfc6-40c3299600a0" }, "cell_type": "code", "source": [ "ls data/" ], "execution_count": 16, "outputs": [ { "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mcifar-10-batches-py\u001b[0m/ cifar-10-python.tar.gz\n" ], "name": "stdout" } ] }, { "metadata": { "id": "FtN7zIUK89OO", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "outputId": "9dc8e9db-c22b-4af7-a085-49bb9f78328b" }, "cell_type": "code", "source": [ "ls data/cifar-10-batches-py/" ], "execution_count": 17, "outputs": [ { "output_type": "stream", "text": [ "batches.meta data_batch_2 data_batch_4 readme.html\n", "data_batch_1 data_batch_3 data_batch_5 test_batch\n" ], "name": "stdout" } ] }, { "metadata": { "id": "cVjNocNM9CZn", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 155 }, "outputId": "cc5b9415-f9c8-4772-9097-26e711f6813a" }, "cell_type": "code", "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# functions to show an image\n", "\n", "\n", "def imshow(img):\n", " img = img / 2 + 0.5 # unnormalize\n", " npimg = img.numpy()\n", " plt.imshow(np.transpose(npimg, (1, 2, 0)))\n", "\n", "\n", "# get some random training images\n", "dataiter = iter(trainloader)\n", "images, labels = dataiter.next()\n", "\n", "# show images\n", "imshow(torchvision.utils.make_grid(images))\n", "# print labels\n", "print(' '.join('%5s' % classes[labels[j]] for j in range(4)))" ], "execution_count": 18, "outputs": [ { "output_type": "stream", "text": [ " bird horse horse ship\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\no6IAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "V_-_Q2-r9fYQ", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "from torch.autograd import Variable\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "\n", "\n", "class Net(nn.Module):\n", " def __init__(self):\n", " super(Net, self).__init__()\n", " self.conv1 = nn.Conv2d(3, 6, 5)\n", " self.pool = nn.MaxPool2d(2, 2)\n", " self.conv2 = nn.Conv2d(6, 16, 5)\n", " self.fc1 = nn.Linear(16 * 5 * 5, 120)\n", " self.fc2 = nn.Linear(120, 84)\n", " self.fc3 = nn.Linear(84, 10)\n", "\n", " def forward(self, x):\n", " x = self.pool(F.relu(self.conv1(x)))\n", " x = self.pool(F.relu(self.conv2(x)))\n", " x = x.view(-1, 16 * 5 * 5)\n", " x = F.relu(self.fc1(x))\n", " x = F.relu(self.fc2(x))\n", " x = self.fc3(x)\n", " return x\n", "\n", "\n", "net = Net()" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "BRvb1bgs97No", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "import torch.optim as optim\n", "\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "6ZfxGXiu99u1", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 275 }, "outputId": "aca0182a-07c6-4ee1-bc95-af8792de124c" }, "cell_type": "code", "source": [ "for epoch in range(2): # loop over the dataset multiple times\n", "\n", " running_loss = 0.0\n", " for i, data in enumerate(trainloader, 0):\n", " # get the inputs\n", " inputs, labels = data\n", "\n", " # wrap them in Variable\n", " inputs, labels = Variable(inputs), Variable(labels)\n", "\n", " # zero the parameter gradients\n", " optimizer.zero_grad()\n", "\n", " # forward + backward + optimize\n", " outputs = net(inputs)\n", " loss = criterion(outputs, labels)\n", " loss.backward()\n", " optimizer.step()\n", "\n", " # print statistics\n", " running_loss += loss.data[0]\n", " if i % 2000 == 1999: # print every 2000 mini-batches\n", " print('[%d, %5d] loss: %.3f' %\n", " (epoch + 1, i + 1, running_loss / 2000))\n", " running_loss = 0.0\n", "\n", "print('Finished Training')" ], "execution_count": 21, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:21: UserWarning: invalid index of a 0-dim tensor. This will be an error in PyTorch 0.5. Use tensor.item() to convert a 0-dim tensor to a Python number\n" ], "name": "stderr" }, { "output_type": "stream", "text": [ "[1, 2000] loss: 2.221\n", "[1, 4000] loss: 1.849\n", "[1, 6000] loss: 1.682\n", "[1, 8000] loss: 1.592\n", "[1, 10000] loss: 1.525\n", "[1, 12000] loss: 1.470\n", "[2, 2000] loss: 1.411\n", "[2, 4000] loss: 1.394\n", "[2, 6000] loss: 1.349\n", "[2, 8000] loss: 1.337\n", "[2, 10000] loss: 1.321\n", "[2, 12000] loss: 1.283\n", "Finished Training\n" ], "name": "stdout" } ] }, { "metadata": { "id": "7c0ACsPj9_hu", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "dataiter = iter(testloader)\n", "images, labels = dataiter.next()" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "AMHDAq1J-xGe", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 155 }, "outputId": "e80916a4-6af7-490c-9849-fd671c9de73f" }, "cell_type": "code", "source": [ "# print images\n", "imshow(torchvision.utils.make_grid(images))\n", "print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))" ], "execution_count": 24, "outputs": [ { "output_type": "stream", "text": [ "GroundTruth: cat ship ship plane\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "metadata": { "id": "PfNQC2LF-2LZ", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "outputs = net(Variable(images))" ], "execution_count": 0, "outputs": [] }, { "metadata": { "id": "FrgTbUiC-437", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "8af4ce97-7b72-4114-d810-6bfa8b954f4d" }, "cell_type": "code", "source": [ "_, predicted = torch.max(outputs.data, 1)\n", "\n", "print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]\n", " for j in range(4)))" ], "execution_count": 26, "outputs": [ { "output_type": "stream", "text": [ "Predicted: cat plane ship plane\n" ], "name": "stdout" } ] }, { "metadata": { "id": "hgHCoLuf-65v", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "47745b7f-1540-4137-96b6-5cd873d6e04e" }, "cell_type": "code", "source": [ "correct = 0\n", "total = 0\n", "for data in testloader:\n", " images, labels = data\n", " outputs = net(Variable(images))\n", " _, predicted = torch.max(outputs.data, 1)\n", " total += labels.size(0)\n", " correct += (predicted == labels).sum()\n", "\n", "print('Accuracy of the network on the 10000 test images: %d %%' % (\n", " 100 * correct / total))" ], "execution_count": 27, "outputs": [ { "output_type": "stream", "text": [ "Accuracy of the network on the 10000 test images: 55 %\n" ], "name": "stdout" } ] }, { "metadata": { "id": "NFle0hfs-9QI", "colab_type": "code", "colab": {} }, "cell_type": "code", "source": [ "" ], "execution_count": 0, "outputs": [] } ] }