{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "00_pytorch_fundamentals_exercise_solutions.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "source": [ "# 00. PyTorch Fundamentals Exercise Solutions\n", "\n", "### 1. Documentation reading \n", "\n", "A big part of deep learning (and learning to code in general) is getting familiar with the documentation of a certain framework you're using. We'll be using the PyTorch documentation a lot throughout the rest of this course. So I'd recommend spending 10-minutes reading the following (it's okay if you don't get some things for now, the focus is not yet full understanding, it's awareness):\n", " * The documentation on [`torch.Tensor`](https://pytorch.org/docs/stable/tensors.html#torch-tensor).\n", " * The documentation on [`torch.cuda`](https://pytorch.org/docs/master/notes/cuda.html#cuda-semantics).\n", "\n" ], "metadata": { "id": "AzDBM_v4iMe7" } }, { "cell_type": "code", "source": [ "# No code solution (reading)" ], "metadata": { "id": "bGD0oD8Kizak" }, "execution_count": 1, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 2. Create a random tensor with shape `(7, 7)`.\n" ], "metadata": { "id": "__iXqqz-ioUJ" } }, { "cell_type": "code", "source": [ "# Import torch\n", "import torch \n", "\n", "# Create random tensor\n", "X = torch.rand(size=(7, 7))\n", "X, X.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6pUq9Dc8i2L7", "outputId": "0fefb85a-c3f7-4f8f-8ff7-cff485f7cc8d" }, "execution_count": 2, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor([[0.5656, 0.4012, 0.1987, 0.2464, 0.6861, 0.4953, 0.3433],\n", " [0.0032, 0.0228, 0.9020, 0.1267, 0.8009, 0.5274, 0.7453],\n", " [0.9123, 0.8138, 0.1667, 0.5998, 0.4657, 0.4473, 0.8367],\n", " [0.5302, 0.2213, 0.4747, 0.6485, 0.4770, 0.8675, 0.3054],\n", " [0.4226, 0.1398, 0.4495, 0.6974, 0.1808, 0.5872, 0.6931],\n", " [0.2153, 0.7517, 0.3505, 0.3815, 0.3244, 0.2511, 0.4269],\n", " [0.1158, 0.6696, 0.3733, 0.2633, 0.4102, 0.1101, 0.1613]]),\n", " torch.Size([7, 7]))" ] }, "metadata": {}, "execution_count": 2 } ] }, { "cell_type": "markdown", "source": [ "### 3. Perform a matrix multiplication on the tensor from 2 with another random tensor with shape `(1, 7)` (hint: you may have to transpose the second tensor)." ], "metadata": { "id": "9-XxvRLfiqkR" } }, { "cell_type": "code", "source": [ "# Create another random tensor\n", "Y = torch.rand(size=(1, 7))\n", "# Z = torch.matmul(X, Y) # will error because of shape issues\n", "Z = torch.matmul(X, Y.T) # no error because of transpose\n", "Z, Z.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NcLqR0Sbi_vT", "outputId": "c1bcc64c-5192-474f-dbb3-0ba7d8516a2e" }, "execution_count": 3, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor([[1.0888],\n", " [1.7506],\n", " [1.8468],\n", " [1.7496],\n", " [1.9022],\n", " [1.2684],\n", " [0.8617]]), torch.Size([7, 1]))" ] }, "metadata": {}, "execution_count": 3 } ] }, { "cell_type": "markdown", "source": [ "### 4. Set the random seed to `0` and do 2 & 3 over again.\n", "\n", "The output should be:\n", "```\n", "(tensor([[1.8542],\n", " [1.9611],\n", " [2.2884],\n", " [3.0481],\n", " [1.7067],\n", " [2.5290],\n", " [1.7989]]), torch.Size([7, 1]))\n", "```" ], "metadata": { "id": "eiutdKUFiryU" } }, { "cell_type": "code", "source": [ "# Set manual seed\n", "torch.manual_seed(0)\n", "\n", "# Create two random tensors\n", "X = torch.rand(size=(7, 7))\n", "Y = torch.rand(size=(1, 7))\n", "\n", "# Matrix multiply tensors\n", "Z = torch.matmul(X, Y.T)\n", "Z, Z.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "D-lOWI_1jRMm", "outputId": "7486a251-be91-4946-a31c-68e87a08ac86" }, "execution_count": 4, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor([[1.8542],\n", " [1.9611],\n", " [2.2884],\n", " [3.0481],\n", " [1.7067],\n", " [2.5290],\n", " [1.7989]]), torch.Size([7, 1]))" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "markdown", "source": [ "### 5. Speaking of random seeds, we saw how to set it with `torch.manual_seed()` but is there a GPU equivalent? (hint: you'll need to look into the documentation for `torch.cuda` for this one)\n", " * If there is, set the GPU random seed to `1234`." ], "metadata": { "id": "ezY6ks9Cis37" } }, { "cell_type": "code", "source": [ "# Set random seed on the GPU\n", "torch.cuda.manual_seed(1234)" ], "metadata": { "id": "_LKWcfSTjp00" }, "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "source": [ "\n", "### 6. Create two random tensors of shape `(2, 3)` and send them both to the GPU (you'll need access to a GPU for this). Set `torch.manual_seed(1234)` when creating the tensors (this doesn't have to be the GPU random seed). The output should be something like:\n", "\n", "```\n", "Device: cuda\n", "(tensor([[0.0290, 0.4019, 0.2598],\n", " [0.3666, 0.0583, 0.7006]], device='cuda:0'),\n", " tensor([[0.0518, 0.4681, 0.6738],\n", " [0.3315, 0.7837, 0.5631]], device='cuda:0'))\n", "```" ], "metadata": { "id": "Ir9qSaj6it4n" } }, { "cell_type": "code", "source": [ "# Set random seed\n", "torch.manual_seed(1234)\n", "\n", "# Check for access to GPU\n", "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", "print(f\"Device: {device}\")\n", "\n", "# Create two random tensors on GPU\n", "tensor_A = torch.rand(size=(2,3)).to(device)\n", "tensor_B = torch.rand(size=(2,3)).to(device)\n", "tensor_A, tensor_B" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "azXExiFZj5nm", "outputId": "12d8b85e-efc4-4541-f309-b2d1528ade05" }, "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Device: cuda\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "(tensor([[0.0290, 0.4019, 0.2598],\n", " [0.3666, 0.0583, 0.7006]], device='cuda:0'),\n", " tensor([[0.0518, 0.4681, 0.6738],\n", " [0.3315, 0.7837, 0.5631]], device='cuda:0'))" ] }, "metadata": {}, "execution_count": 6 } ] }, { "cell_type": "markdown", "source": [ "\n", "### 7. Perform a matrix multiplication on the tensors you created in 6 (again, you may have to adjust the shapes of one of the tensors).\n", "\n", "The output should look like:\n", "```\n", "(tensor([[0.3647, 0.4709],\n", " [0.5184, 0.5617]], device='cuda:0'), torch.Size([2, 2]))\n", "```" ], "metadata": { "id": "5TlAxeiSiu1y" } }, { "cell_type": "code", "source": [ "# Perform matmul on tensor_A and tensor_B\n", "# tensor_C = torch.matmul(tensor_A, tensor_B) # won't work because of shape error\n", "tensor_C = torch.matmul(tensor_A, tensor_B.T)\n", "tensor_C, tensor_C.shape" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fAeG7ox0lHEO", "outputId": "dec0db78-f280-4160-e45f-e85c80a9241b" }, "execution_count": 7, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor([[0.3647, 0.4709],\n", " [0.5184, 0.5617]], device='cuda:0'), torch.Size([2, 2]))" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "markdown", "source": [ "### 8. Find the maximum and minimum values of the output of 7." ], "metadata": { "id": "G7qfa5CSivwg" } }, { "cell_type": "code", "source": [ "# Find max\n", "max = torch.max(tensor_C)\n", "\n", "# Find min\n", "min = torch.min(tensor_C)\n", "max, min" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Fu8_3mZpllOd", "outputId": "3379333d-4661-411b-9426-fe587e1579f0" }, "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor(0.5617, device='cuda:0'), tensor(0.3647, device='cuda:0'))" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "markdown", "source": [ "### 9. Find the maximum and minimum index values of the output of 7." ], "metadata": { "id": "wrTj5FgNiw47" } }, { "cell_type": "code", "source": [ "# Find arg max\n", "arg_max = torch.argmax(tensor_C)\n", "\n", "# Find arg min\n", "arg_min = torch.argmin(tensor_C)\n", "arg_max, arg_min" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "CCEKt4K2lsfQ", "outputId": "dc8049b1-5686-4157-dc63-d30b94100a12" }, "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(tensor(3, device='cuda:0'), tensor(0, device='cuda:0'))" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "markdown", "source": [ "\n", "### 10. Make a random tensor with shape `(1, 1, 1, 10)` and then create a new tensor with all the `1` dimensions removed to be left with a tensor of shape `(10)`. Set the seed to `7` when you create it and print out the first tensor and it's shape as well as the second tensor and it's shape.\n", "\n", "The output should look like:\n", "\n", "```\n", "tensor([[[[0.5349, 0.1988, 0.6592, 0.6569, 0.2328, 0.4251, 0.2071, 0.6297,\n", " 0.3653, 0.8513]]]]) torch.Size([1, 1, 1, 10])\n", "tensor([0.5349, 0.1988, 0.6592, 0.6569, 0.2328, 0.4251, 0.2071, 0.6297, 0.3653,\n", " 0.8513]) torch.Size([10])\n", "```" ], "metadata": { "id": "hmeybz4uixy7" } }, { "cell_type": "code", "source": [ "# Set seed\n", "torch.manual_seed(7)\n", "\n", "# Create random tensor\n", "tensor_D = torch.rand(size=(1, 1, 1, 10))\n", "\n", "# Remove single dimensions\n", "tensor_E = tensor_D.squeeze()\n", "\n", "# Print out tensors\n", "print(tensor_D, tensor_D.shape)\n", "print(tensor_E, tensor_E.shape)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TQ9zbRzVl1jV", "outputId": "230bbe23-7662-464e-e485-d8aa9a5bad7f" }, "execution_count": 10, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "tensor([[[[0.5349, 0.1988, 0.6592, 0.6569, 0.2328, 0.4251, 0.2071, 0.6297,\n", " 0.3653, 0.8513]]]]) torch.Size([1, 1, 1, 10])\n", "tensor([0.5349, 0.1988, 0.6592, 0.6569, 0.2328, 0.4251, 0.2071, 0.6297, 0.3653,\n", " 0.8513]) torch.Size([10])\n" ] } ] } ] }