diff --git a/.ipynb_checkpoints/07_convolutions-checkpoint.ipynb b/.ipynb_checkpoints/07_convolutions-checkpoint.ipynb index 62576d3e..c6872b30 100644 --- a/.ipynb_checkpoints/07_convolutions-checkpoint.ipynb +++ b/.ipynb_checkpoints/07_convolutions-checkpoint.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 25, - "id": "6afe94f8", + "execution_count": null, + "id": "55daf5fa", "metadata": {}, "outputs": [], "source": [ @@ -27,8 +27,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "b7d069d9", + "execution_count": null, + "id": "4a0094d8", "metadata": {}, "outputs": [ { @@ -40,7 +40,7 @@ " torch.Size([10000]))" ] }, - "execution_count": 12, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -54,13 +54,13 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "8ce96024", + "execution_count": null, + "id": "6dcbde43", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -80,13 +80,13 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "1c004d18", + "execution_count": null, + "id": "b12f70f4", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAANMElEQVR4nO3dX8ie9X3H8fdnJh7EOq1NnDEm/oEwcIOuLqQ6x8igKxqE9KAbelBFBg9KHa3Ug1BBj3qwHRRmFWNYpQqdbmDVOFI6K2W6A0UNiRoz19TJfEhonLqoROayfXfwXHYPj/eT58nvvu4/se8X3NzXdf1+9/X7+lM+uf6aVBWSdLJ+Y9IFSDo1GR6SmhgekpoYHpKaGB6SmhgekpqsGObHSc4B/g64CHgD+LOqendAvzeA94H/AY5X1aZhxpU0ecMeeWwHnqqqjcBT3fpi/riqfs/gkD4dhg2PbcAD3fIDwFeG3J+kU0SGecI0yX9W1dnz1t+tqs8O6PdvwLtAAfdV1c4T7HMGmOlWf7+5OEnLUlVp+d2S4ZHkp8B5A5puBx5YZnicX1WHkpwLPAn8RVU9vWRxic/OSyPWGh5LXjCtqi8t1pbkl0nWVtXhJGuBI4vs41D3fSTJo8BmYMnwkDS9hr3msQu4oVu+AXh8YYckZyQ58+Nl4MvAK0OOK2nChr3m8Tng74ENwL8Df1pV7yQ5H/ibqtqa5BLg0e4nK4C/rarvLHP/nrZIIzayax6TZHhIo9caHj5hKqmJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqUkv4ZHkqiSvJTmYZPuA9iS5q2t/KcllfYwraXKGDo8kpwH3AFcDlwLXJbl0QbergY3dZwa4d9hxJU1WH0cem4GDVfV6VX0EPAxsW9BnG/BgzXkWODvJ2h7GljQhfYTHOuDNeeuz3baT7SPpFLKih31kwLZq6DPXMZlh7tRG0hTrIzxmgfXz1i8ADjX0AaCqdgI7AZIMDBhJk9fHacvzwMYkFyc5HbgW2LWgzy7g+u6uy+XA0ao63MPYkiZk6COPqjqe5BbgJ8BpwP1VtT/JTV37DmA3sBU4CBwDbhx2XEmTlarpPTPwtEUavaoadE1yST5hKqmJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIalJL+GR5KokryU5mGT7gPYtSY4m2dt97uhjXEmTs2LYHSQ5DbgH+BNgFng+ya6qenVB12eq6pphx5M0Hfo48tgMHKyq16vqI+BhYFsP+5U0xYY+8gDWAW/OW58Fvjig3xVJ9gGHgNuqav+gnSWZAWYAzjrrLG699dYeSpQ0yH333df82z6OPDJgWy1Y3wNcWFWfB74HPLbYzqpqZ1VtqqpNq1at6qE8SaPQR3jMAuvnrV/A3NHFr1TVe1X1Qbe8G1iZZHUPY0uakD7C43lgY5KLk5wOXAvsmt8hyXlJ0i1v7sZ9u4exJU3I0Nc8qup4kluAnwCnAfdX1f4kN3XtO4CvAjcnOQ58CFxbVQtPbSSdQvq4YPrxqcjuBdt2zFu+G7i7j7EkTQefMJXUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNSkl/BIcn+SI0leWaQ9Se5KcjDJS0ku62NcSZPT15HHD4CrTtB+NbCx+8wA9/Y0rqQJ6SU8qupp4J0TdNkGPFhzngXOTrK2j7ElTca4rnmsA96ctz7bbfuEJDNJXkjywrFjx8ZSnKSTN67wyIBtNahjVe2sqk1VtWnVqlUjLktSq3GFxyywft76BcChMY0taQTGFR67gOu7uy6XA0er6vCYxpY0Aiv62EmSh4AtwOoks8CdwEqAqtoB7Aa2AgeBY8CNfYwraXJ6CY+qum6J9gK+3sdYkqaDT5hKamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhq0kt4JLk/yZEkryzSviXJ0SR7u88dfYwraXJ6+YuugR8AdwMPnqDPM1V1TU/jSZqwXo48qupp4J0+9iXp1NDXkcdyXJFkH3AIuK2q9g/qlGQGmAHYsGEDd9555xhLlH69PPHEE82/HdcF0z3AhVX1eeB7wGOLdayqnVW1qao2rVmzZkzlSTpZYwmPqnqvqj7olncDK5OsHsfYkkZjLOGR5Lwk6ZY3d+O+PY6xJY1GL9c8kjwEbAFWJ5kF7gRWAlTVDuCrwM1JjgMfAtdWVfUxtqTJ6CU8quq6JdrvZu5WrqRPCZ8wldTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1GTo8EiyPsnPkhxIsj/JNwb0SZK7khxM8lKSy4YdV9Jk9fEXXR8HvlVVe5KcCbyY5MmqenVen6uBjd3ni8C93bekU9TQRx5Vdbiq9nTL7wMHgHULum0DHqw5zwJnJ1k77NiSJqfXax5JLgK+ADy3oGkd8Oa89Vk+GTCSTiG9hUeSzwCPAN+sqvcWNg/4SS2yn5kkLyR54a233uqrPEk96yU8kqxkLjh+WFU/GtBlFlg/b/0C4NCgfVXVzqraVFWb1qxZ00d5kkagj7stAb4PHKiq7y7SbRdwfXfX5XLgaFUdHnZsSZPTx92WK4GvAS8n2dtt+zawAaCqdgC7ga3AQeAYcGMP40qaoKHDo6r+mcHXNOb3KeDrw44laXr4hKmkJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJkOHR5L1SX6W5ECS/Um+MaDPliRHk+ztPncMO66kyVrRwz6OA9+qqj1JzgReTPJkVb26oN8zVXVND+NJmgJDH3lU1eGq2tMtvw8cANYNu19J062PI49fSXIR8AXguQHNVyTZBxwCbquq/YvsYwaY6Vb/K8krfdY4pNXAf0y6iHmsZ2nTVtO01fPbrT9MVfVSQZLPAP8EfKeqfrSg7TeB/62qD5JsBf66qjYuY58vVNWmXgrsgfWc2LTVA9NX06epnl7utiRZCTwC/HBhcABU1XtV9UG3vBtYmWR1H2NLmow+7rYE+D5woKq+u0if87p+JNncjfv2sGNLmpw+rnlcCXwNeDnJ3m7bt4ENAFW1A/gqcHOS48CHwLW1vPOlnT3U1yfrObFpqwemr6ZPTT29XfOQ9OvFJ0wlNTE8JDWZmvBIck6SJ5P8vPv+7CL93kjycveY+wsjqOOqJK8lOZhk+4D2JLmra38pyWV919BQ09ge/09yf5Ijiz1/M6H5Waqmsb4escxXNsY2TyN7haSqpuID/BWwvVveDvzlIv3eAFaPqIbTgF8AlwCnA/uASxf02Qr8GAhwOfDciOdlOTVtAf5hTP+e/gi4DHhlkfaxzs8yaxrb/HTjrQUu65bPBP51kv8dLbOek56jqTnyALYBD3TLDwBfmUANm4GDVfV6VX0EPNzVNd824MGa8yxwdpK1E65pbKrqaeCdE3QZ9/wsp6axquW9sjG2eVpmPSdtmsLjt6rqMMz9wwLnLtKvgH9M8mL3KHuf1gFvzluf5ZOTvJw+464Jusf/k/w4ye+MsJ6ljHt+lmsi83OCVzYmMk/LeYVkuXPU67stS0nyU+C8AU23n8RurqyqQ0nOBZ5M8i/dnzx9yIBtC+9lL6dPn5Yz3h7gwvr/x/8fA5Z8/H9Exj0/yzGR+ele2XgE+GZVvbewecBPRjpPS9Rz0nM01iOPqvpSVf3ugM/jwC8/Pmzrvo8sso9D3fcR4FHmDuv7Mgusn7d+AXMv8p1snz4tOV5N1+P/456fJU1ifpZ6ZYMxz9MoXiGZptOWXcAN3fINwOMLOyQ5I3P/zxCSnAF8GejzrdvngY1JLk5yOnBtV9fCOq/vrpZfDhz9+HRrRJasKdP1+P+452dJ456fbqwTvrLBGOdpOfU0zdEorzqf5BXhzwFPAT/vvs/ptp8P7O6WL2HubsM+YD9w+wjq2Mrc1ehffLx/4Cbgpm45wD1d+8vApjHMzVI13dLNxz7gWeAPRljLQ8Bh4L+Z+9Pzz6dgfpaqaWzz0433h8ydgrwE7O0+Wyc1T8us56TnyMfTJTWZptMWSacQw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1KT/wMhVPCxUffoLAAAAABJRU5ErkJggg==\n", + "image/png": "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", "text/plain": [ "
" ] @@ -108,8 +108,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "9b512751", + "execution_count": null, + "id": "8b39fc7b", "metadata": {}, "outputs": [ { @@ -1359,10 +1359,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 41, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1374,8 +1374,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "201599f3", + "execution_count": null, + "id": "1d444a15", "metadata": {}, "outputs": [ { @@ -1384,7 +1384,7 @@ "tensor(2.9727)" ] }, - "execution_count": 44, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1395,8 +1395,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "0e193704", + "execution_count": null, + "id": "f1cb4e91", "metadata": {}, "outputs": [], "source": [ @@ -1406,8 +1406,8 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "4826efb0", + "execution_count": null, + "id": "c2bd22dc", "metadata": {}, "outputs": [ { @@ -1416,7 +1416,7 @@ "tensor(2.9727)" ] }, - "execution_count": 47, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1427,8 +1427,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "799284d1", + "execution_count": null, + "id": "4870e048", "metadata": {}, "outputs": [ { @@ -1445,13 +1445,13 @@ }, { "cell_type": "code", - "execution_count": 58, - "id": "62a2fa2b", + "execution_count": null, + "id": "76017cbb", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1470,8 +1470,8 @@ }, { "cell_type": "code", - "execution_count": 62, - "id": "39e7658c", + "execution_count": null, + "id": "8081ad48", "metadata": {}, "outputs": [ { @@ -3060,10 +3060,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 62, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3075,8 +3075,8 @@ }, { "cell_type": "code", - "execution_count": 64, - "id": "89726474", + "execution_count": null, + "id": "02eeb6cf", "metadata": {}, "outputs": [], "source": [ @@ -3089,13 +3089,13 @@ }, { "cell_type": "code", - "execution_count": 66, - "id": "aa716e4c", + "execution_count": null, + "id": "68bf1b32", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3113,7 +3113,7 @@ }, { "cell_type": "markdown", - "id": "2f90fdf4", + "id": "18ab6a2a", "metadata": {}, "source": [ "#### pytorch convolutions" @@ -3121,8 +3121,8 @@ }, { "cell_type": "code", - "execution_count": 77, - "id": "b462ccbb", + "execution_count": null, + "id": "f6a94319", "metadata": {}, "outputs": [ { @@ -3131,7 +3131,7 @@ "torch.Size([9, 676])" ] }, - "execution_count": 77, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3144,8 +3144,8 @@ }, { "cell_type": "code", - "execution_count": 78, - "id": "a0310425", + "execution_count": null, + "id": "40d124b2", "metadata": {}, "outputs": [ { @@ -3154,7 +3154,7 @@ "torch.Size([9])" ] }, - "execution_count": 78, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3166,8 +3166,8 @@ }, { "cell_type": "code", - "execution_count": 80, - "id": "6aa6d587", + "execution_count": null, + "id": "451f3f93", "metadata": {}, "outputs": [ { @@ -3176,7 +3176,7 @@ "torch.Size([676])" ] }, - "execution_count": 80, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3188,8 +3188,8 @@ }, { "cell_type": "code", - "execution_count": 83, - "id": "881c9d31", + "execution_count": null, + "id": "b813ddb0", "metadata": {}, "outputs": [ { @@ -3198,7 +3198,7 @@ "torch.Size([26, 26])" ] }, - "execution_count": 83, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3210,13 +3210,13 @@ }, { "cell_type": "code", - "execution_count": 84, - "id": "bae43b13", + "execution_count": null, + "id": "dab5fcc0", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP0AAAD4CAYAAAAn+OBPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPrklEQVR4nO3dX2xc5ZnH8d+D48SKHeKQhOCkDumWiJBE2rCy0ApWK1bVVpQb4KKrclFlJbSpUJFaqReL2ItyiVbbVr1YIaULarrqUlVqEVzAbhGqhFaICgMh5M+GhJA/TkL+yqnj/I+fvfCJahH7fY9nzpkZ5/l+JMvjeY7PeRjnx5mZ9533mLsLQBy3tbsBAK1F6IFgCD0QDKEHgiH0QDDzWnmw3t5e7+/vb+UhgVBGR0c1Pj5uqW2aCr2ZPSLpZ5K6JP2Hu7+Q2r6/v19PP/10M4cEkPDiiy9mt2n46b2ZdUn6d0nflLRe0pNmtr7R/QFojWZe0z8gab+7H3D3K5J+LemxatoCUJdmQr9K0pEpP48U9wHoYM2Efro3C26a02tmW8xs2MyGx8fHmzgcgCo0E/oRSYNTfv6KpGNf3sjdt7r7kLsP9fb2NnE4AFVoJvTvS1prZl81s/mSvi3p9WraAlCXhofs3P2amT0j6X80OWT3srvvqqwzALVoapze3d+Q9EZFvQBoAabhAsEQeiAYQg8EQ+iBYAg9EAyhB4Ih9EAwhB4IhtADwRB6IBhCDwRD6IFgCD0QDKEHgiH0QDAtvdgFyluwYEF2G7PkNQ00b17+zzswMJCs59Y1PHbsphXS2mJsbCxZP3z4cHYfixYtStYHBweT9dzfo1NwpgeCIfRAMIQeCIbQA8EQeiAYQg8EQ+iBYAg9EAyTc2rS09OTrC9ZsiRZv/3227PHGB0dTdYvX76c3Ud3d3d2m1tB7rGSpJGRkWT9ttvS58iVK1dmj5HbRyu0vwMALUXogWAIPRAMoQeCIfRAMIQeCIbQA8EwTl+Tu+++O1lfvXp1sn727NnsMcqMPaO8AwcOJOvunqz39/dnj9HX1zeblmrRVOjN7KCkMUnXJV1z96EqmgJQnyrO9H/n7qcr2A+AFuA1PRBMs6F3Sb83sw/MbMt0G5jZFjMbNrPh3CKLAOrX7NP7h9z9mJndKektM/s/d39n6gbuvlXSVklatWpV+p0QALVr6kzv7seK7yclvSrpgSqaAlCfhkNvZr1mtujGbUnfkLSzqsYA1KOZp/crJL1aLPA/T9J/uft/V9LVLWDp0qXJ+oYNG5L13bt3Z4+xd+/eZD33+fAy21Qxrrxw4cJkvbe3N7uPCxcuNNVD7vGWpI8++ihZ37VrV7J+//33Z48xp8fp3f2ApL+ssBcALcCQHRAMoQeCIfRAMIQeCIbQA8EQeiAYQg8EwyIaNcldaOLMmTPJ+tGjR7PHyC2iUWZCy/z585P1KiaTdHV1Jevr1q3L7uPSpUvJ+vbt25P1MheZmJiYaKreCReyKGNudAmgMoQeCIbQA8EQeiAYQg8EQ+iBYAg9EAzj9DU5dOhQsn79+vVkfWxsrMp2ZpS7gEMVFi9enKyvX78+u49Tp04l6zt27EjWy1w8JDevYfny5cl6brGQTsGZHgiG0APBEHogGEIPBEPogWAIPRAMoQeCYZy+JqdPp6/efe7cuaaPMW9e+s+XG1eWpOJiJQ3r7+/PbrNixYpkvaenp6keyshdqELKj9Pfd999yTrj9AA6EqEHgiH0QDCEHgiG0APBEHogGEIPBEPogWCYnNMmV69erf0Y3d3d2W1yk2tyE3xyF8uQ8pOI9u7dm91HblGS3KIjZS4esmDBgmR9cHAwWW92olOrZM/0ZvaymZ00s51T7rvDzN4ys33F9yX1tgmgKmWe3v9C0iNfuu9ZSW+7+1pJbxc/A5gDsqF393ckfXmBscckbStub5P0eLVtAahLo2/krXD345JUfL9zpg3NbIuZDZvZ8Pj4eIOHA1CV2t+9d/et7j7k7kO9vb11Hw5ARqOhP2FmA5JUfD9ZXUsA6tRo6F+XtLm4vVnSa9W0A6Bu2XF6M3tF0sOSlpnZiKQfSXpB0m/M7ClJhyV9q84m56Lc+HVufLzM+Pfo6Giyfv78+ew+ci+5cvUy8w1yC4aMjIxk97F79+5k/fDhw8l6mTH0e++9N1kfGBjI7mMuyIbe3Z+cofT1insB0AJMwwWCIfRAMIQeCIbQA8EQeiAYQg8EQ+iBYFhEowFlrsiydu3aZH3RokXJ+hdffDGrntolN0FIyl/t59SpU9l9vPfee8n6tWvXkvXc1WkkadmyZcl6V1dXdh9zAWd6IBhCDwRD6IFgCD0QDKEHgiH0QDCEHgiGcfoGlBmnzy3IkFuc4syZM7PqqVG5cfZcvYrFTt09u01ukYwLFy4k60888UT2GCtXrkzW58rFLHI40wPBEHogGEIPBEPogWAIPRAMoQeCIfRAMIzT1yQ39pyrl/k8/fHjx5P1vr6+7D6aHWfPXbRDkpYvX56sHzp0KLuP3EU1Ll++nKzPm5f/p15mm1sBZ3ogGEIPBEPogWAIPRAMoQeCIfRAMIQeCIbQA8HEmI1QsUuXLmW3+fTTT5P13MUurly5Mque2qXMhJYNGzYk63fddVd2H7nHKzdR6fz589ljRJE905vZy2Z20sx2TrnveTM7ambbi69H620TQFXKPL3/haRHprn/p+6+qfh6o9q2ANQlG3p3f0fS2Rb0AqAFmnkj7xkz21E8/V8y00ZmtsXMhs1suIpFFAE0p9HQvyjpa5I2STou6cczbejuW919yN2HcivAAqhfQ6F39xPuft3dJyT9XNID1bYFoC4Nhd7MBqb8+ISknTNtC6CzZAdZzewVSQ9LWmZmI5J+JOlhM9skySUdlPTd+lrsPGXG6ffu3Zus5xafyC0a0SkWL16c3Wbjxo3J+oEDB6pqByVkQ+/uT05z90s19AKgBZiGCwRD6IFgCD0QDKEHgiH0QDCEHgiG0APBsIjGNHILNoyNjWX3cebMmWQ9d0UWM8seI9dnFXKTiAYGBpJ1Sbp48WKyfvYsH+JsJc70QDCEHgiG0APBEHogGEIPBEPogWAIPRDMLTdOX2YdvuXLlyfruYUh3nzzzewxDh48mKwPDQ0l6/Pnz88eI6fMhSj6+vqS9XXr1iXrZcbpd+/e3VRdkiYmJpL13LyGMvMeouBMDwRD6IFgCD0QDKEHgiH0QDCEHgiG0APB3HLj9Pfcc092m9WrVyfrJ06cSNbLfP4793n63LhzFXJj8FJ+zkJPT0+yfu7cuewxhoeHk/WPP/44uw93T9Zzf9NWrD0wV3CmB4Ih9EAwhB4IhtADwRB6IBhCDwRD6IFgCD0QzC03OWft2rXZbXITeI4cOZKs5yaKSPnJIHNlUYfTp08n659//nl2H++++26yPj4+nt1HbvLNwoULk3Um5/xZ9kxvZoNm9gcz22Nmu8zs+8X9d5jZW2a2r/i+pP52ATSrzNP7a5J+6O73SfprSd8zs/WSnpX0truvlfR28TOADpcNvbsfd/cPi9tjkvZIWiXpMUnbis22SXq8ph4BVGhWb+SZ2RpJ90v6o6QV7n5cmvwfg6Q7Z/idLWY2bGbDZV67AahX6dCbWZ+k30r6gbv/qezvuftWdx9y96EyK9UCqFep0JtZtyYD/yt3/11x9wkzGyjqA5JO1tMigCqVeffeJL0kaY+7/2RK6XVJm4vbmyW9Vn17AKpWZpz+IUnfkfSJmW0v7ntO0guSfmNmT0k6LOlbtXQ4S9euXWt6m66urmR948aN2WPkFtHo7u7O7iPnypUryXqZ91AuX76crOcu2pEbxy/Tx2235Z9wrlmzJllftmxZss5Lyz/Lht7d/1fSTDNJvl5tOwDqxjRcIBhCDwRD6IFgCD0QDKEHgiH0QDC33OfpP/vss+w2ubHp3GezH3zwwewxDh06lKzv27cvWS9zEYmrV68m62XmAuT+Wy9evJisl1kXIHfRjdwYuyQNDAw03QcmcaYHgiH0QDCEHgiG0APBEHogGEIPBEPogWAIPRDMLTc5Z//+/dltRkdHk/XcRJDcIhu3knnz0v9E+vv7s/tYunRpsr5gwYLZtIQmcaYHgiH0QDCEHgiG0APBEHogGEIPBEPogWBuuXH63KIPknT06NFkPXdxhjvvnPZanS2XWySjp6cnu4/cAhdlxuExt3CmB4Ih9EAwhB4IhtADwRB6IBhCDwRD6IFgCD0QTHZyjpkNSvqlpLskTUja6u4/M7PnJf2TpFPFps+5+xt1NVqliYmJZP3s2bNN1cvo7e1tqg40qsyMvGuSfujuH5rZIkkfmNlbRe2n7v5v9bUHoGrZ0Lv7cUnHi9tjZrZH0qq6GwNQj1m9pjezNZLul/TH4q5nzGyHmb1sZkuqbg5A9UqH3sz6JP1W0g/c/U+SXpT0NUmbNPlM4Mcz/N4WMxs2s+HcB1kA1K9U6M2sW5OB/5W7/06S3P2Eu1939wlJP5f0wHS/6+5b3X3I3Yd4cwpov2zobfLC3y9J2uPuP5ly/9R1op+QtLP69gBUrcy79w9J+o6kT8xse3Hfc5KeNLNNklzSQUnfraE/ABUzd2/dwcxOSTo05a5lkk63rIHG0We15kKfc6FH6eY+73b35alfaGnobzq42bC7D7WtgZLos1pzoc+50KPUWJ9MwwWCIfRAMO0O/dY2H78s+qzWXOhzLvQoNdBnW1/TA2i9dp/pAbQYoQeCaVvozewRM9trZvvN7Nl29ZFjZgfN7BMz225mw+3u54biQ04nzWznlPvuMLO3zGxf8b2tH4Kaocfnzexo8XhuN7NH29lj0dOgmf3BzPaY2S4z+35xf6c9njP1OavHtC2v6c2sS9Knkv5e0oik9yU96e67W95MhpkdlDTk7h01UcPM/lbSeUm/dPeNxX3/Kumsu79Q/I90ibv/c4f1+Lyk8520DkMxpXxg6poRkh6X9I/qrMdzpj7/QbN4TNt1pn9A0n53P+DuVyT9WtJjbeplTnL3dyR9eQmfxyRtK25v0+Q/iLaZoceO4+7H3f3D4vaYpBtrRnTa4zlTn7PSrtCvknRkys8j6tyFOVzS783sAzPb0u5mMlYUi57cWPykMy66d7OOXYfhS2tGdOzj2czaFu0KvU1zX6eOHT7k7n8l6ZuSvlc8ZUXjSq3D0A7TrBnRkRpd2+KGdoV+RNLglJ+/IulYm3pJcvdjxfeTkl7VDOsGdIgTNz7yXHw/2eZ+blJ2HYZWm27NCHXg49nM2hY3tCv070taa2ZfNbP5kr4t6fU29TIjM+st3jCRmfVK+oY6e92A1yVtLm5vlvRaG3uZVieuwzDTmhHqsMezsrUt3L0tX5Ie1eQ7+J9J+pd29ZHp8S8kfVx87eqkPiW9osmnclc1+czpKUlLJb0taV/x/Y4O7PE/JX0iaYcmQzXQAY/l32jy5eUOSduLr0c78PGcqc9ZPaZMwwWCYUYeEAyhB4Ih9EAwhB4IhtADwRB6IBhCDwTz/1Yizp3qJjP8AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -3233,8 +3233,8 @@ }, { "cell_type": "code", - "execution_count": 92, - "id": "5518d0a6", + "execution_count": null, + "id": "77589cfb", "metadata": {}, "outputs": [ { @@ -3251,8 +3251,8 @@ }, { "cell_type": "code", - "execution_count": 94, - "id": "c6737193", + "execution_count": null, + "id": "14e07968", "metadata": {}, "outputs": [ { @@ -3269,8 +3269,8 @@ }, { "cell_type": "code", - "execution_count": 96, - "id": "8dfcc3ee", + "execution_count": null, + "id": "9b784e8f", "metadata": {}, "outputs": [ { @@ -3288,13 +3288,13 @@ }, { "cell_type": "code", - "execution_count": 97, - "id": "6b9afd5a", + "execution_count": null, + "id": "f460e283", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3316,13 +3316,13 @@ }, { "cell_type": "code", - "execution_count": 98, - "id": "b7afef34", + "execution_count": null, + "id": "a0e0d982", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAANmElEQVR4nO3df6jd9X3H8edrGv+IdVoXrWlM1UKYOMHVXVKdY2SsFg1C+ocM/aOKDK6KQgv1D6lg8Y/Btj8Ks4oxUKlC0f1hq2FL11kp1f6hMwlGjdaZOsFLQuP8EZUILtt7f9yv2+V6bu69n/O955zE5wMO9/vjc77vt58bXvme7/l+TaoKSVqu3xt3A5KOTYaHpCaGh6QmhoekJoaHpCaGh6QmJw7z5iSnA/8InAu8AfxVVb07YNwbwAfAfwNHqmpqmLqSxm/YM4/bgSeragPwZLe+kL+oqj82OKTjw7DhsQV4sFt+EPjGkMeTdIzIMHeYJnmvqk6bs/5uVX1+wLj/AN4FCri/qrYd5ZjTwDTAySef/Cfnn39+c3/Hu127do27hYm3du3acbcw0d577z0OHz6clvcues0jyS+AswbsumMZdS6rqv1JzgSeSPKbqnpq0MAuWLYBTE1N1c6dO5dR5rMlafqdf6bceOON425hot1///3N7100PKrqawvtS/K7JGur6kCStcDBBY6xv/t5MMlPgY3AwPCQdGwY9prHduD6bvl64PH5A5KcnOSUT5aBrwMvDVlX0pgNGx5/C1ye5DXg8m6dJF9MsqMb8wXg10n2AP8G/HNV/cuQdSWN2VD3eVTV28BfDti+H9jcLb8OXDRMHUmTxztMJTUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNeklPJJckeTVJPuS3D5gf5Lc3e1/IcnFfdSVND5Dh0eSE4B7gSuBC4Brk1wwb9iVwIbuNQ3cN2xdSePVx5nHRmBfVb1eVR8DjwBb5o3ZAjxUs54BTkuytofaksakj/BYB7w5Z32m27bcMZKOIX2ERwZsq4YxswOT6SQ7k+x86623hm5O0sroIzxmgPVz1s8G9jeMAaCqtlXVVFVNnXHGGT20J2kl9BEezwEbkpyX5CTgGmD7vDHbgeu6b10uAQ5V1YEeaksakxOHPUBVHUlyK/Bz4ATggaram+Smbv9WYAewGdgHHAZuGLaupPEaOjwAqmoHswExd9vWOcsF3NJHLUmTwTtMJTUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDXpJTySXJHk1ST7ktw+YP+mJIeSPN+97uyjrqTxOXHYAyQ5AbgXuByYAZ5Lsr2qXp439OmqumrYepImQx9nHhuBfVX1elV9DDwCbOnhuJIm2NBnHsA64M056zPAVweMuzTJHmA/cFtV7R10sCTTwDTAqaeeyl133dVDi8enqhp3CxMvybhbOG71ceYx6Lcz/0/1buCcqroI+AHw2EIHq6ptVTVVVVOrV6/uoT1JK6GP8JgB1s9ZP5vZs4v/U1XvV9WH3fIOYFWSNT3UljQmfYTHc8CGJOclOQm4Btg+d0CSs9KdPybZ2NV9u4faksZk6GseVXUkya3Az4ETgAeqam+Sm7r9W4GrgZuTHAE+Aq4pP7BLx7Q+Lph+8lFkx7xtW+cs3wPc00ctSZPBO0wlNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ16SU8kjyQ5GCSlxbYnyR3J9mX5IUkF/dRV9L49HXm8SPgiqPsvxLY0L2mgft6qitpTHoJj6p6CnjnKEO2AA/VrGeA05Ks7aO2pPEY1TWPdcCbc9Znum2fkmQ6yc4kOw8fPjyS5iQt36jCIwO21aCBVbWtqqaqamr16tUr3JakVqMKjxlg/Zz1s4H9I6otaQWMKjy2A9d137pcAhyqqgMjqi1pBZzYx0GSPAxsAtYkmQG+B6wCqKqtwA5gM7APOAzc0EddSePTS3hU1bWL7C/glj5qSZoM3mEqqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpSS/hkeSBJAeTvLTA/k1JDiV5vnvd2UddSePTyz90DfwIuAd46Chjnq6qq3qqJ2nMejnzqKqngHf6OJakY0NfZx5LcWmSPcB+4Laq2jtoUJJpYBrg1FNPHWF7x5677rpr3C1MvKoadwsTbWpqqvm9o7pguhs4p6ouAn4APLbQwKraVlVTVTW1evXqEbUnablGEh5V9X5Vfdgt7wBWJVkzitqSVsZIwiPJWUnSLW/s6r49itqSVkYv1zySPAxsAtYkmQG+B6wCqKqtwNXAzUmOAB8B15QfRqVjWi/hUVXXLrL/Hma/ypV0nPAOU0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU0MD0lNDA9JTQwPSU2GDo8k65P8MskrSfYm+daAMUlyd5J9SV5IcvGwdSWNVx//0PUR4DtVtTvJKcCuJE9U1ctzxlwJbOheXwXu635KOkYNfeZRVQeqane3/AHwCrBu3rAtwEM16xngtCRrh60taXx6veaR5FzgK8Cz83atA96csz7DpwNG0jGkt/BI8jngUeDbVfX+/N0D3lILHGc6yc4kOw8fPtxXe5J61kt4JFnFbHD8uKp+MmDIDLB+zvrZwP5Bx6qqbVU1VVVTq1ev7qM9SSugj29bAvwQeKWqvr/AsO3Add23LpcAh6rqwLC1JY1PH9+2XAZ8E3gxyfPdtu8CXwKoqq3ADmAzsA84DNzQQ11JYzR0eFTVrxl8TWPumAJuGbaWpMnhHaaSmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmhgekpoYHpKaGB6SmgwdHknWJ/llkleS7E3yrQFjNiU5lOT57nXnsHUljdeJPRzjCPCdqtqd5BRgV5InqurleeOerqqreqgnaQIMfeZRVQeqane3/AHwCrBu2ONKmmypqv4OlpwLPAVcWFXvz9m+CXgUmAH2A7dV1d4FjjENTHerFwIv9dbg8NYA/znuJuawn8VNWk+T1s8fVtUpLW/sLTySfA74FfA3VfWTeft+H/ifqvowyWbgH6pqwxKOubOqpnppsAf2c3ST1g9MXk/HUz+9fNuSZBWzZxY/nh8cAFX1flV92C3vAFYlWdNHbUnj0ce3LQF+CLxSVd9fYMxZ3TiSbOzqvj1sbUnj08e3LZcB3wReTPJ8t+27wJcAqmorcDVwc5IjwEfANbW0z0vbeuivT/ZzdJPWD0xeT8dNP71eMJX02eEdppKaGB6SmkxMeCQ5PckTSV7rfn5+gXFvJHmxu8195wr0cUWSV5PsS3L7gP1Jcne3/4UkF/fdQ0NPI7v9P8kDSQ4mGXj/zZjmZ7GeRvp4xBIf2RjZPK3YIyRVNREv4O+B27vl24G/W2DcG8CaFerhBOC3wJeBk4A9wAXzxmwGfgYEuAR4doXnZSk9bQL+aUS/pz8HLgZeWmD/SOdniT2NbH66emuBi7vlU4B/H+efoyX2s+w5mpgzD2AL8GC3/CDwjTH0sBHYV1WvV9XHwCNdX3NtAR6qWc8ApyVZO+aeRqaqngLeOcqQUc/PUnoaqVraIxsjm6cl9rNskxQeX6iqAzD7HwucucC4Av41ya7uVvY+rQPenLM+w6cneSljRt0TwKVJ9iT5WZI/WsF+FjPq+VmqscxP98jGV4Bn5+0ayzwdpR9Y5hz1cZ/HkiX5BXDWgF13LOMwl1XV/iRnAk8k+U33N08fMmDb/O+ylzKmT0uptxs4p/7/9v/HgEVv/18ho56fpRjL/HSPbDwKfLvmPOv1ye4Bb1nReVqkn2XP0UjPPKrqa1V14YDX48DvPjlt634eXOAY+7ufB4GfMnta35cZYP2c9bOZfZBvuWP6tGi9mqzb/0c9P4sax/ws9sgGI56nlXiEZJI+tmwHru+Wrwcenz8gycmZ/X+GkORk4Ov0+9Ttc8CGJOclOQm4putrfp/XdVfLLwEOffJxa4Us2lMm6/b/Uc/PokY9P12toz6ywQjnaSn9NM3RSl51XuYV4T8AngRe636e3m3/IrCjW/4ys9827AH2AnesQB+bmb0a/dtPjg/cBNzULQe4t9v/IjA1grlZrKdbu/nYAzwD/OkK9vIwcAD4L2b/9vzrCZifxXoa2fx09f6M2Y8gLwDPd6/N45qnJfaz7Dny9nRJTSbpY4ukY4jhIamJ4SGpieEhqYnhIamJ4SGpieEhqcn/Ag4eCFYYYA6XAAAAAElFTkSuQmCC\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3344,8 +3344,8 @@ }, { "cell_type": "code", - "execution_count": 99, - "id": "57a0d450", + "execution_count": null, + "id": "568b97b7", "metadata": {}, "outputs": [ { @@ -3354,7 +3354,7 @@ "torch.Size([16, 1, 28, 28])" ] }, - "execution_count": 99, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3366,8 +3366,8 @@ }, { "cell_type": "code", - "execution_count": 102, - "id": "bdcbcdc1", + "execution_count": null, + "id": "03193437", "metadata": {}, "outputs": [], "source": [ @@ -3376,8 +3376,8 @@ }, { "cell_type": "code", - "execution_count": 104, - "id": "90c29af9", + "execution_count": null, + "id": "0b6d13f8", "metadata": {}, "outputs": [ { @@ -3386,7 +3386,7 @@ "torch.Size([16, 4, 26, 26])" ] }, - "execution_count": 104, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3398,8 +3398,8 @@ }, { "cell_type": "code", - "execution_count": 105, - "id": "9686a085", + "execution_count": null, + "id": "3ca60c96", "metadata": {}, "outputs": [ { @@ -3408,7 +3408,7 @@ "torch.Size([4, 26, 26])" ] }, - "execution_count": 105, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3420,13 +3420,13 @@ }, { "cell_type": "code", - "execution_count": 111, - "id": "88bf3727", + "execution_count": null, + "id": "f5a8985c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3446,7 +3446,7 @@ }, { "cell_type": "markdown", - "id": "0c251361", + "id": "467ae9b6", "metadata": {}, "source": [ "#### creating cnn" @@ -3454,8 +3454,8 @@ }, { "cell_type": "code", - "execution_count": 112, - "id": "fcbec44f", + "execution_count": null, + "id": "cf0e45f0", "metadata": {}, "outputs": [], "source": [ @@ -3466,8 +3466,8 @@ }, { "cell_type": "code", - "execution_count": 113, - "id": "75d14702", + "execution_count": null, + "id": "16e9c4d4", "metadata": {}, "outputs": [], "source": [ @@ -3480,8 +3480,8 @@ }, { "cell_type": "code", - "execution_count": 114, - "id": "89306ea8", + "execution_count": null, + "id": "12529f80", "metadata": {}, "outputs": [ { @@ -3490,7 +3490,7 @@ "torch.Size([16, 10, 28, 28])" ] }, - "execution_count": 114, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3501,8 +3501,8 @@ }, { "cell_type": "code", - "execution_count": 116, - "id": "89ec520d", + "execution_count": null, + "id": "6bdffe9c", "metadata": {}, "outputs": [], "source": [ @@ -3515,8 +3515,8 @@ }, { "cell_type": "code", - "execution_count": 118, - "id": "3d96b24c", + "execution_count": null, + "id": "79d87539", "metadata": {}, "outputs": [], "source": [ @@ -3532,8 +3532,8 @@ }, { "cell_type": "code", - "execution_count": 119, - "id": "80fd787b", + "execution_count": null, + "id": "88cf190b", "metadata": {}, "outputs": [ { @@ -3542,7 +3542,7 @@ "torch.Size([16, 10])" ] }, - "execution_count": 119, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3554,7 +3554,7 @@ { "cell_type": "code", "execution_count": null, - "id": "88a31682", + "id": "2a613910", "metadata": {}, "outputs": [], "source": [] @@ -3562,21 +3562,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "python3", "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.9.7" } }, "nbformat": 4, diff --git a/07_convolutions.ipynb b/07_convolutions.ipynb index 62576d3e..c6872b30 100644 --- a/07_convolutions.ipynb +++ b/07_convolutions.ipynb @@ -2,8 +2,8 @@ "cells": [ { "cell_type": "code", - "execution_count": 25, - "id": "6afe94f8", + "execution_count": null, + "id": "55daf5fa", "metadata": {}, "outputs": [], "source": [ @@ -27,8 +27,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "b7d069d9", + "execution_count": null, + "id": "4a0094d8", "metadata": {}, "outputs": [ { @@ -40,7 +40,7 @@ " torch.Size([10000]))" ] }, - "execution_count": 12, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -54,13 +54,13 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "8ce96024", + "execution_count": null, + "id": "6dcbde43", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -80,13 +80,13 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "1c004d18", + "execution_count": null, + "id": "b12f70f4", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ8AAAD8CAYAAABpXiE9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAANMElEQVR4nO3dX8ie9X3H8fdnJh7EOq1NnDEm/oEwcIOuLqQ6x8igKxqE9KAbelBFBg9KHa3Ug1BBj3qwHRRmFWNYpQqdbmDVOFI6K2W6A0UNiRoz19TJfEhonLqoROayfXfwXHYPj/eT58nvvu4/se8X3NzXdf1+9/X7+lM+uf6aVBWSdLJ+Y9IFSDo1GR6SmhgekpoYHpKaGB6SmhgekpqsGObHSc4B/g64CHgD+LOqendAvzeA94H/AY5X1aZhxpU0ecMeeWwHnqqqjcBT3fpi/riqfs/gkD4dhg2PbcAD3fIDwFeG3J+kU0SGecI0yX9W1dnz1t+tqs8O6PdvwLtAAfdV1c4T7HMGmOlWf7+5OEnLUlVp+d2S4ZHkp8B5A5puBx5YZnicX1WHkpwLPAn8RVU9vWRxic/OSyPWGh5LXjCtqi8t1pbkl0nWVtXhJGuBI4vs41D3fSTJo8BmYMnwkDS9hr3msQu4oVu+AXh8YYckZyQ58+Nl4MvAK0OOK2nChr3m8Tng74ENwL8Df1pV7yQ5H/ibqtqa5BLg0e4nK4C/rarvLHP/nrZIIzayax6TZHhIo9caHj5hKqmJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqUkv4ZHkqiSvJTmYZPuA9iS5q2t/KcllfYwraXKGDo8kpwH3AFcDlwLXJbl0QbergY3dZwa4d9hxJU1WH0cem4GDVfV6VX0EPAxsW9BnG/BgzXkWODvJ2h7GljQhfYTHOuDNeeuz3baT7SPpFLKih31kwLZq6DPXMZlh7tRG0hTrIzxmgfXz1i8ADjX0AaCqdgI7AZIMDBhJk9fHacvzwMYkFyc5HbgW2LWgzy7g+u6uy+XA0ao63MPYkiZk6COPqjqe5BbgJ8BpwP1VtT/JTV37DmA3sBU4CBwDbhx2XEmTlarpPTPwtEUavaoadE1yST5hKqmJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIalJL+GR5KokryU5mGT7gPYtSY4m2dt97uhjXEmTs2LYHSQ5DbgH+BNgFng+ya6qenVB12eq6pphx5M0Hfo48tgMHKyq16vqI+BhYFsP+5U0xYY+8gDWAW/OW58Fvjig3xVJ9gGHgNuqav+gnSWZAWYAzjrrLG699dYeSpQ0yH333df82z6OPDJgWy1Y3wNcWFWfB74HPLbYzqpqZ1VtqqpNq1at6qE8SaPQR3jMAuvnrV/A3NHFr1TVe1X1Qbe8G1iZZHUPY0uakD7C43lgY5KLk5wOXAvsmt8hyXlJ0i1v7sZ9u4exJU3I0Nc8qup4kluAnwCnAfdX1f4kN3XtO4CvAjcnOQ58CFxbVQtPbSSdQvq4YPrxqcjuBdt2zFu+G7i7j7EkTQefMJXUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNSkl/BIcn+SI0leWaQ9Se5KcjDJS0ku62NcSZPT15HHD4CrTtB+NbCx+8wA9/Y0rqQJ6SU8qupp4J0TdNkGPFhzngXOTrK2j7ElTca4rnmsA96ctz7bbfuEJDNJXkjywrFjx8ZSnKSTN67wyIBtNahjVe2sqk1VtWnVqlUjLktSq3GFxyywft76BcChMY0taQTGFR67gOu7uy6XA0er6vCYxpY0Aiv62EmSh4AtwOoks8CdwEqAqtoB7Aa2AgeBY8CNfYwraXJ6CY+qum6J9gK+3sdYkqaDT5hKamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhqYnhIamJ4SGpieEhq0kt4JLk/yZEkryzSviXJ0SR7u88dfYwraXJ6+YuugR8AdwMPnqDPM1V1TU/jSZqwXo48qupp4J0+9iXp1NDXkcdyXJFkH3AIuK2q9g/qlGQGmAHYsGEDd9555xhLlH69PPHEE82/HdcF0z3AhVX1eeB7wGOLdayqnVW1qao2rVmzZkzlSTpZYwmPqnqvqj7olncDK5OsHsfYkkZjLOGR5Lwk6ZY3d+O+PY6xJY1GL9c8kjwEbAFWJ5kF7gRWAlTVDuCrwM1JjgMfAtdWVfUxtqTJ6CU8quq6JdrvZu5WrqRPCZ8wldTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1MTwkNTE8JDUxPCQ1GTo8EiyPsnPkhxIsj/JNwb0SZK7khxM8lKSy4YdV9Jk9fEXXR8HvlVVe5KcCbyY5MmqenVen6uBjd3ni8C93bekU9TQRx5Vdbiq9nTL7wMHgHULum0DHqw5zwJnJ1k77NiSJqfXax5JLgK+ADy3oGkd8Oa89Vk+GTCSTiG9hUeSzwCPAN+sqvcWNg/4SS2yn5kkLyR54a233uqrPEk96yU8kqxkLjh+WFU/GtBlFlg/b/0C4NCgfVXVzqraVFWb1qxZ00d5kkagj7stAb4PHKiq7y7SbRdwfXfX5XLgaFUdHnZsSZPTx92WK4GvAS8n2dtt+zawAaCqdgC7ga3AQeAYcGMP40qaoKHDo6r+mcHXNOb3KeDrw44laXr4hKmkJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJoaHpCaGh6QmhoekJkOHR5L1SX6W5ECS/Um+MaDPliRHk+ztPncMO66kyVrRwz6OA9+qqj1JzgReTPJkVb26oN8zVXVND+NJmgJDH3lU1eGq2tMtvw8cANYNu19J062PI49fSXIR8AXguQHNVyTZBxwCbquq/YvsYwaY6Vb/K8krfdY4pNXAf0y6iHmsZ2nTVtO01fPbrT9MVfVSQZLPAP8EfKeqfrSg7TeB/62qD5JsBf66qjYuY58vVNWmXgrsgfWc2LTVA9NX06epnl7utiRZCTwC/HBhcABU1XtV9UG3vBtYmWR1H2NLmow+7rYE+D5woKq+u0if87p+JNncjfv2sGNLmpw+rnlcCXwNeDnJ3m7bt4ENAFW1A/gqcHOS48CHwLW1vPOlnT3U1yfrObFpqwemr6ZPTT29XfOQ9OvFJ0wlNTE8JDWZmvBIck6SJ5P8vPv+7CL93kjycveY+wsjqOOqJK8lOZhk+4D2JLmra38pyWV919BQ09ge/09yf5Ijiz1/M6H5Waqmsb4escxXNsY2TyN7haSqpuID/BWwvVveDvzlIv3eAFaPqIbTgF8AlwCnA/uASxf02Qr8GAhwOfDciOdlOTVtAf5hTP+e/gi4DHhlkfaxzs8yaxrb/HTjrQUu65bPBP51kv8dLbOek56jqTnyALYBD3TLDwBfmUANm4GDVfV6VX0EPNzVNd824MGa8yxwdpK1E65pbKrqaeCdE3QZ9/wsp6axquW9sjG2eVpmPSdtmsLjt6rqMMz9wwLnLtKvgH9M8mL3KHuf1gFvzluf5ZOTvJw+464Jusf/k/w4ye+MsJ6ljHt+lmsi83OCVzYmMk/LeYVkuXPU67stS0nyU+C8AU23n8RurqyqQ0nOBZ5M8i/dnzx9yIBtC+9lL6dPn5Yz3h7gwvr/x/8fA5Z8/H9Exj0/yzGR+ele2XgE+GZVvbewecBPRjpPS9Rz0nM01iOPqvpSVf3ugM/jwC8/Pmzrvo8sso9D3fcR4FHmDuv7Mgusn7d+AXMv8p1snz4tOV5N1+P/456fJU1ifpZ6ZYMxz9MoXiGZptOWXcAN3fINwOMLOyQ5I3P/zxCSnAF8GejzrdvngY1JLk5yOnBtV9fCOq/vrpZfDhz9+HRrRJasKdP1+P+452dJ456fbqwTvrLBGOdpOfU0zdEorzqf5BXhzwFPAT/vvs/ptp8P7O6WL2HubsM+YD9w+wjq2Mrc1ehffLx/4Cbgpm45wD1d+8vApjHMzVI13dLNxz7gWeAPRljLQ8Bh4L+Z+9Pzz6dgfpaqaWzz0433h8ydgrwE7O0+Wyc1T8us56TnyMfTJTWZptMWSacQw0NSE8NDUhPDQ1ITw0NSE8NDUhPDQ1KT/wMhVPCxUffoLAAAAABJRU5ErkJggg==\n", + "image/png": "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", "text/plain": [ "
" ] @@ -108,8 +108,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "9b512751", + "execution_count": null, + "id": "8b39fc7b", "metadata": {}, "outputs": [ { @@ -1359,10 +1359,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 41, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1374,8 +1374,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "201599f3", + "execution_count": null, + "id": "1d444a15", "metadata": {}, "outputs": [ { @@ -1384,7 +1384,7 @@ "tensor(2.9727)" ] }, - "execution_count": 44, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1395,8 +1395,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "0e193704", + "execution_count": null, + "id": "f1cb4e91", "metadata": {}, "outputs": [], "source": [ @@ -1406,8 +1406,8 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "4826efb0", + "execution_count": null, + "id": "c2bd22dc", "metadata": {}, "outputs": [ { @@ -1416,7 +1416,7 @@ "tensor(2.9727)" ] }, - "execution_count": 47, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1427,8 +1427,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "799284d1", + "execution_count": null, + "id": "4870e048", "metadata": {}, "outputs": [ { @@ -1445,13 +1445,13 @@ }, { "cell_type": "code", - "execution_count": 58, - "id": "62a2fa2b", + "execution_count": null, + "id": "76017cbb", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1470,8 +1470,8 @@ }, { "cell_type": "code", - "execution_count": 62, - "id": "39e7658c", + "execution_count": null, + "id": "8081ad48", "metadata": {}, "outputs": [ { @@ -3060,10 +3060,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 62, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3075,8 +3075,8 @@ }, { "cell_type": "code", - "execution_count": 64, - "id": "89726474", + "execution_count": null, + "id": "02eeb6cf", "metadata": {}, "outputs": [], "source": [ @@ -3089,13 +3089,13 @@ }, { "cell_type": "code", - "execution_count": 66, - "id": "aa716e4c", + "execution_count": null, + "id": "68bf1b32", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3113,7 +3113,7 @@ }, { "cell_type": "markdown", - "id": "2f90fdf4", + "id": "18ab6a2a", "metadata": {}, "source": [ "#### pytorch convolutions" @@ -3121,8 +3121,8 @@ }, { "cell_type": "code", - "execution_count": 77, - "id": "b462ccbb", + "execution_count": null, + "id": "f6a94319", "metadata": {}, "outputs": [ { @@ -3131,7 +3131,7 @@ "torch.Size([9, 676])" ] }, - "execution_count": 77, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3144,8 +3144,8 @@ }, { "cell_type": "code", - "execution_count": 78, - "id": "a0310425", + "execution_count": null, + "id": "40d124b2", "metadata": {}, "outputs": [ { @@ -3154,7 +3154,7 @@ "torch.Size([9])" ] }, - "execution_count": 78, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3166,8 +3166,8 @@ }, { "cell_type": "code", - "execution_count": 80, - "id": "6aa6d587", + "execution_count": null, + "id": "451f3f93", "metadata": {}, "outputs": [ { @@ -3176,7 +3176,7 @@ "torch.Size([676])" ] }, - "execution_count": 80, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3188,8 +3188,8 @@ }, { "cell_type": "code", - "execution_count": 83, - "id": "881c9d31", + "execution_count": null, + "id": "b813ddb0", "metadata": {}, "outputs": [ { @@ -3198,7 +3198,7 @@ "torch.Size([26, 26])" ] }, - "execution_count": 83, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3210,13 +3210,13 @@ }, { "cell_type": "code", - "execution_count": 84, - "id": "bae43b13", + "execution_count": null, + "id": "dab5fcc0", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3233,8 +3233,8 @@ }, { "cell_type": "code", - "execution_count": 92, - "id": "5518d0a6", + "execution_count": null, + "id": "77589cfb", "metadata": {}, "outputs": [ { @@ -3251,8 +3251,8 @@ }, { "cell_type": "code", - "execution_count": 94, - "id": "c6737193", + "execution_count": null, + "id": "14e07968", "metadata": {}, "outputs": [ { @@ -3269,8 +3269,8 @@ }, { "cell_type": "code", - "execution_count": 96, - "id": "8dfcc3ee", + "execution_count": null, + "id": "9b784e8f", "metadata": {}, "outputs": [ { @@ -3288,13 +3288,13 @@ }, { "cell_type": "code", - "execution_count": 97, - "id": "6b9afd5a", + "execution_count": null, + "id": "f460e283", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3316,13 +3316,13 @@ }, { "cell_type": "code", - "execution_count": 98, - "id": "b7afef34", + "execution_count": null, + "id": "a0e0d982", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3344,8 +3344,8 @@ }, { "cell_type": "code", - "execution_count": 99, - "id": "57a0d450", + "execution_count": null, + "id": "568b97b7", "metadata": {}, "outputs": [ { @@ -3354,7 +3354,7 @@ "torch.Size([16, 1, 28, 28])" ] }, - "execution_count": 99, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3366,8 +3366,8 @@ }, { "cell_type": "code", - "execution_count": 102, - "id": "bdcbcdc1", + "execution_count": null, + "id": "03193437", "metadata": {}, "outputs": [], "source": [ @@ -3376,8 +3376,8 @@ }, { "cell_type": "code", - "execution_count": 104, - "id": "90c29af9", + "execution_count": null, + "id": "0b6d13f8", "metadata": {}, "outputs": [ { @@ -3386,7 +3386,7 @@ "torch.Size([16, 4, 26, 26])" ] }, - "execution_count": 104, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3398,8 +3398,8 @@ }, { "cell_type": "code", - "execution_count": 105, - "id": "9686a085", + "execution_count": null, + "id": "3ca60c96", "metadata": {}, "outputs": [ { @@ -3408,7 +3408,7 @@ "torch.Size([4, 26, 26])" ] }, - "execution_count": 105, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3420,13 +3420,13 @@ }, { "cell_type": "code", - "execution_count": 111, - "id": "88bf3727", + "execution_count": null, + "id": "f5a8985c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -3446,7 +3446,7 @@ }, { "cell_type": "markdown", - "id": "0c251361", + "id": "467ae9b6", "metadata": {}, "source": [ "#### creating cnn" @@ -3454,8 +3454,8 @@ }, { "cell_type": "code", - "execution_count": 112, - "id": "fcbec44f", + "execution_count": null, + "id": "cf0e45f0", "metadata": {}, "outputs": [], "source": [ @@ -3466,8 +3466,8 @@ }, { "cell_type": "code", - "execution_count": 113, - "id": "75d14702", + "execution_count": null, + "id": "16e9c4d4", "metadata": {}, "outputs": [], "source": [ @@ -3480,8 +3480,8 @@ }, { "cell_type": "code", - "execution_count": 114, - "id": "89306ea8", + "execution_count": null, + "id": "12529f80", "metadata": {}, "outputs": [ { @@ -3490,7 +3490,7 @@ "torch.Size([16, 10, 28, 28])" ] }, - "execution_count": 114, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3501,8 +3501,8 @@ }, { "cell_type": "code", - "execution_count": 116, - "id": "89ec520d", + "execution_count": null, + "id": "6bdffe9c", "metadata": {}, "outputs": [], "source": [ @@ -3515,8 +3515,8 @@ }, { "cell_type": "code", - "execution_count": 118, - "id": "3d96b24c", + "execution_count": null, + "id": "79d87539", "metadata": {}, "outputs": [], "source": [ @@ -3532,8 +3532,8 @@ }, { "cell_type": "code", - "execution_count": 119, - "id": "80fd787b", + "execution_count": null, + "id": "88cf190b", "metadata": {}, "outputs": [ { @@ -3542,7 +3542,7 @@ "torch.Size([16, 10])" ] }, - "execution_count": 119, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -3554,7 +3554,7 @@ { "cell_type": "code", "execution_count": null, - "id": "88a31682", + "id": "2a613910", "metadata": {}, "outputs": [], "source": [] @@ -3562,21 +3562,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "python3", "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.9.7" } }, "nbformat": 4, diff --git a/README.md b/README.md index 46dbeb7c..adb1dcfc 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ -## Deep Learning Portal 🔥 -This repository contains implementation code for important research papers and starter guides for common deep learning tools. + + +This repository contains implementation code for important research +papers and starter guides for common deep learning tools. + + diff --git a/_proc/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb b/_proc/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb new file mode 100644 index 00000000..9a8b0f07 --- /dev/null +++ b/_proc/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb @@ -0,0 +1,2140 @@ +{ + "cells": [ + { + "cell_type": "raw", + "id": "9f17a925", + "metadata": {}, + "source": [ + "---\n", + "output-file: mini_batch_training.html\n", + "title: simple 2 layer nn\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "f90b06b8", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b0863e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(torch.Size([50000, 784]),\n", + " torch.Size([50000]),\n", + " torch.Size([10000, 784]),\n", + " torch.Size([10000]))" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_path = Path('data/mnist.pkl.gz')\n", + "with gzip.open(data_path, 'r') as f:\n", + " ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') \n", + "x_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))\n", + "x_train.shape, y_train.shape, x_test.shape, y_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ede327b7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = x_train[0]\n", + "img = img.view(28, 28)\n", + "plt.imshow(img);\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "406daad9", + "metadata": {}, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " def __init__(self, n_in, n_h, n_o):\n", + " super().__init__()\n", + " self.layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]\n", + " \n", + " def __call__(self, x):\n", + " for l in self.layers:\n", + " x = l(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2f3649f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50000, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_in = x_train.shape[1]\n", + "n_h = 50\n", + "n_o = 10\n", + "\n", + "model = Model(n_in, n_h, n_o)\n", + "pred = model(x_train)\n", + "pred.shape" + ] + }, + { + "cell_type": "markdown", + "id": "c187f981", + "metadata": {}, + "source": [ + "```python\n", + "# cross entropy loss\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84804a8f", + "metadata": {}, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return (x.exp()/x.exp().sum(-1, keepdim=True)).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea765bfa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "6b923b92", + "metadata": {}, + "source": [ + "```python\n", + "# log product to sum trick\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1f31278", + "metadata": {}, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - x.exp().sum(-1, keepdim=True).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a69a4cf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "a3a224d0", + "metadata": {}, + "source": [ + "```python\n", + "# log sum exp trick\n", + "* normalize with the maximum value, so avoid exploding big activations.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20df0377", + "metadata": {}, + "outputs": [], + "source": [ + "def logsumexp(x):\n", + " m = x.max(-1)[-1]\n", + " return m + (x-m[:,None]).exp().sum(-1).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ae6ab2e", + "metadata": {}, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - logsumexp(x)[:,None]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc21ccc6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "75899b88", + "metadata": {}, + "source": [ + "```python\n", + "# pytorch logsumexp function\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6b7ad06", + "metadata": {}, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - x.logsumexp(-1, keepdim=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02f8c028", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "24919556", + "metadata": {}, + "source": [ + "```python\n", + "# negative log likeliehood\n", + "* for one hot input vector, it simplifies to the following formula.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33be78c3", + "metadata": {}, + "outputs": [], + "source": [ + "def nll(inp, targ):\n", + " return - inp[range(targ.shape[0]), targ].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc5bb9c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sm_pred = log_softmax(pred)\n", + "loss = nll(sm_pred, y_train)\n", + "loss" + ] + }, + { + "cell_type": "markdown", + "id": "9b4ef97b", + "metadata": {}, + "source": [ + "```python\n", + "# compare it with native pytorch implementation of nll.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0edec9c1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_pytorch = F.nll_loss(F.log_softmax(pred, -1), y_train)\n", + "loss_pytorch" + ] + }, + { + "cell_type": "markdown", + "id": "121d1820", + "metadata": {}, + "source": [ + "```python\n", + "# nll and softmax combined implementation.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "082907a1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_pytorch = F.cross_entropy(pred, y_train)\n", + "loss_pytorch" + ] + }, + { + "cell_type": "markdown", + "id": "c23e9883", + "metadata": {}, + "source": [ + "```python\n", + "# batch training.\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "56e4978c", + "metadata": {}, + "source": [ + "```python\n", + "# accuracy.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "517b1844", + "metadata": {}, + "outputs": [], + "source": [ + "def accuracy(out, yb):\n", + " return (out.argmax(1)==yb).float().mean()\n", + "\n", + "loss_func = F.cross_entropy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b041157", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([-0.0843, -0.0098, 0.1629, 0.1187, 0.1040, 0.0934, -0.1870, -0.0530,\n", + " -0.1361, -0.0224], grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs = 50\n", + "xb = x_train[:bs]\n", + "yb = y_train[:bs]\n", + "preds = model(xb)\n", + "preds[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "633f7626", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.2846, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_func(preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b6f5946", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(0.1400)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy(preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee7b70dc", + "metadata": {}, + "outputs": [], + "source": [ + "def report(loss, preds, yb):\n", + " print(f\"loss: {loss:.2f}, accuracy: {accuracy(preds, yb):.2f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87f623a4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 2.30, accuracy: 0.14\n" + ] + } + ], + "source": [ + "report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65dd9280", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 2.28, accuracy: 0.14\n" + ] + } + ], + "source": [ + "n, m = x_train.shape\n", + "lr = 0.5\n", + "epochs = 3\n", + "xb,yb = x_train[:bs], y_train[:bs]\n", + "preds = model(xb)\n", + "loss = loss_func(preds, yb)\n", + "report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c04f10be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.17, accuracy: 0.94\n", + "loss: 0.13, accuracy: 0.94\n", + "loss: 0.13, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " with torch.no_grad():\n", + " for l in model.layers:\n", + " if hasattr(l, 'weight'):\n", + " l.weight -= l.weight.grad * lr\n", + " l.bias -= l.bias.grad * lr\n", + " l.weight.grad.zero_()\n", + " l.bias.grad.zero_()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "b9ffdc70", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# parameters\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "339d1ffc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Module(\n", + " (foo): Linear(in_features=3, out_features=4, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1 = nn.Module()\n", + "m1.foo = nn.Linear(3, 4)\n", + "m1.boo = 'hey'\n", + "m1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97def1e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('foo', Linear(in_features=3, out_features=4, bias=True))]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(m1.named_children())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32e0a480", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Parameter containing:\n", + " tensor([[-0.4626, -0.5572, -0.2930],\n", + " [-0.2142, 0.2954, -0.5759],\n", + " [-0.0873, 0.5067, 0.0329],\n", + " [ 0.1627, 0.2251, -0.2415]], requires_grad=True),\n", + " Parameter containing:\n", + " tensor([-0.4074, 0.0654, 0.3297, -0.2555], requires_grad=True)]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(m1.parameters())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d920d80", + "metadata": {}, + "outputs": [], + "source": [ + "class MLP(nn.Module):\n", + " def __init__(self, n_in, n_h, n_out):\n", + " super().__init__()\n", + " self.l1 = nn.Linear(n_in, n_h)\n", + " self.relu = nn.ReLU()\n", + " self.l2 = nn.Linear(n_h, n_out)\n", + " \n", + " def forward(self, x):\n", + " return self.l2(self.relu(self.l1(x)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cb6ca4a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "MLP(\n", + " (l1): Linear(in_features=784, out_features=50, bias=True)\n", + " (relu): ReLU()\n", + " (l2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = MLP(n_in, n_h, 10)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2aef5321", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "l1: Linear(in_features=784, out_features=50, bias=True)\n", + "relu: ReLU()\n", + "l2: Linear(in_features=50, out_features=10, bias=True)\n" + ] + } + ], + "source": [ + "for name, l in model.named_children():\n", + " print(f\"{name}: {l}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22457bf7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([50, 784])\n", + "torch.Size([50])\n", + "torch.Size([10, 50])\n", + "torch.Size([10])\n" + ] + } + ], + "source": [ + "for p in model.parameters():\n", + " print(p.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32bd753a", + "metadata": {}, + "outputs": [], + "source": [ + "def fit():\n", + " for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s], y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " with torch.no_grad():\n", + " for p in model.parameters():\n", + " p -= p.grad * lr\n", + " model.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a67b005", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.02, accuracy: 1.00\n", + "loss: 0.05, accuracy: 0.98\n", + "loss: 0.03, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "4b221ac7", + "metadata": {}, + "source": [ + "```python\n", + "# nn.Module behind the scene\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a582a32f", + "metadata": {}, + "outputs": [], + "source": [ + "class MyModule:\n", + " def __init__(self, n_in, n_h, n_out):\n", + " self._modules = {}\n", + " self.l1 = nn.Linear(n_in, n_h)\n", + " self.l2 = nn.Linear(n_h, n_out)\n", + " self.relu = nn.ReLU()\n", + " \n", + " def __setattr__(self, k, v):\n", + " if not k.startswith('_'):\n", + " self._modules[k] = v\n", + " \n", + " super().__setattr__(k, v)\n", + " \n", + " def __repr__(self):\n", + " return f\"{self._modules}\"\n", + " \n", + " def parameters(self):\n", + " for l in self._modules.values():\n", + " yield from l.parameters()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7bd5ce9e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mdl = MyModule(n_in, n_h, n_o)\n", + "mdl" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8b93c6b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([50, 784])\n", + "torch.Size([50])\n", + "torch.Size([10, 50])\n", + "torch.Size([10])\n" + ] + } + ], + "source": [ + "for p in mdl.parameters():\n", + " print(p.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "c36db1c3", + "metadata": {}, + "source": [ + "```python\n", + "# registering modules\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23d70dcd", + "metadata": {}, + "outputs": [], + "source": [ + "from functools import reduce" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b382bbb5", + "metadata": {}, + "outputs": [], + "source": [ + "layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f55b47ea", + "metadata": {}, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " def __init__(self, layers):\n", + " super().__init__()\n", + " self.layers = layers\n", + " for i,l in enumerate(self.layers):\n", + " self.add_module(f\"layer_{i}\", l)\n", + " \n", + " def forward(self, x):\n", + " return reduce(lambda val, layer: layer(val), self.layers, x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d37a750", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Model(\n", + " (layer_0): Linear(in_features=784, out_features=50, bias=True)\n", + " (layer_1): ReLU()\n", + " (layer_2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = Model(layers)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55f5f543", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model(xb).shape" + ] + }, + { + "cell_type": "markdown", + "id": "a815f17a", + "metadata": {}, + "source": [ + "```python\n", + "# nn.ModuleList\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3506dc88", + "metadata": {}, + "outputs": [], + "source": [ + "class SequentialModel(nn.Module):\n", + " def __init__(self, layers):\n", + " super().__init__()\n", + " self.layers = nn.ModuleList(layers)\n", + " \n", + " def forward(self, x):\n", + " for l in self.layers:\n", + " x = l(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58c2e8ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = SequentialModel(layers)\n", + "model(xb).shape" + ] + }, + { + "cell_type": "markdown", + "id": "b965bde5", + "metadata": {}, + "source": [ + "```python\n", + "# nn.Sequential\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ce1a92e", + "metadata": {}, + "outputs": [], + "source": [ + "model = nn.Sequential(*layers)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f80dc0e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.14, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.96\n", + "loss: 0.05, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e81d3544", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=784, out_features=50, bias=True)\n", + " (1): ReLU()\n", + " (2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model" + ] + }, + { + "cell_type": "markdown", + "id": "687ff417", + "metadata": {}, + "source": [ + "```python\n", + "# optim\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39fdd1f0", + "metadata": {}, + "outputs": [], + "source": [ + "class Optimizer:\n", + " def __init__(self, params, lr=0.5):\n", + " self.params, self.lr = list(params), lr\n", + " \n", + " def step(self):\n", + " with torch.no_grad():\n", + " for p in self.params:\n", + " p -= p.grad * self.lr\n", + "\n", + " def zero_grad(self):\n", + " for p in self.params:\n", + " p.grad.data.zero_()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3e3464d", + "metadata": {}, + "outputs": [], + "source": [ + "model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79f0305d", + "metadata": {}, + "outputs": [], + "source": [ + "opt = Optimizer(model.parameters(), lr=lr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ea522e3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.13, accuracy: 0.96\n", + "loss: 0.12, accuracy: 0.92\n", + "loss: 0.08, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a693464", + "metadata": {}, + "outputs": [], + "source": [ + "from torch import optim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99cdc0f1", + "metadata": {}, + "outputs": [], + "source": [ + "def get_model():\n", + " model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))\n", + " opt = optim.SGD(model.parameters(), lr=lr)\n", + " return opt, model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e7dd21f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.2912, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "opt, model = get_model()\n", + "loss_func(model(xb), yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff4db4e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.15, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.96\n", + "loss: 0.06, accuracy: 1.00\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "e8e2cd8c", + "metadata": {}, + "source": [ + "```python\n", + "# dataset\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ec6497d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### Dataset\n", + "\n", + "> Dataset (x, y)\n", + "\n", + "Initialize self. See help(type(self)) for accurate signature." + ], + "text/plain": [ + "---\n", + "\n", + "### Dataset\n", + "\n", + "> Dataset (x, y)\n", + "\n", + "Initialize self. See help(type(self)) for accurate signature." + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(Dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a8c8ad6", + "metadata": {}, + "outputs": [], + "source": [ + "train_ds, valid_ds = Dataset(x_train, y_train), Dataset(x_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b6f44b2", + "metadata": {}, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2045956", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.13, accuracy: 0.96\n", + "loss: 0.10, accuracy: 0.98\n", + "loss: 0.12, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " xb,yb = train_ds[i: min(i+bs, n)]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "b1263bd5", + "metadata": {}, + "source": [ + "```python\n", + "# data loader\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc723267", + "metadata": {}, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, bs):\n", + " self.ds, self.bs = ds, bs\n", + " \n", + " def __iter__(self):\n", + " for i in range(0, len(self.ds), self.bs):\n", + " yield self.ds[i:i+self.bs]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb3d44ec", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, bs)\n", + "valid_dl = DataLoader(valid_ds, bs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131db88a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 784])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xb, yb = next(iter(train_dl))\n", + "xb.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb78352f", + "metadata": {}, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dee72fe9", + "metadata": {}, + "outputs": [], + "source": [ + "def fit():\n", + " for epoch in range(epochs):\n", + " for xb,yb in train_dl:\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfa38cc7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.16, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.98\n", + "loss: 0.07, accuracy: 0.98\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "4d300520", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# random sampling\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcc99a02", + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3460b690", + "metadata": {}, + "outputs": [], + "source": [ + "class Sampler:\n", + " def __init__(self, ds, shuffle=False):\n", + " self.n, self.shuffle = len(ds), shuffle\n", + " \n", + " def __iter__(self):\n", + " res = list(range(self.n))\n", + " if self.shuffle:\n", + " random.shuffle(res)\n", + " return iter(res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf506deb", + "metadata": {}, + "outputs": [], + "source": [ + "from itertools import islice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "270c8310", + "metadata": {}, + "outputs": [], + "source": [ + "ss = Sampler(train_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d86aa1c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(islice(ss, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a2f4c45", + "metadata": {}, + "outputs": [], + "source": [ + "import fastcore.all as fc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d49229c", + "metadata": {}, + "outputs": [], + "source": [ + "class BatchSampler:\n", + " def __init__(self, sampler, bs, drop_last=False):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " yield from fc.chunked(iter(self.sampler), self.bs, drop_last=self.drop_last)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "013b419e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "batches = BatchSampler(ss, 5)\n", + "list(islice(iter(batches), 3))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f8c9879", + "metadata": {}, + "outputs": [], + "source": [ + "def collate(b):\n", + " xs, ys = zip(*b)\n", + " return torch.stack(xs), torch.stack(ys)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd483f62", + "metadata": {}, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, batchs, collate_fn=collate):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " yield from (self.collate_fn(self.ds[i] for i in b) for b in self.batchs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62297d8d", + "metadata": {}, + "outputs": [], + "source": [ + "train_sampler = BatchSampler(Sampler(train_ds, shuffle=True), bs)\n", + "valid_sampler = BatchSampler(Sampler(valid_ds, shuffle=True), bs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7bcb939", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, train_sampler)\n", + "valid_dl = DataLoader(valid_ds, valid_sampler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89059be4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(torch.Size([50, 784]), torch.Size([50]))" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xb, yb = next(iter(valid_dl))\n", + "xb.shape, yb.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0458cf76", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(xb[0].view(28, 28));\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e8921d8", + "metadata": {}, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2740be53", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.11, accuracy: 0.94\n", + "loss: 0.27, accuracy: 0.96\n", + "loss: 0.03, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "62a1ce37", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# multiprocessing dataloader\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc2488a8", + "metadata": {}, + "outputs": [], + "source": [ + "import torch.multiprocessing as mp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "febc23a9", + "metadata": {}, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, batchs, collate_fn=collate, num_workers=1):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " with mp.Pool(self.num_workers) as ex:\n", + " yield from ex.map(self.ds.__getitem__, iter(self.batchs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42c45253", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, batchs=train_sampler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de70d5ab", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "xb, yb = next(iter(train_dl))\n", + "plt.imshow(xb[0].view(28, 28));\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "markdown", + "id": "f874dc5e", + "metadata": {}, + "source": [ + "```python\n", + "# pytorch dataloaders\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc2d3ab3", + "metadata": {}, + "outputs": [], + "source": [ + "t = RandomSampler(train_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b4d074a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "24797" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(iter(t))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e52220", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "torch.Size([784]) tensor(5)\n", + "torch.Size([784]) tensor(0)\n" + ] + } + ], + "source": [ + "t = BatchSampler(train_ds, batch_size=2, drop_last=False)\n", + "\n", + "k = next(iter(t))\n", + "print(len(k))\n", + "for ele in k:\n", + " print(ele[0].shape, ele[1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02e1fb43", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "33683\n", + "36592\n" + ] + } + ], + "source": [ + "t = BatchSampler(RandomSampler(train_ds), batch_size=2, drop_last=False)\n", + "\n", + "k = next(iter(t))\n", + "print(len(k))\n", + "for ele in k:\n", + " print(ele)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c230dcf8", + "metadata": {}, + "outputs": [], + "source": [ + "train_samp = BatchSampler(RandomSampler(train_ds), bs, drop_last=False)\n", + "valid_samp = BatchSampler(RandomSampler(valid_ds), bs, drop_last=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7556e64", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, batch_sampler=train_samp, collate_fn=collate)\n", + "valid_dl = DataLoader(valid_ds, batch_sampler=valid_samp, collate_fn=collate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28492c75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.20, accuracy: 0.94\n", + "loss: 0.11, accuracy: 0.98\n", + "loss: 0.20, accuracy: 0.98\n" + ] + } + ], + "source": [ + "opt, model = get_model()\n", + "fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f764cc92", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, bs, shuffle=True, num_workers=2, drop_last=True)\n", + "valid_dl = DataLoader(valid_ds, bs, shuffle=False, num_workers=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c69f400", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.08, accuracy: 0.98\n", + "loss: 0.31, accuracy: 0.86\n", + "loss: 0.11, accuracy: 0.98\n" + ] + } + ], + "source": [ + "opt, model = get_model()\n", + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "9a692301", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# validation\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e0bfb8ff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### fit\n", + "\n", + "> fit (epochs, model, loss_func, opt, train_dl, valid_ld)" + ], + "text/plain": [ + "---\n", + "\n", + "### fit\n", + "\n", + "> fit (epochs, model, loss_func, opt, train_dl, valid_ld)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(fit)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd559fa1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### get_dls\n", + "\n", + "> get_dls (train_ds, valid_ds, bs, **kwargs)" + ], + "text/plain": [ + "---\n", + "\n", + "### get_dls\n", + "\n", + "> get_dls (train_ds, valid_ds, bs, **kwargs)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(get_dls)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e110840", + "metadata": {}, + "outputs": [], + "source": [ + "train_dl, valid_dl = get_dls(train_ds, valid_ds, bs)\n", + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9d23182", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 0.1775239165313542 0.948100003004074\n", + "1 0.1179210783354938 0.9646000063419342\n", + "2 0.11550588405691087 0.9665000039339066\n", + "3 0.10593999677803367 0.9698000079393387\n", + "4 0.10098711441038176 0.9727000087499619\n", + "CPU times: user 17.8 s, sys: 16.1 s, total: 33.8 s\n", + "Wall time: 4.71 s\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ba7d787", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python3", + "language": "python", + "name": "python3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_proc/00_core.ipynb b/_proc/00_core.ipynb deleted file mode 100644 index dbca1115..00000000 --- a/_proc/00_core.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "---\n", - "description: Fill in a module description here\n", - "output-file: core.html\n", - "title: core\n", - "\n", - "---\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "---\n", - "\n", - "### foo\n", - "\n", - "> foo ()" - ], - "text/plain": [ - "---\n", - "\n", - "### foo\n", - "\n", - "> foo ()" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#| echo: false\n", - "#| output: asis\n", - "show_doc(foo)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/_proc/04_mini_batch_training.ipynb b/_proc/04_mini_batch_training.ipynb new file mode 100644 index 00000000..d97609ae --- /dev/null +++ b/_proc/04_mini_batch_training.ipynb @@ -0,0 +1,2327 @@ +{ + "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "output-file: mini_batch_training.html\n", + "title: simple 2 layer nn\n", + "\n", + "---\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b0863e2", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(torch.Size([50000, 784]),\n", + " torch.Size([50000]),\n", + " torch.Size([10000, 784]),\n", + " torch.Size([10000]))" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_path = Path('../data/mnist.pkl.gz')\n", + "with gzip.open(data_path, 'r') as f:\n", + " ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') \n", + "x_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))\n", + "x_train.shape, y_train.shape, x_test.shape, y_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ede327b7", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = x_train[0]\n", + "img = img.view(28, 28)\n", + "plt.imshow(img);\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "406daad9", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " def __init__(self, n_in, n_h, n_o):\n", + " super().__init__()\n", + " self.layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]\n", + " \n", + " def __call__(self, x):\n", + " for l in self.layers:\n", + " x = l(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2f3649f", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50000, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_in = x_train.shape[1]\n", + "n_h = 50\n", + "n_o = 10\n", + "\n", + "model = Model(n_in, n_h, n_o)\n", + "pred = model(x_train)\n", + "pred.shape" + ] + }, + { + "cell_type": "markdown", + "id": "c187f981", + "metadata": {}, + "source": [ + "```python\n", + "# cross entropy loss\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84804a8f", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return (x.exp()/x.exp().sum(-1, keepdim=True)).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea765bfa", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "6b923b92", + "metadata": {}, + "source": [ + "```python\n", + "# log product to sum trick\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1f31278", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - x.exp().sum(-1, keepdim=True).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a69a4cf", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "a3a224d0", + "metadata": {}, + "source": [ + "```python\n", + "# log sum exp trick\n", + "* normalize with the maximum value, so avoid exploding big activations.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20df0377", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def logsumexp(x):\n", + " m = x.max(-1)[-1]\n", + " return m + (x-m[:,None]).exp().sum(-1).log()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ae6ab2e", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - logsumexp(x)[:,None]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc21ccc6", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "75899b88", + "metadata": {}, + "source": [ + "```python\n", + "# pytorch logsumexp function\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6b7ad06", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def log_softmax(x):\n", + " return x - x.logsumexp(-1, keepdim=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02f8c028", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n", + " [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n", + " [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n", + " ...,\n", + " [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n", + " [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n", + " [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n", + " grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_softmax(pred)" + ] + }, + { + "cell_type": "markdown", + "id": "24919556", + "metadata": {}, + "source": [ + "```python\n", + "# negative log likeliehood\n", + "* for one hot input vector, it simplifies to the following formula.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33be78c3", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def nll(inp, targ):\n", + " return - inp[range(targ.shape[0]), targ].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc5bb9c7", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sm_pred = log_softmax(pred)\n", + "loss = nll(sm_pred, y_train)\n", + "loss" + ] + }, + { + "cell_type": "markdown", + "id": "9b4ef97b", + "metadata": {}, + "source": [ + "```python\n", + "# compare it with native pytorch implementation of nll.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0edec9c1", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_pytorch = F.nll_loss(F.log_softmax(pred, -1), y_train)\n", + "loss_pytorch" + ] + }, + { + "cell_type": "markdown", + "id": "121d1820", + "metadata": {}, + "source": [ + "```python\n", + "# nll and softmax combined implementation.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "082907a1", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.3028, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_pytorch = F.cross_entropy(pred, y_train)\n", + "loss_pytorch" + ] + }, + { + "cell_type": "markdown", + "id": "c23e9883", + "metadata": {}, + "source": [ + "```python\n", + "# batch training.\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "56e4978c", + "metadata": {}, + "source": [ + "```python\n", + "# accuracy.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "517b1844", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def accuracy(out, yb):\n", + " return (out.argmax(1)==yb).float().mean()\n", + "\n", + "loss_func = F.cross_entropy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b041157", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([-0.0843, -0.0098, 0.1629, 0.1187, 0.1040, 0.0934, -0.1870, -0.0530,\n", + " -0.1361, -0.0224], grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bs = 50\n", + "xb = x_train[:bs]\n", + "yb = y_train[:bs]\n", + "preds = model(xb)\n", + "preds[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "633f7626", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.2846, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_func(preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b6f5946", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(0.1400)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "accuracy(preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee7b70dc", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def report(loss, preds, yb):\n", + " print(f\"loss: {loss:.2f}, accuracy: {accuracy(preds, yb):.2f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87f623a4", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 2.30, accuracy: 0.14\n" + ] + } + ], + "source": [ + "report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65dd9280", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 2.28, accuracy: 0.14\n" + ] + } + ], + "source": [ + "n, m = x_train.shape\n", + "lr = 0.5\n", + "epochs = 3\n", + "xb,yb = x_train[:bs], y_train[:bs]\n", + "preds = model(xb)\n", + "loss = loss_func(preds, yb)\n", + "report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c04f10be", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.17, accuracy: 0.94\n", + "loss: 0.13, accuracy: 0.94\n", + "loss: 0.13, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " with torch.no_grad():\n", + " for l in model.layers:\n", + " if hasattr(l, 'weight'):\n", + " l.weight -= l.weight.grad * lr\n", + " l.bias -= l.bias.grad * lr\n", + " l.weight.grad.zero_()\n", + " l.bias.grad.zero_()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "b9ffdc70", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# parameters\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "339d1ffc", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Module(\n", + " (foo): Linear(in_features=3, out_features=4, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m1 = nn.Module()\n", + "m1.foo = nn.Linear(3, 4)\n", + "m1.boo = 'hey'\n", + "m1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97def1e8", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('foo', Linear(in_features=3, out_features=4, bias=True))]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(m1.named_children())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32e0a480", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Parameter containing:\n", + " tensor([[-0.4626, -0.5572, -0.2930],\n", + " [-0.2142, 0.2954, -0.5759],\n", + " [-0.0873, 0.5067, 0.0329],\n", + " [ 0.1627, 0.2251, -0.2415]], requires_grad=True),\n", + " Parameter containing:\n", + " tensor([-0.4074, 0.0654, 0.3297, -0.2555], requires_grad=True)]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(m1.parameters())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9d920d80", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class MLP(nn.Module):\n", + " def __init__(self, n_in, n_h, n_out):\n", + " super().__init__()\n", + " self.l1 = nn.Linear(n_in, n_h)\n", + " self.relu = nn.ReLU()\n", + " self.l2 = nn.Linear(n_h, n_out)\n", + " \n", + " def forward(self, x):\n", + " return self.l2(self.relu(self.l1(x)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cb6ca4a", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "MLP(\n", + " (l1): Linear(in_features=784, out_features=50, bias=True)\n", + " (relu): ReLU()\n", + " (l2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = MLP(n_in, n_h, 10)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2aef5321", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "l1: Linear(in_features=784, out_features=50, bias=True)\n", + "relu: ReLU()\n", + "l2: Linear(in_features=50, out_features=10, bias=True)\n" + ] + } + ], + "source": [ + "for name, l in model.named_children():\n", + " print(f\"{name}: {l}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22457bf7", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([50, 784])\n", + "torch.Size([50])\n", + "torch.Size([10, 50])\n", + "torch.Size([10])\n" + ] + } + ], + "source": [ + "for p in model.parameters():\n", + " print(p.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32bd753a", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def fit():\n", + " for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s], y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " with torch.no_grad():\n", + " for p in model.parameters():\n", + " p -= p.grad * lr\n", + " model.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a67b005", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.02, accuracy: 1.00\n", + "loss: 0.05, accuracy: 0.98\n", + "loss: 0.03, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "4b221ac7", + "metadata": {}, + "source": [ + "```python\n", + "# nn.Module behind the scene\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a582a32f", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class MyModule:\n", + " def __init__(self, n_in, n_h, n_out):\n", + " self._modules = {}\n", + " self.l1 = nn.Linear(n_in, n_h)\n", + " self.l2 = nn.Linear(n_h, n_out)\n", + " self.relu = nn.ReLU()\n", + " \n", + " def __setattr__(self, k, v):\n", + " if not k.startswith('_'):\n", + " self._modules[k] = v\n", + " \n", + " super().__setattr__(k, v)\n", + " \n", + " def __repr__(self):\n", + " return f\"{self._modules}\"\n", + " \n", + " def parameters(self):\n", + " for l in self._modules.values():\n", + " yield from l.parameters()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7bd5ce9e", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mdl = MyModule(n_in, n_h, n_o)\n", + "mdl" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8b93c6b", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([50, 784])\n", + "torch.Size([50])\n", + "torch.Size([10, 50])\n", + "torch.Size([10])\n" + ] + } + ], + "source": [ + "for p in mdl.parameters():\n", + " print(p.shape)" + ] + }, + { + "cell_type": "markdown", + "id": "c36db1c3", + "metadata": {}, + "source": [ + "```python\n", + "# registering modules\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23d70dcd", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "from functools import reduce" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b382bbb5", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f55b47ea", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class Model(nn.Module):\n", + " def __init__(self, layers):\n", + " super().__init__()\n", + " self.layers = layers\n", + " for i,l in enumerate(self.layers):\n", + " self.add_module(f\"layer_{i}\", l)\n", + " \n", + " def forward(self, x):\n", + " return reduce(lambda val, layer: layer(val), self.layers, x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d37a750", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Model(\n", + " (layer_0): Linear(in_features=784, out_features=50, bias=True)\n", + " (layer_1): ReLU()\n", + " (layer_2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = Model(layers)\n", + "model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55f5f543", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model(xb).shape" + ] + }, + { + "cell_type": "markdown", + "id": "a815f17a", + "metadata": {}, + "source": [ + "```python\n", + "# nn.ModuleList\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3506dc88", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class SequentialModel(nn.Module):\n", + " def __init__(self, layers):\n", + " super().__init__()\n", + " self.layers = nn.ModuleList(layers)\n", + " \n", + " def forward(self, x):\n", + " for l in self.layers:\n", + " x = l(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58c2e8ac", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 10])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = SequentialModel(layers)\n", + "model(xb).shape" + ] + }, + { + "cell_type": "markdown", + "id": "b965bde5", + "metadata": {}, + "source": [ + "```python\n", + "# nn.Sequential\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ce1a92e", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "model = nn.Sequential(*layers)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f80dc0e5", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.14, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.96\n", + "loss: 0.05, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e81d3544", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Sequential(\n", + " (0): Linear(in_features=784, out_features=50, bias=True)\n", + " (1): ReLU()\n", + " (2): Linear(in_features=50, out_features=10, bias=True)\n", + ")" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model" + ] + }, + { + "cell_type": "markdown", + "id": "687ff417", + "metadata": {}, + "source": [ + "```python\n", + "# optim\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39fdd1f0", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class Optimizer:\n", + " def __init__(self, params, lr=0.5):\n", + " self.params, self.lr = list(params), lr\n", + " \n", + " def step(self):\n", + " with torch.no_grad():\n", + " for p in self.params:\n", + " p -= p.grad * self.lr\n", + "\n", + " def zero_grad(self):\n", + " for p in self.params:\n", + " p.grad.data.zero_()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3e3464d", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79f0305d", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "opt = Optimizer(model.parameters(), lr=lr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ea522e3", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.13, accuracy: 0.96\n", + "loss: 0.12, accuracy: 0.92\n", + "loss: 0.08, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a693464", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "from torch import optim" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99cdc0f1", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def get_model():\n", + " model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))\n", + " opt = optim.SGD(model.parameters(), lr=lr)\n", + " return opt, model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e7dd21f", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor(2.2912, grad_fn=)" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "opt, model = get_model()\n", + "loss_func(model(xb), yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff4db4e6", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.15, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.96\n", + "loss: 0.06, accuracy: 1.00\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " s = slice(i, min(i+bs, n))\n", + " xb,yb = x_train[s],y_train[s]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "e8e2cd8c", + "metadata": {}, + "source": [ + "```python\n", + "# dataset\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### Dataset\n", + "\n", + "> Dataset (x, y)\n", + "\n", + "Initialize self. See help(type(self)) for accurate signature." + ], + "text/plain": [ + "---\n", + "\n", + "### Dataset\n", + "\n", + "> Dataset (x, y)\n", + "\n", + "Initialize self. See help(type(self)) for accurate signature." + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(Dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a8c8ad6", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_ds, valid_ds = Dataset(x_train, y_train), Dataset(x_test, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b6f44b2", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2045956", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.13, accuracy: 0.96\n", + "loss: 0.10, accuracy: 0.98\n", + "loss: 0.12, accuracy: 0.96\n" + ] + } + ], + "source": [ + "for epoch in range(epochs):\n", + " for i in range(0, n, bs):\n", + " xb,yb = train_ds[i: min(i+bs, n)]\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "markdown", + "id": "b1263bd5", + "metadata": {}, + "source": [ + "```python\n", + "# data loader\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc723267", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, bs):\n", + " self.ds, self.bs = ds, bs\n", + " \n", + " def __iter__(self):\n", + " for i in range(0, len(self.ds), self.bs):\n", + " yield self.ds[i:i+self.bs]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb3d44ec", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, bs)\n", + "valid_dl = DataLoader(valid_ds, bs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131db88a", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([50, 784])" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xb, yb = next(iter(train_dl))\n", + "xb.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb78352f", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dee72fe9", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def fit():\n", + " for epoch in range(epochs):\n", + " for xb,yb in train_dl:\n", + " preds = model(xb)\n", + " loss = loss_func(preds, yb)\n", + " loss.backward()\n", + " opt.step()\n", + " opt.zero_grad()\n", + " report(loss, preds, yb)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfa38cc7", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.16, accuracy: 0.96\n", + "loss: 0.11, accuracy: 0.98\n", + "loss: 0.07, accuracy: 0.98\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "4d300520", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# random sampling\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcc99a02", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3460b690", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class Sampler:\n", + " def __init__(self, ds, shuffle=False):\n", + " self.n, self.shuffle = len(ds), shuffle\n", + " \n", + " def __iter__(self):\n", + " res = list(range(self.n))\n", + " if self.shuffle:\n", + " random.shuffle(res)\n", + " return iter(res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf506deb", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "from itertools import islice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "270c8310", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "ss = Sampler(train_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d86aa1c9", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(islice(ss, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a2f4c45", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "import fastcore.all as fc" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d49229c", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class BatchSampler:\n", + " def __init__(self, sampler, bs, drop_last=False):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " yield from fc.chunked(iter(self.sampler), self.bs, drop_last=self.drop_last)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "013b419e", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "batches = BatchSampler(ss, 5)\n", + "list(islice(iter(batches), 3))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f8c9879", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "def collate(b):\n", + " xs, ys = zip(*b)\n", + " return torch.stack(xs), torch.stack(ys)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd483f62", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, batchs, collate_fn=collate):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " yield from (self.collate_fn(self.ds[i] for i in b) for b in self.batchs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62297d8d", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_sampler = BatchSampler(Sampler(train_ds, shuffle=True), bs)\n", + "valid_sampler = BatchSampler(Sampler(valid_ds, shuffle=True), bs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7bcb939", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, train_sampler)\n", + "valid_dl = DataLoader(valid_ds, valid_sampler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89059be4", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(torch.Size([50, 784]), torch.Size([50]))" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xb, yb = next(iter(valid_dl))\n", + "xb.shape, yb.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0458cf76", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(xb[0].view(28, 28));\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e8921d8", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2740be53", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.11, accuracy: 0.94\n", + "loss: 0.27, accuracy: 0.96\n", + "loss: 0.03, accuracy: 1.00\n" + ] + } + ], + "source": [ + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "62a1ce37", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# multiprocessing dataloader\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc2488a8", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "import torch.multiprocessing as mp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "febc23a9", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "class DataLoader:\n", + " def __init__(self, ds, batchs, collate_fn=collate, num_workers=1):\n", + " fc.store_attr()\n", + " \n", + " def __iter__(self):\n", + " with mp.Pool(self.num_workers) as ex:\n", + " yield from ex.map(self.ds.__getitem__, iter(self.batchs))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42c45253", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, batchs=train_sampler)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de70d5ab", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "xb, yb = next(iter(train_dl))\n", + "plt.imshow(xb[0].view(28, 28));\n", + "plt.axis('off');" + ] + }, + { + "cell_type": "markdown", + "id": "f874dc5e", + "metadata": {}, + "source": [ + "```python\n", + "# pytorch dataloaders\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc2d3ab3", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "t = RandomSampler(train_ds)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b4d074a", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "24797" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "next(iter(t))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e52220", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "torch.Size([784]) tensor(5)\n", + "torch.Size([784]) tensor(0)\n" + ] + } + ], + "source": [ + "t = BatchSampler(train_ds, batch_size=2, drop_last=False)\n", + "\n", + "k = next(iter(t))\n", + "print(len(k))\n", + "for ele in k:\n", + " print(ele[0].shape, ele[1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02e1fb43", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "33683\n", + "36592\n" + ] + } + ], + "source": [ + "t = BatchSampler(RandomSampler(train_ds), batch_size=2, drop_last=False)\n", + "\n", + "k = next(iter(t))\n", + "print(len(k))\n", + "for ele in k:\n", + " print(ele)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c230dcf8", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_samp = BatchSampler(RandomSampler(train_ds), bs, drop_last=False)\n", + "valid_samp = BatchSampler(RandomSampler(valid_ds), bs, drop_last=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7556e64", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, batch_sampler=train_samp, collate_fn=collate)\n", + "valid_dl = DataLoader(valid_ds, batch_sampler=valid_samp, collate_fn=collate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28492c75", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.20, accuracy: 0.94\n", + "loss: 0.11, accuracy: 0.98\n", + "loss: 0.20, accuracy: 0.98\n" + ] + } + ], + "source": [ + "opt, model = get_model()\n", + "fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f764cc92", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl = DataLoader(train_ds, bs, shuffle=True, num_workers=2, drop_last=True)\n", + "valid_dl = DataLoader(valid_ds, bs, shuffle=False, num_workers=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c69f400", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.08, accuracy: 0.98\n", + "loss: 0.31, accuracy: 0.86\n", + "loss: 0.11, accuracy: 0.98\n" + ] + } + ], + "source": [ + "opt, model = get_model()\n", + "fit()" + ] + }, + { + "cell_type": "markdown", + "id": "9a692301", + "metadata": {}, + "source": [ + "```python\n", + "\n", + "# validation\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### fit\n", + "\n", + "> fit (epochs, model, loss_func, opt, train_dl, valid_ld)" + ], + "text/plain": [ + "---\n", + "\n", + "### fit\n", + "\n", + "> fit (epochs, model, loss_func, opt, train_dl, valid_ld)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(fit)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "---\n", + "\n", + "### get_dls\n", + "\n", + "> get_dls (train_ds, valid_ds, bs, **kwargs)" + ], + "text/plain": [ + "---\n", + "\n", + "### get_dls\n", + "\n", + "> get_dls (train_ds, valid_ds, bs, **kwargs)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#| echo: false\n", + "#| output: asis\n", + "show_doc(get_dls)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e110840", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [ + "train_dl, valid_dl = get_dls(train_ds, valid_ds, bs)\n", + "opt, model = get_model()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9d23182", + "metadata": { + "language": "python" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 0.1775239165313542 0.948100003004074\n", + "1 0.1179210783354938 0.9646000063419342\n", + "2 0.11550588405691087 0.9665000039339066\n", + "3 0.10593999677803367 0.9698000079393387\n", + "4 0.10098711441038176 0.9727000087499619\n", + "CPU times: user 17.8 s, sys: 16.1 s, total: 33.8 s\n", + "Wall time: 4.71 s\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ba7d787", + "metadata": { + "language": "python" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python3", + "language": "python", + "name": "python3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_proc/_docs/04_mini_batch_training_files/figure-html/cell-3-output-1.png b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-3-output-1.png new file mode 100644 index 00000000..917876d6 Binary files /dev/null and b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-3-output-1.png differ diff --git a/_proc/_docs/04_mini_batch_training_files/figure-html/cell-80-output-1.png b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-80-output-1.png new file mode 100644 index 00000000..1bbc7daf Binary files /dev/null and b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-80-output-1.png differ diff --git a/_proc/_docs/04_mini_batch_training_files/figure-html/cell-86-output-1.png b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-86-output-1.png new file mode 100644 index 00000000..3c5c6a76 Binary files /dev/null and b/_proc/_docs/04_mini_batch_training_files/figure-html/cell-86-output-1.png differ diff --git a/_proc/_docs/core.html b/_proc/_docs/core.html index 01aceede..9f3b1577 100644 --- a/_proc/_docs/core.html +++ b/_proc/_docs/core.html @@ -6,7 +6,7 @@ - + practice_deep_learning - core @@ -133,7 +98,7 @@ - + @@ -148,13 +113,7 @@ - @@ -163,60 +122,18 @@
-
-
-

practice_deep_learning

-
- -
-
- Deep Learning Portal 🔥 This repository contains implementation code for important research papers and starter guides for common deep learning tools. -
-
- - -
- - - - -
- - -
+

This repository contains implementation code for important research papers and starter guides for common deep learning tools.

-

This file will become your README and also the index of your documentation.

-
-

Install

-
pip install practice_deep_learning
-
-
-

How to use

-

Fill me in please! Don’t forget code examples:

-
-
1+1
-
-
2
-
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
+

simple 2 layer nn

+
+ + + +
+ + + + +
+ + + +
+ + + +
+
data_path = Path('../data/mnist.pkl.gz')
+with gzip.open(data_path, 'r') as f:
+    ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') 
+x_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))
+x_train.shape, y_train.shape, x_test.shape, y_test.shape
+
+
(torch.Size([50000, 784]),
+ torch.Size([50000]),
+ torch.Size([10000, 784]),
+ torch.Size([10000]))
+
+
+
+
img = x_train[0]
+img = img.view(28, 28)
+plt.imshow(img);
+plt.axis('off');
+
+
+
+

+
+
+
+
+
+
class Model(nn.Module):
+    def __init__(self, n_in, n_h, n_o):
+        super().__init__()
+        self.layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]
+    
+    def __call__(self, x):
+        for l in self.layers:
+            x = l(x)
+        return x
+
+
+
n_in = x_train.shape[1]
+n_h = 50
+n_o = 10
+
+model = Model(n_in, n_h, n_o)
+pred = model(x_train)
+pred.shape
+
+
torch.Size([50000, 10])
+
+
+
# cross entropy loss
+
+
def log_softmax(x):
+    return (x.exp()/x.exp().sum(-1, keepdim=True)).log()
+
+
+
log_softmax(pred)
+
+
tensor([[-2.3917, -2.3172, -2.1445,  ..., -2.3604, -2.4435, -2.3298],
+        [-2.3426, -2.2119, -2.2799,  ..., -2.3664, -2.4151, -2.2220],
+        [-2.3725, -2.2966, -2.2658,  ..., -2.2858, -2.3270, -2.3698],
+        ...,
+        [-2.4004, -2.3082, -2.1309,  ..., -2.3633, -2.4319, -2.2571],
+        [-2.4322, -2.3229, -2.1224,  ..., -2.3613, -2.4487, -2.2554],
+        [-2.3660, -2.2850, -2.0563,  ..., -2.3602, -2.5124, -2.3140]],
+       grad_fn=<LogBackward0>)
+
+
+
# log product to sum trick
+
+
def log_softmax(x):
+    return x - x.exp().sum(-1, keepdim=True).log()
+
+
+
log_softmax(pred)
+
+
tensor([[-2.3917, -2.3172, -2.1445,  ..., -2.3604, -2.4435, -2.3298],
+        [-2.3426, -2.2119, -2.2799,  ..., -2.3664, -2.4151, -2.2220],
+        [-2.3725, -2.2966, -2.2658,  ..., -2.2858, -2.3270, -2.3698],
+        ...,
+        [-2.4004, -2.3082, -2.1309,  ..., -2.3633, -2.4319, -2.2571],
+        [-2.4322, -2.3229, -2.1224,  ..., -2.3613, -2.4487, -2.2554],
+        [-2.3660, -2.2850, -2.0563,  ..., -2.3602, -2.5124, -2.3140]],
+       grad_fn=<SubBackward0>)
+
+
+
# log sum exp trick
+* normalize with the maximum value, so avoid exploding big activations.
+
+
def logsumexp(x):
+    m = x.max(-1)[-1]
+    return m + (x-m[:,None]).exp().sum(-1).log()
+
+
+
def log_softmax(x):
+    return x - logsumexp(x)[:,None]
+
+
+
log_softmax(pred)
+
+
tensor([[-2.3917, -2.3172, -2.1445,  ..., -2.3604, -2.4435, -2.3298],
+        [-2.3426, -2.2119, -2.2799,  ..., -2.3664, -2.4151, -2.2220],
+        [-2.3725, -2.2966, -2.2658,  ..., -2.2858, -2.3270, -2.3698],
+        ...,
+        [-2.4004, -2.3082, -2.1309,  ..., -2.3633, -2.4319, -2.2571],
+        [-2.4322, -2.3229, -2.1224,  ..., -2.3613, -2.4487, -2.2554],
+        [-2.3660, -2.2850, -2.0563,  ..., -2.3602, -2.5124, -2.3140]],
+       grad_fn=<SubBackward0>)
+
+
+
# pytorch logsumexp function
+
+
def log_softmax(x):
+    return x - x.logsumexp(-1, keepdim=True)
+
+
+
log_softmax(pred)
+
+
tensor([[-2.3917, -2.3172, -2.1445,  ..., -2.3604, -2.4435, -2.3298],
+        [-2.3426, -2.2119, -2.2799,  ..., -2.3664, -2.4151, -2.2220],
+        [-2.3725, -2.2966, -2.2658,  ..., -2.2858, -2.3270, -2.3698],
+        ...,
+        [-2.4004, -2.3082, -2.1309,  ..., -2.3633, -2.4319, -2.2571],
+        [-2.4322, -2.3229, -2.1224,  ..., -2.3613, -2.4487, -2.2554],
+        [-2.3660, -2.2850, -2.0563,  ..., -2.3602, -2.5124, -2.3140]],
+       grad_fn=<SubBackward0>)
+
+
+
# negative log likeliehood
+* for one hot input vector, it simplifies to the following formula.
+
+
def nll(inp, targ):
+    return - inp[range(targ.shape[0]), targ].mean()
+
+
+
sm_pred = log_softmax(pred)
+loss = nll(sm_pred, y_train)
+loss
+
+
tensor(2.3028, grad_fn=<NegBackward0>)
+
+
+
# compare it with native pytorch implementation of nll.
+
+
loss_pytorch = F.nll_loss(F.log_softmax(pred, -1), y_train)
+loss_pytorch
+
+
tensor(2.3028, grad_fn=<NllLossBackward0>)
+
+
+
# nll and softmax combined implementation.
+
+
loss_pytorch = F.cross_entropy(pred, y_train)
+loss_pytorch
+
+
tensor(2.3028, grad_fn=<NllLossBackward0>)
+
+
+
# batch training.
+
# accuracy.
+
+
def accuracy(out, yb):
+    return (out.argmax(1)==yb).float().mean()
+
+loss_func = F.cross_entropy
+
+
+
bs = 50
+xb = x_train[:bs]
+yb = y_train[:bs]
+preds = model(xb)
+preds[0]
+
+
tensor([-0.0843, -0.0098,  0.1629,  0.1187,  0.1040,  0.0934, -0.1870, -0.0530,
+        -0.1361, -0.0224], grad_fn=<SelectBackward0>)
+
+
+
+
loss_func(preds, yb)
+
+
tensor(2.2846, grad_fn=<NllLossBackward0>)
+
+
+
+
accuracy(preds, yb)
+
+
tensor(0.1400)
+
+
+
+
def report(loss, preds, yb):
+    print(f"loss: {loss:.2f}, accuracy: {accuracy(preds, yb):.2f}")
+
+
+
report(loss, preds, yb)
+
+
loss: 2.30, accuracy: 0.14
+
+
+
+
n, m = x_train.shape
+lr = 0.5
+epochs = 3
+xb,yb = x_train[:bs], y_train[:bs]
+preds = model(xb)
+loss = loss_func(preds, yb)
+report(loss, preds, yb)
+
+
loss: 2.28, accuracy: 0.14
+
+
+
+
for epoch in range(epochs):
+    for i in range(0, n, bs):
+        s = slice(i, min(i+bs, n))
+        xb,yb = x_train[s],y_train[s]
+        preds = model(xb)
+        loss = loss_func(preds, yb)
+        loss.backward()
+        with torch.no_grad():
+            for l in model.layers:
+                if hasattr(l, 'weight'):
+                    l.weight -= l.weight.grad * lr
+                    l.bias -= l.bias.grad * lr
+                    l.weight.grad.zero_()
+                    l.bias.grad.zero_()
+    report(loss, preds, yb)
+
+
loss: 0.17, accuracy: 0.94
+loss: 0.13, accuracy: 0.94
+loss: 0.13, accuracy: 0.96
+
+
+

+# parameters
+
+
m1 = nn.Module()
+m1.foo = nn.Linear(3, 4)
+m1.boo = 'hey'
+m1
+
+
Module(
+  (foo): Linear(in_features=3, out_features=4, bias=True)
+)
+
+
+
+
list(m1.named_children())
+
+
[('foo', Linear(in_features=3, out_features=4, bias=True))]
+
+
+
+
list(m1.parameters())
+
+
[Parameter containing:
+ tensor([[-0.4626, -0.5572, -0.2930],
+         [-0.2142,  0.2954, -0.5759],
+         [-0.0873,  0.5067,  0.0329],
+         [ 0.1627,  0.2251, -0.2415]], requires_grad=True),
+ Parameter containing:
+ tensor([-0.4074,  0.0654,  0.3297, -0.2555], requires_grad=True)]
+
+
+
+
class MLP(nn.Module):
+    def __init__(self, n_in, n_h, n_out):
+        super().__init__()
+        self.l1 = nn.Linear(n_in, n_h)
+        self.relu = nn.ReLU()
+        self.l2 = nn.Linear(n_h, n_out)
+    
+    def forward(self, x):
+        return self.l2(self.relu(self.l1(x)))
+
+
+
model = MLP(n_in, n_h, 10)
+model
+
+
MLP(
+  (l1): Linear(in_features=784, out_features=50, bias=True)
+  (relu): ReLU()
+  (l2): Linear(in_features=50, out_features=10, bias=True)
+)
+
+
+
+
for name, l in model.named_children():
+    print(f"{name}: {l}")
+
+
l1: Linear(in_features=784, out_features=50, bias=True)
+relu: ReLU()
+l2: Linear(in_features=50, out_features=10, bias=True)
+
+
+
+
for p in model.parameters():
+    print(p.shape)
+
+
torch.Size([50, 784])
+torch.Size([50])
+torch.Size([10, 50])
+torch.Size([10])
+
+
+
+
def fit():
+    for epoch in range(epochs):
+        for i in range(0, n, bs):
+            s = slice(i, min(i+bs, n))
+            xb,yb = x_train[s], y_train[s]
+            preds = model(xb)
+            loss = loss_func(preds, yb)
+            loss.backward()
+            with torch.no_grad():
+                for p in model.parameters():
+                    p -= p.grad * lr
+                model.zero_grad()
+        report(loss, preds, yb)
+
+
+
fit()
+
+
loss: 0.02, accuracy: 1.00
+loss: 0.05, accuracy: 0.98
+loss: 0.03, accuracy: 1.00
+
+
+
# nn.Module behind the scene
+
+
class MyModule:
+    def __init__(self, n_in, n_h, n_out):
+        self._modules = {}
+        self.l1 = nn.Linear(n_in, n_h)
+        self.l2 = nn.Linear(n_h, n_out)
+        self.relu = nn.ReLU()
+    
+    def __setattr__(self, k, v):
+        if not k.startswith('_'):
+            self._modules[k] = v
+        
+        super().__setattr__(k, v)
+    
+    def __repr__(self):
+        return f"{self._modules}"
+    
+    def parameters(self):
+        for l in self._modules.values():
+            yield from l.parameters()
+
+
+
mdl = MyModule(n_in, n_h, n_o)
+mdl
+
+
{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}
+
+
+
+
for p in mdl.parameters():
+    print(p.shape)
+
+
torch.Size([50, 784])
+torch.Size([50])
+torch.Size([10, 50])
+torch.Size([10])
+
+
+
# registering modules
+
+
from functools import reduce
+
+
+
layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]
+
+
+
class Model(nn.Module):
+    def __init__(self, layers):
+        super().__init__()
+        self.layers = layers
+        for i,l in enumerate(self.layers):
+            self.add_module(f"layer_{i}", l)
+    
+    def forward(self, x):
+        return reduce(lambda val, layer: layer(val), self.layers, x)
+
+
+
model = Model(layers)
+model
+
+
Model(
+  (layer_0): Linear(in_features=784, out_features=50, bias=True)
+  (layer_1): ReLU()
+  (layer_2): Linear(in_features=50, out_features=10, bias=True)
+)
+
+
+
+
model(xb).shape
+
+
torch.Size([50, 10])
+
+
+
# nn.ModuleList
+
+
class SequentialModel(nn.Module):
+    def __init__(self, layers):
+        super().__init__()
+        self.layers = nn.ModuleList(layers)
+    
+    def forward(self, x):
+        for l in self.layers:
+            x = l(x)
+        return x
+
+
+
model = SequentialModel(layers)
+model(xb).shape
+
+
torch.Size([50, 10])
+
+
+
# nn.Sequential
+
+
model = nn.Sequential(*layers)
+
+
+
fit()
+
+
loss: 0.14, accuracy: 0.96
+loss: 0.11, accuracy: 0.96
+loss: 0.05, accuracy: 1.00
+
+
+
+
model
+
+
Sequential(
+  (0): Linear(in_features=784, out_features=50, bias=True)
+  (1): ReLU()
+  (2): Linear(in_features=50, out_features=10, bias=True)
+)
+
+
+
# optim
+
+
class Optimizer:
+    def __init__(self, params, lr=0.5):
+        self.params, self.lr = list(params), lr
+    
+    def step(self):
+        with torch.no_grad():
+            for p in self.params:
+                p -= p.grad * self.lr
+
+    def zero_grad(self):
+        for p in self.params:
+            p.grad.data.zero_()
+
+
+
model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))
+
+
+
opt = Optimizer(model.parameters(), lr=lr)
+
+
+
for epoch in range(epochs):
+    for i in range(0, n, bs):
+        s = slice(i, min(i+bs, n))
+        xb,yb = x_train[s],y_train[s]
+        preds = model(xb)
+        loss = loss_func(preds, yb)
+        loss.backward()
+        opt.step()
+        opt.zero_grad()
+    report(loss, preds, yb)
+
+
loss: 0.13, accuracy: 0.96
+loss: 0.12, accuracy: 0.92
+loss: 0.08, accuracy: 0.96
+
+
+
+
from torch import optim
+
+
+
def get_model():
+    model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))
+    opt = optim.SGD(model.parameters(), lr=lr)
+    return opt, model
+
+
+
opt, model = get_model()
+loss_func(model(xb), yb)
+
+
tensor(2.2912, grad_fn=<NllLossBackward0>)
+
+
+
+
for epoch in range(epochs):
+    for i in range(0, n, bs):
+        s = slice(i, min(i+bs, n))
+        xb,yb = x_train[s],y_train[s]
+        preds = model(xb)
+        loss = loss_func(preds, yb)
+        loss.backward()
+        opt.step()
+        opt.zero_grad()
+    report(loss, preds, yb)
+
+
loss: 0.15, accuracy: 0.96
+loss: 0.11, accuracy: 0.96
+loss: 0.06, accuracy: 1.00
+
+
+
# dataset
+
+
+

Dataset

+
+
 Dataset (x, y)
+
+

Initialize self. See help(type(self)) for accurate signature.

+
+
train_ds, valid_ds = Dataset(x_train, y_train), Dataset(x_test, y_test)
+
+
+
opt, model = get_model()
+
+
+
for epoch in range(epochs):
+    for i in range(0, n, bs):
+        xb,yb = train_ds[i: min(i+bs, n)]
+        preds = model(xb)
+        loss = loss_func(preds, yb)
+        loss.backward()
+        opt.step()
+        opt.zero_grad()
+    report(loss, preds, yb)
+
+
loss: 0.13, accuracy: 0.96
+loss: 0.10, accuracy: 0.98
+loss: 0.12, accuracy: 0.96
+
+
+
# data loader
+
+
class DataLoader:
+    def __init__(self, ds, bs):
+        self.ds, self.bs = ds, bs
+    
+    def __iter__(self):
+        for i in range(0, len(self.ds), self.bs):
+            yield self.ds[i:i+self.bs]
+
+
+
train_dl = DataLoader(train_ds, bs)
+valid_dl = DataLoader(valid_ds, bs)
+
+
+
xb, yb = next(iter(train_dl))
+xb.shape
+
+
torch.Size([50, 784])
+
+
+
+
opt, model = get_model()
+
+
+
def fit():
+    for epoch in range(epochs):
+        for xb,yb in train_dl:
+            preds = model(xb)
+            loss = loss_func(preds, yb)
+            loss.backward()
+            opt.step()
+            opt.zero_grad()
+        report(loss, preds, yb)
+
+
+
fit()
+
+
loss: 0.16, accuracy: 0.96
+loss: 0.11, accuracy: 0.98
+loss: 0.07, accuracy: 0.98
+
+
+

+# random sampling
+
+
import random
+
+
+
class Sampler:
+    def __init__(self, ds, shuffle=False):
+        self.n, self.shuffle = len(ds), shuffle
+    
+    def __iter__(self):
+        res = list(range(self.n))
+        if self.shuffle:
+            random.shuffle(res)
+        return iter(res)
+
+
+
from itertools import islice
+
+
+
ss = Sampler(train_ds)
+
+
+
list(islice(ss, 5))
+
+
[0, 1, 2, 3, 4]
+
+
+
+
import fastcore.all as fc
+
+
+
class BatchSampler:
+    def __init__(self, sampler, bs, drop_last=False):
+        fc.store_attr()
+    
+    def __iter__(self):
+        yield from fc.chunked(iter(self.sampler), self.bs, drop_last=self.drop_last)
+
+
+
batches = BatchSampler(ss, 5)
+list(islice(iter(batches), 3))
+
+
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]
+
+
+
+
def collate(b):
+    xs, ys = zip(*b)
+    return torch.stack(xs), torch.stack(ys)
+
+
+
class DataLoader:
+    def __init__(self, ds, batchs, collate_fn=collate):
+        fc.store_attr()
+    
+    def __iter__(self):
+        yield from (self.collate_fn(self.ds[i] for i in b) for b in self.batchs)
+
+
+
train_sampler = BatchSampler(Sampler(train_ds, shuffle=True), bs)
+valid_sampler = BatchSampler(Sampler(valid_ds, shuffle=True), bs)
+
+
+
train_dl = DataLoader(train_ds, train_sampler)
+valid_dl = DataLoader(valid_ds, valid_sampler)
+
+
+
xb, yb = next(iter(valid_dl))
+xb.shape, yb.shape
+
+
(torch.Size([50, 784]), torch.Size([50]))
+
+
+
+
plt.imshow(xb[0].view(28, 28));
+plt.axis('off');
+
+
+
+

+
+
+
+
+
+
opt, model = get_model()
+
+
+
fit()
+
+
loss: 0.11, accuracy: 0.94
+loss: 0.27, accuracy: 0.96
+loss: 0.03, accuracy: 1.00
+
+
+

+# multiprocessing dataloader
+
+
import torch.multiprocessing as mp
+
+
+
class DataLoader:
+    def __init__(self, ds, batchs, collate_fn=collate, num_workers=1):
+        fc.store_attr()
+    
+    def __iter__(self):
+        with mp.Pool(self.num_workers) as ex:
+            yield from ex.map(self.ds.__getitem__, iter(self.batchs))
+
+
+
train_dl = DataLoader(train_ds, batchs=train_sampler)
+
+
+
xb, yb = next(iter(train_dl))
+plt.imshow(xb[0].view(28, 28));
+plt.axis('off');
+
+
+
+

+
+
+
+
+
# pytorch dataloaders
+
+
t = RandomSampler(train_ds)
+
+
+
next(iter(t))
+
+
24797
+
+
+
+
t = BatchSampler(train_ds, batch_size=2, drop_last=False)
+
+k  = next(iter(t))
+print(len(k))
+for ele in k:
+    print(ele[0].shape, ele[1])
+
+
2
+torch.Size([784]) tensor(5)
+torch.Size([784]) tensor(0)
+
+
+
+
t = BatchSampler(RandomSampler(train_ds), batch_size=2, drop_last=False)
+
+k  = next(iter(t))
+print(len(k))
+for ele in k:
+    print(ele)
+
+
2
+33683
+36592
+
+
+
+
train_samp = BatchSampler(RandomSampler(train_ds), bs, drop_last=False)
+valid_samp = BatchSampler(RandomSampler(valid_ds), bs, drop_last=False)
+
+
+
train_dl = DataLoader(train_ds, batch_sampler=train_samp, collate_fn=collate)
+valid_dl = DataLoader(valid_ds, batch_sampler=valid_samp, collate_fn=collate)
+
+
+
opt, model = get_model()
+fit()
+
+
loss: 0.20, accuracy: 0.94
+loss: 0.11, accuracy: 0.98
+loss: 0.20, accuracy: 0.98
+
+
+
+
train_dl = DataLoader(train_ds, bs, shuffle=True, num_workers=2, drop_last=True)
+valid_dl = DataLoader(valid_ds, bs, shuffle=False, num_workers=2)
+
+
+
opt, model = get_model()
+fit()
+
+
loss: 0.08, accuracy: 0.98
+loss: 0.31, accuracy: 0.86
+loss: 0.11, accuracy: 0.98
+
+
+

+# validation
+
+
+
+

fit

+
+
 fit (epochs, model, loss_func, opt, train_dl, valid_ld)
+
+
+
+
+

get_dls

+
+
 get_dls (train_ds, valid_ds, bs, **kwargs)
+
+
+
train_dl, valid_dl = get_dls(train_ds, valid_ds, bs)
+opt, model = get_model()
+
+
+
+
+
0 0.1775239165313542 0.948100003004074
+1 0.1179210783354938 0.9646000063419342
+2 0.11550588405691087 0.9665000039339066
+3 0.10593999677803367 0.9698000079393387
+4 0.10098711441038176 0.9727000087499619
+CPU times: user 17.8 s, sys: 16.1 s, total: 33.8 s
+Wall time: 4.71 s
+
+
+ + +
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/_proc/_docs/search.json b/_proc/_docs/search.json index 518ac0a3..8a189de4 100644 --- a/_proc/_docs/search.json +++ b/_proc/_docs/search.json @@ -4,7 +4,7 @@ "href": "core.html", "title": "core", "section": "", - "text": "foo\n\n foo ()", + "text": "source\n\nfoo\n\n foo ()", "crumbs": [ "core" ] @@ -14,9 +14,9 @@ "href": "index.html", "title": "practice_deep_learning", "section": "", - "text": "This file will become your README and also the index of your documentation.", + "text": "This repository contains implementation code for important research papers and starter guides for common deep learning tools.", "crumbs": [ - "practice_deep_learning" + "index.html" ] }, { @@ -38,5 +38,22 @@ "crumbs": [ "practice_deep_learning" ] + }, + { + "objectID": "index.html#deep-learning-portal", + "href": "index.html#deep-learning-portal", + "title": "Deep Learning Portal 🔥", + "section": "", + "text": "This repository contains implementation code for important research papers and starter guides for common deep learning tools.", + "crumbs": [ + "Deep Learning Portal 🔥" + ] + }, + { + "objectID": "mini_batch_training.html", + "href": "mini_batch_training.html", + "title": "simple 2 layer nn", + "section": "", + "text": "data_path = Path('../data/mnist.pkl.gz')\nwith gzip.open(data_path, 'r') as f:\n ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') \nx_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))\nx_train.shape, y_train.shape, x_test.shape, y_test.shape\n\n(torch.Size([50000, 784]),\n torch.Size([50000]),\n torch.Size([10000, 784]),\n torch.Size([10000]))\n\n\n\nimg = x_train[0]\nimg = img.view(28, 28)\nplt.imshow(img);\nplt.axis('off');\n\n\n\n\n\n\n\n\n\nclass Model(nn.Module):\n def __init__(self, n_in, n_h, n_o):\n super().__init__()\n self.layers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]\n \n def __call__(self, x):\n for l in self.layers:\n x = l(x)\n return x\n\n\nn_in = x_train.shape[1]\nn_h = 50\nn_o = 10\n\nmodel = Model(n_in, n_h, n_o)\npred = model(x_train)\npred.shape\n\ntorch.Size([50000, 10])\n\n\n# cross entropy loss\n\ndef log_softmax(x):\n return (x.exp()/x.exp().sum(-1, keepdim=True)).log()\n\n\nlog_softmax(pred)\n\ntensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n ...,\n [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n grad_fn=<LogBackward0>)\n\n\n# log product to sum trick\n\ndef log_softmax(x):\n return x - x.exp().sum(-1, keepdim=True).log()\n\n\nlog_softmax(pred)\n\ntensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n ...,\n [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n grad_fn=<SubBackward0>)\n\n\n# log sum exp trick\n* normalize with the maximum value, so avoid exploding big activations.\n\ndef logsumexp(x):\n m = x.max(-1)[-1]\n return m + (x-m[:,None]).exp().sum(-1).log()\n\n\ndef log_softmax(x):\n return x - logsumexp(x)[:,None]\n\n\nlog_softmax(pred)\n\ntensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n ...,\n [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n grad_fn=<SubBackward0>)\n\n\n# pytorch logsumexp function\n\ndef log_softmax(x):\n return x - x.logsumexp(-1, keepdim=True)\n\n\nlog_softmax(pred)\n\ntensor([[-2.3917, -2.3172, -2.1445, ..., -2.3604, -2.4435, -2.3298],\n [-2.3426, -2.2119, -2.2799, ..., -2.3664, -2.4151, -2.2220],\n [-2.3725, -2.2966, -2.2658, ..., -2.2858, -2.3270, -2.3698],\n ...,\n [-2.4004, -2.3082, -2.1309, ..., -2.3633, -2.4319, -2.2571],\n [-2.4322, -2.3229, -2.1224, ..., -2.3613, -2.4487, -2.2554],\n [-2.3660, -2.2850, -2.0563, ..., -2.3602, -2.5124, -2.3140]],\n grad_fn=<SubBackward0>)\n\n\n# negative log likeliehood\n* for one hot input vector, it simplifies to the following formula.\n\ndef nll(inp, targ):\n return - inp[range(targ.shape[0]), targ].mean()\n\n\nsm_pred = log_softmax(pred)\nloss = nll(sm_pred, y_train)\nloss\n\ntensor(2.3028, grad_fn=<NegBackward0>)\n\n\n# compare it with native pytorch implementation of nll.\n\nloss_pytorch = F.nll_loss(F.log_softmax(pred, -1), y_train)\nloss_pytorch\n\ntensor(2.3028, grad_fn=<NllLossBackward0>)\n\n\n# nll and softmax combined implementation.\n\nloss_pytorch = F.cross_entropy(pred, y_train)\nloss_pytorch\n\ntensor(2.3028, grad_fn=<NllLossBackward0>)\n\n\n# batch training.\n# accuracy.\n\ndef accuracy(out, yb):\n return (out.argmax(1)==yb).float().mean()\n\nloss_func = F.cross_entropy\n\n\nbs = 50\nxb = x_train[:bs]\nyb = y_train[:bs]\npreds = model(xb)\npreds[0]\n\ntensor([-0.0843, -0.0098, 0.1629, 0.1187, 0.1040, 0.0934, -0.1870, -0.0530,\n -0.1361, -0.0224], grad_fn=<SelectBackward0>)\n\n\n\nloss_func(preds, yb)\n\ntensor(2.2846, grad_fn=<NllLossBackward0>)\n\n\n\naccuracy(preds, yb)\n\ntensor(0.1400)\n\n\n\ndef report(loss, preds, yb):\n print(f\"loss: {loss:.2f}, accuracy: {accuracy(preds, yb):.2f}\")\n\n\nreport(loss, preds, yb)\n\nloss: 2.30, accuracy: 0.14\n\n\n\nn, m = x_train.shape\nlr = 0.5\nepochs = 3\nxb,yb = x_train[:bs], y_train[:bs]\npreds = model(xb)\nloss = loss_func(preds, yb)\nreport(loss, preds, yb)\n\nloss: 2.28, accuracy: 0.14\n\n\n\nfor epoch in range(epochs):\n for i in range(0, n, bs):\n s = slice(i, min(i+bs, n))\n xb,yb = x_train[s],y_train[s]\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n with torch.no_grad():\n for l in model.layers:\n if hasattr(l, 'weight'):\n l.weight -= l.weight.grad * lr\n l.bias -= l.bias.grad * lr\n l.weight.grad.zero_()\n l.bias.grad.zero_()\n report(loss, preds, yb)\n\nloss: 0.17, accuracy: 0.94\nloss: 0.13, accuracy: 0.94\nloss: 0.13, accuracy: 0.96\n\n\n\n# parameters\n\nm1 = nn.Module()\nm1.foo = nn.Linear(3, 4)\nm1.boo = 'hey'\nm1\n\nModule(\n (foo): Linear(in_features=3, out_features=4, bias=True)\n)\n\n\n\nlist(m1.named_children())\n\n[('foo', Linear(in_features=3, out_features=4, bias=True))]\n\n\n\nlist(m1.parameters())\n\n[Parameter containing:\n tensor([[-0.4626, -0.5572, -0.2930],\n [-0.2142, 0.2954, -0.5759],\n [-0.0873, 0.5067, 0.0329],\n [ 0.1627, 0.2251, -0.2415]], requires_grad=True),\n Parameter containing:\n tensor([-0.4074, 0.0654, 0.3297, -0.2555], requires_grad=True)]\n\n\n\nclass MLP(nn.Module):\n def __init__(self, n_in, n_h, n_out):\n super().__init__()\n self.l1 = nn.Linear(n_in, n_h)\n self.relu = nn.ReLU()\n self.l2 = nn.Linear(n_h, n_out)\n \n def forward(self, x):\n return self.l2(self.relu(self.l1(x)))\n\n\nmodel = MLP(n_in, n_h, 10)\nmodel\n\nMLP(\n (l1): Linear(in_features=784, out_features=50, bias=True)\n (relu): ReLU()\n (l2): Linear(in_features=50, out_features=10, bias=True)\n)\n\n\n\nfor name, l in model.named_children():\n print(f\"{name}: {l}\")\n\nl1: Linear(in_features=784, out_features=50, bias=True)\nrelu: ReLU()\nl2: Linear(in_features=50, out_features=10, bias=True)\n\n\n\nfor p in model.parameters():\n print(p.shape)\n\ntorch.Size([50, 784])\ntorch.Size([50])\ntorch.Size([10, 50])\ntorch.Size([10])\n\n\n\ndef fit():\n for epoch in range(epochs):\n for i in range(0, n, bs):\n s = slice(i, min(i+bs, n))\n xb,yb = x_train[s], y_train[s]\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n with torch.no_grad():\n for p in model.parameters():\n p -= p.grad * lr\n model.zero_grad()\n report(loss, preds, yb)\n\n\nfit()\n\nloss: 0.02, accuracy: 1.00\nloss: 0.05, accuracy: 0.98\nloss: 0.03, accuracy: 1.00\n\n\n# nn.Module behind the scene\n\nclass MyModule:\n def __init__(self, n_in, n_h, n_out):\n self._modules = {}\n self.l1 = nn.Linear(n_in, n_h)\n self.l2 = nn.Linear(n_h, n_out)\n self.relu = nn.ReLU()\n \n def __setattr__(self, k, v):\n if not k.startswith('_'):\n self._modules[k] = v\n \n super().__setattr__(k, v)\n \n def __repr__(self):\n return f\"{self._modules}\"\n \n def parameters(self):\n for l in self._modules.values():\n yield from l.parameters()\n\n\nmdl = MyModule(n_in, n_h, n_o)\nmdl\n\n{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}\n\n\n\nfor p in mdl.parameters():\n print(p.shape)\n\ntorch.Size([50, 784])\ntorch.Size([50])\ntorch.Size([10, 50])\ntorch.Size([10])\n\n\n# registering modules\n\nfrom functools import reduce\n\n\nlayers = [nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o)]\n\n\nclass Model(nn.Module):\n def __init__(self, layers):\n super().__init__()\n self.layers = layers\n for i,l in enumerate(self.layers):\n self.add_module(f\"layer_{i}\", l)\n \n def forward(self, x):\n return reduce(lambda val, layer: layer(val), self.layers, x)\n\n\nmodel = Model(layers)\nmodel\n\nModel(\n (layer_0): Linear(in_features=784, out_features=50, bias=True)\n (layer_1): ReLU()\n (layer_2): Linear(in_features=50, out_features=10, bias=True)\n)\n\n\n\nmodel(xb).shape\n\ntorch.Size([50, 10])\n\n\n# nn.ModuleList\n\nclass SequentialModel(nn.Module):\n def __init__(self, layers):\n super().__init__()\n self.layers = nn.ModuleList(layers)\n \n def forward(self, x):\n for l in self.layers:\n x = l(x)\n return x\n\n\nmodel = SequentialModel(layers)\nmodel(xb).shape\n\ntorch.Size([50, 10])\n\n\n# nn.Sequential\n\nmodel = nn.Sequential(*layers)\n\n\nfit()\n\nloss: 0.14, accuracy: 0.96\nloss: 0.11, accuracy: 0.96\nloss: 0.05, accuracy: 1.00\n\n\n\nmodel\n\nSequential(\n (0): Linear(in_features=784, out_features=50, bias=True)\n (1): ReLU()\n (2): Linear(in_features=50, out_features=10, bias=True)\n)\n\n\n# optim\n\nclass Optimizer:\n def __init__(self, params, lr=0.5):\n self.params, self.lr = list(params), lr\n \n def step(self):\n with torch.no_grad():\n for p in self.params:\n p -= p.grad * self.lr\n\n def zero_grad(self):\n for p in self.params:\n p.grad.data.zero_()\n\n\nmodel = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))\n\n\nopt = Optimizer(model.parameters(), lr=lr)\n\n\nfor epoch in range(epochs):\n for i in range(0, n, bs):\n s = slice(i, min(i+bs, n))\n xb,yb = x_train[s],y_train[s]\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n opt.step()\n opt.zero_grad()\n report(loss, preds, yb)\n\nloss: 0.13, accuracy: 0.96\nloss: 0.12, accuracy: 0.92\nloss: 0.08, accuracy: 0.96\n\n\n\nfrom torch import optim\n\n\ndef get_model():\n model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_o))\n opt = optim.SGD(model.parameters(), lr=lr)\n return opt, model\n\n\nopt, model = get_model()\nloss_func(model(xb), yb)\n\ntensor(2.2912, grad_fn=<NllLossBackward0>)\n\n\n\nfor epoch in range(epochs):\n for i in range(0, n, bs):\n s = slice(i, min(i+bs, n))\n xb,yb = x_train[s],y_train[s]\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n opt.step()\n opt.zero_grad()\n report(loss, preds, yb)\n\nloss: 0.15, accuracy: 0.96\nloss: 0.11, accuracy: 0.96\nloss: 0.06, accuracy: 1.00\n\n\n# dataset\n\n\nDataset\n\n Dataset (x, y)\n\nInitialize self. See help(type(self)) for accurate signature.\n\ntrain_ds, valid_ds = Dataset(x_train, y_train), Dataset(x_test, y_test)\n\n\nopt, model = get_model()\n\n\nfor epoch in range(epochs):\n for i in range(0, n, bs):\n xb,yb = train_ds[i: min(i+bs, n)]\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n opt.step()\n opt.zero_grad()\n report(loss, preds, yb)\n\nloss: 0.13, accuracy: 0.96\nloss: 0.10, accuracy: 0.98\nloss: 0.12, accuracy: 0.96\n\n\n# data loader\n\nclass DataLoader:\n def __init__(self, ds, bs):\n self.ds, self.bs = ds, bs\n \n def __iter__(self):\n for i in range(0, len(self.ds), self.bs):\n yield self.ds[i:i+self.bs]\n\n\ntrain_dl = DataLoader(train_ds, bs)\nvalid_dl = DataLoader(valid_ds, bs)\n\n\nxb, yb = next(iter(train_dl))\nxb.shape\n\ntorch.Size([50, 784])\n\n\n\nopt, model = get_model()\n\n\ndef fit():\n for epoch in range(epochs):\n for xb,yb in train_dl:\n preds = model(xb)\n loss = loss_func(preds, yb)\n loss.backward()\n opt.step()\n opt.zero_grad()\n report(loss, preds, yb)\n\n\nfit()\n\nloss: 0.16, accuracy: 0.96\nloss: 0.11, accuracy: 0.98\nloss: 0.07, accuracy: 0.98\n\n\n\n# random sampling\n\nimport random\n\n\nclass Sampler:\n def __init__(self, ds, shuffle=False):\n self.n, self.shuffle = len(ds), shuffle\n \n def __iter__(self):\n res = list(range(self.n))\n if self.shuffle:\n random.shuffle(res)\n return iter(res)\n\n\nfrom itertools import islice\n\n\nss = Sampler(train_ds)\n\n\nlist(islice(ss, 5))\n\n[0, 1, 2, 3, 4]\n\n\n\nimport fastcore.all as fc\n\n\nclass BatchSampler:\n def __init__(self, sampler, bs, drop_last=False):\n fc.store_attr()\n \n def __iter__(self):\n yield from fc.chunked(iter(self.sampler), self.bs, drop_last=self.drop_last)\n\n\nbatches = BatchSampler(ss, 5)\nlist(islice(iter(batches), 3))\n\n[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]\n\n\n\ndef collate(b):\n xs, ys = zip(*b)\n return torch.stack(xs), torch.stack(ys)\n\n\nclass DataLoader:\n def __init__(self, ds, batchs, collate_fn=collate):\n fc.store_attr()\n \n def __iter__(self):\n yield from (self.collate_fn(self.ds[i] for i in b) for b in self.batchs)\n\n\ntrain_sampler = BatchSampler(Sampler(train_ds, shuffle=True), bs)\nvalid_sampler = BatchSampler(Sampler(valid_ds, shuffle=True), bs)\n\n\ntrain_dl = DataLoader(train_ds, train_sampler)\nvalid_dl = DataLoader(valid_ds, valid_sampler)\n\n\nxb, yb = next(iter(valid_dl))\nxb.shape, yb.shape\n\n(torch.Size([50, 784]), torch.Size([50]))\n\n\n\nplt.imshow(xb[0].view(28, 28));\nplt.axis('off');\n\n\n\n\n\n\n\n\n\nopt, model = get_model()\n\n\nfit()\n\nloss: 0.11, accuracy: 0.94\nloss: 0.27, accuracy: 0.96\nloss: 0.03, accuracy: 1.00\n\n\n\n# multiprocessing dataloader\n\nimport torch.multiprocessing as mp\n\n\nclass DataLoader:\n def __init__(self, ds, batchs, collate_fn=collate, num_workers=1):\n fc.store_attr()\n \n def __iter__(self):\n with mp.Pool(self.num_workers) as ex:\n yield from ex.map(self.ds.__getitem__, iter(self.batchs))\n\n\ntrain_dl = DataLoader(train_ds, batchs=train_sampler)\n\n\nxb, yb = next(iter(train_dl))\nplt.imshow(xb[0].view(28, 28));\nplt.axis('off');\n\n\n\n\n\n\n\n\n# pytorch dataloaders\n\nt = RandomSampler(train_ds)\n\n\nnext(iter(t))\n\n24797\n\n\n\nt = BatchSampler(train_ds, batch_size=2, drop_last=False)\n\nk = next(iter(t))\nprint(len(k))\nfor ele in k:\n print(ele[0].shape, ele[1])\n\n2\ntorch.Size([784]) tensor(5)\ntorch.Size([784]) tensor(0)\n\n\n\nt = BatchSampler(RandomSampler(train_ds), batch_size=2, drop_last=False)\n\nk = next(iter(t))\nprint(len(k))\nfor ele in k:\n print(ele)\n\n2\n33683\n36592\n\n\n\ntrain_samp = BatchSampler(RandomSampler(train_ds), bs, drop_last=False)\nvalid_samp = BatchSampler(RandomSampler(valid_ds), bs, drop_last=False)\n\n\ntrain_dl = DataLoader(train_ds, batch_sampler=train_samp, collate_fn=collate)\nvalid_dl = DataLoader(valid_ds, batch_sampler=valid_samp, collate_fn=collate)\n\n\nopt, model = get_model()\nfit()\n\nloss: 0.20, accuracy: 0.94\nloss: 0.11, accuracy: 0.98\nloss: 0.20, accuracy: 0.98\n\n\n\ntrain_dl = DataLoader(train_ds, bs, shuffle=True, num_workers=2, drop_last=True)\nvalid_dl = DataLoader(valid_ds, bs, shuffle=False, num_workers=2)\n\n\nopt, model = get_model()\nfit()\n\nloss: 0.08, accuracy: 0.98\nloss: 0.31, accuracy: 0.86\nloss: 0.11, accuracy: 0.98\n\n\n\n# validation\n\n\n\nfit\n\n fit (epochs, model, loss_func, opt, train_dl, valid_ld)\n\n\n\n\nget_dls\n\n get_dls (train_ds, valid_ds, bs, **kwargs)\n\n\ntrain_dl, valid_dl = get_dls(train_ds, valid_ds, bs)\nopt, model = get_model()\n\n\n\n\n0 0.1775239165313542 0.948100003004074\n1 0.1179210783354938 0.9646000063419342\n2 0.11550588405691087 0.9665000039339066\n3 0.10593999677803367 0.9698000079393387\n4 0.10098711441038176 0.9727000087499619\nCPU times: user 17.8 s, sys: 16.1 s, total: 33.8 s\nWall time: 4.71 s" } ] \ No newline at end of file diff --git a/_proc/_docs/sitemap.xml b/_proc/_docs/sitemap.xml index e6779894..b6ac0702 100644 --- a/_proc/_docs/sitemap.xml +++ b/_proc/_docs/sitemap.xml @@ -2,10 +2,14 @@ https://arun477.github.io/practice_deep_learning/core.html - 2024-02-19T14:29:36.449Z + 2024-02-19T14:48:35.979Z https://arun477.github.io/practice_deep_learning/index.html - 2024-02-19T14:29:36.456Z + 2024-02-19T15:05:25.663Z + + + https://arun477.github.io/practice_deep_learning/mini_batch_training.html + 2024-02-19T15:03:49.698Z diff --git a/_proc/index.ipynb b/_proc/index.ipynb index a2c83993..07d8d389 100644 --- a/_proc/index.ipynb +++ b/_proc/index.ipynb @@ -1,84 +1,17 @@ { "cells": [ - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "---\n", - "description: \"Deep Learning Portal \\U0001F525 This repository contains implementation\\\n", - " \\ code for important research papers and starter guides for common deep learning\\\n", - " \\ tools.\"\n", - "output-file: index.html\n", - "title: practice_deep_learning\n", - "\n", - "---\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This file will become your README and also the index of your documentation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Install" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```sh\n", - "pip install practice_deep_learning\n", - "```" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## How to use" + " This repository contains implementation code for important research papers and starter guides for common deep learning tools." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Fill me in please! Don't forget code examples:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "language": "python" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "1+1" + "" ] }, { diff --git a/_proc/sidebar.yml b/_proc/sidebar.yml index 45222d2c..1390528d 100644 --- a/_proc/sidebar.yml +++ b/_proc/sidebar.yml @@ -2,4 +2,3 @@ website: sidebar: contents: - index.ipynb - - 00_core.ipynb diff --git a/_proc/sidebar.yml.bak b/_proc/sidebar.yml.bak new file mode 100644 index 00000000..1390528d --- /dev/null +++ b/_proc/sidebar.yml.bak @@ -0,0 +1,4 @@ +website: + sidebar: + contents: + - index.ipynb diff --git a/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb b/nbs/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb similarity index 91% rename from .ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb rename to nbs/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb index de5817f5..14e5e454 100644 --- a/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb +++ b/nbs/.ipynb_checkpoints/04_mini_batch_training-checkpoint.ipynb @@ -2,11 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "a5c0e4d0", "metadata": {}, "outputs": [], "source": [ + "#| default_exp training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dc75e7e", + "metadata": {}, + "outputs": [], + "source": [ + "#| export\n", + "\n", "import torch, torch.nn as nn\n", "import torch.nn.functional as F\n", "from pathlib import Path\n", @@ -15,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "0b0863e2", "metadata": {}, "outputs": [ @@ -28,13 +40,13 @@ " torch.Size([10000]))" ] }, - "execution_count": 7, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data_path = Path('data/mnist.pkl.gz')\n", + "data_path = Path('../data/mnist.pkl.gz')\n", "with gzip.open(data_path, 'r') as f:\n", " ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') \n", "x_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))\n", @@ -43,13 +55,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "ede327b7", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -80,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "406daad9", "metadata": {}, "outputs": [], @@ -98,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": null, "id": "e2f3649f", "metadata": {}, "outputs": [ @@ -108,7 +120,7 @@ "torch.Size([50000, 10])" ] }, - "execution_count": 119, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -136,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": null, "id": "84804a8f", "metadata": {}, "outputs": [], @@ -147,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": null, "id": "ea765bfa", "metadata": {}, "outputs": [ @@ -164,7 +176,7 @@ " grad_fn=)" ] }, - "execution_count": 121, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -186,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": null, "id": "a1f31278", "metadata": {}, "outputs": [], @@ -197,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": null, "id": "6a69a4cf", "metadata": {}, "outputs": [ @@ -214,7 +226,7 @@ " grad_fn=)" ] }, - "execution_count": 123, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -237,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": null, "id": "20df0377", "metadata": {}, "outputs": [], @@ -249,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "id": "2ae6ab2e", "metadata": {}, "outputs": [], @@ -260,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": null, "id": "cc21ccc6", "metadata": {}, "outputs": [ @@ -277,7 +289,7 @@ " grad_fn=)" ] }, - "execution_count": 126, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": null, "id": "b6b7ad06", "metadata": {}, "outputs": [], @@ -310,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": null, "id": "02f8c028", "metadata": {}, "outputs": [ @@ -327,7 +339,7 @@ " grad_fn=)" ] }, - "execution_count": 128, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -350,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": null, "id": "33be78c3", "metadata": {}, "outputs": [], @@ -361,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": null, "id": "fc5bb9c7", "metadata": {}, "outputs": [ @@ -371,7 +383,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 130, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -395,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": null, "id": "0edec9c1", "metadata": {}, "outputs": [ @@ -405,7 +417,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 131, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -428,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": null, "id": "082907a1", "metadata": {}, "outputs": [ @@ -438,7 +450,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 132, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -472,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": null, "id": "517b1844", "metadata": {}, "outputs": [], @@ -485,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": null, "id": "7b041157", "metadata": {}, "outputs": [ @@ -496,7 +508,7 @@ " -0.1361, -0.0224], grad_fn=)" ] }, - "execution_count": 134, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -511,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": null, "id": "633f7626", "metadata": {}, "outputs": [ @@ -521,7 +533,7 @@ "tensor(2.2846, grad_fn=)" ] }, - "execution_count": 135, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -532,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": null, "id": "6b6f5946", "metadata": {}, "outputs": [ @@ -542,7 +554,7 @@ "tensor(0.1400)" ] }, - "execution_count": 136, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -553,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": null, "id": "ee7b70dc", "metadata": {}, "outputs": [], @@ -564,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": null, "id": "87f623a4", "metadata": {}, "outputs": [ @@ -582,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": null, "id": "65dd9280", "metadata": {}, "outputs": [ @@ -606,7 +618,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": null, "id": "c04f10be", "metadata": {}, "outputs": [ @@ -652,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": null, "id": "339d1ffc", "metadata": {}, "outputs": [ @@ -664,7 +676,7 @@ ")" ] }, - "execution_count": 147, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -678,7 +690,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": null, "id": "97def1e8", "metadata": {}, "outputs": [ @@ -688,7 +700,7 @@ "[('foo', Linear(in_features=3, out_features=4, bias=True))]" ] }, - "execution_count": 148, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -699,11 +711,9 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": null, "id": "32e0a480", - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [ { "data": { @@ -717,7 +727,7 @@ " tensor([-0.4074, 0.0654, 0.3297, -0.2555], requires_grad=True)]" ] }, - "execution_count": 149, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -728,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": null, "id": "9d920d80", "metadata": {}, "outputs": [], @@ -746,7 +756,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": null, "id": "2cb6ca4a", "metadata": {}, "outputs": [ @@ -760,7 +770,7 @@ ")" ] }, - "execution_count": 168, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -772,7 +782,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": null, "id": "2aef5321", "metadata": {}, "outputs": [ @@ -793,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": null, "id": "22457bf7", "metadata": {}, "outputs": [ @@ -815,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": null, "id": "32bd753a", "metadata": {}, "outputs": [], @@ -837,7 +847,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": null, "id": "6a67b005", "metadata": {}, "outputs": [ @@ -868,7 +878,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": null, "id": "a582a32f", "metadata": {}, "outputs": [], @@ -896,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 183, + "execution_count": null, "id": "7bd5ce9e", "metadata": {}, "outputs": [ @@ -906,7 +916,7 @@ "{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}" ] }, - "execution_count": 183, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -918,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": null, "id": "a8b93c6b", "metadata": {}, "outputs": [ @@ -951,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": null, "id": "23d70dcd", "metadata": {}, "outputs": [], @@ -961,7 +971,7 @@ }, { "cell_type": "code", - "execution_count": 187, + "execution_count": null, "id": "b382bbb5", "metadata": {}, "outputs": [], @@ -971,7 +981,7 @@ }, { "cell_type": "code", - "execution_count": 188, + "execution_count": null, "id": "f55b47ea", "metadata": {}, "outputs": [], @@ -989,7 +999,7 @@ }, { "cell_type": "code", - "execution_count": 189, + "execution_count": null, "id": "6d37a750", "metadata": {}, "outputs": [ @@ -1003,7 +1013,7 @@ ")" ] }, - "execution_count": 189, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1015,7 +1025,7 @@ }, { "cell_type": "code", - "execution_count": 190, + "execution_count": null, "id": "55f5f543", "metadata": {}, "outputs": [ @@ -1025,7 +1035,7 @@ "torch.Size([50, 10])" ] }, - "execution_count": 190, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1047,7 +1057,7 @@ }, { "cell_type": "code", - "execution_count": 191, + "execution_count": null, "id": "3506dc88", "metadata": {}, "outputs": [], @@ -1065,7 +1075,7 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": null, "id": "58c2e8ac", "metadata": {}, "outputs": [ @@ -1075,7 +1085,7 @@ "torch.Size([50, 10])" ] }, - "execution_count": 192, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1098,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": 193, + "execution_count": null, "id": "7ce1a92e", "metadata": {}, "outputs": [], @@ -1108,7 +1118,7 @@ }, { "cell_type": "code", - "execution_count": 194, + "execution_count": null, "id": "f80dc0e5", "metadata": {}, "outputs": [ @@ -1128,7 +1138,7 @@ }, { "cell_type": "code", - "execution_count": 195, + "execution_count": null, "id": "e81d3544", "metadata": {}, "outputs": [ @@ -1142,7 +1152,7 @@ ")" ] }, - "execution_count": 195, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1164,7 +1174,7 @@ }, { "cell_type": "code", - "execution_count": 200, + "execution_count": null, "id": "39fdd1f0", "metadata": {}, "outputs": [], @@ -1185,7 +1195,7 @@ }, { "cell_type": "code", - "execution_count": 201, + "execution_count": null, "id": "c3e3464d", "metadata": {}, "outputs": [], @@ -1195,7 +1205,7 @@ }, { "cell_type": "code", - "execution_count": 202, + "execution_count": null, "id": "79f0305d", "metadata": {}, "outputs": [], @@ -1205,7 +1215,7 @@ }, { "cell_type": "code", - "execution_count": 203, + "execution_count": null, "id": "1ea522e3", "metadata": {}, "outputs": [ @@ -1234,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 204, + "execution_count": null, "id": "5a693464", "metadata": {}, "outputs": [], @@ -1244,7 +1254,7 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": null, "id": "99cdc0f1", "metadata": {}, "outputs": [], @@ -1257,7 +1267,7 @@ }, { "cell_type": "code", - "execution_count": 210, + "execution_count": null, "id": "2e7dd21f", "metadata": {}, "outputs": [ @@ -1267,7 +1277,7 @@ "tensor(2.2912, grad_fn=)" ] }, - "execution_count": 210, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1279,7 +1289,7 @@ }, { "cell_type": "code", - "execution_count": 211, + "execution_count": null, "id": "ff4db4e6", "metadata": {}, "outputs": [ @@ -1319,11 +1329,13 @@ }, { "cell_type": "code", - "execution_count": 220, + "execution_count": null, "id": "904dbf15", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "class Dataset:\n", " def __init__(self, x, y):\n", " self.x, self.y = x, y\n", @@ -1337,7 +1349,7 @@ }, { "cell_type": "code", - "execution_count": 221, + "execution_count": null, "id": "9a8c8ad6", "metadata": {}, "outputs": [], @@ -1347,7 +1359,7 @@ }, { "cell_type": "code", - "execution_count": 222, + "execution_count": null, "id": "8b6f44b2", "metadata": {}, "outputs": [], @@ -1357,7 +1369,7 @@ }, { "cell_type": "code", - "execution_count": 223, + "execution_count": null, "id": "f2045956", "metadata": {}, "outputs": [ @@ -1396,7 +1408,7 @@ }, { "cell_type": "code", - "execution_count": 248, + "execution_count": null, "id": "dc723267", "metadata": {}, "outputs": [], @@ -1412,7 +1424,7 @@ }, { "cell_type": "code", - "execution_count": 249, + "execution_count": null, "id": "cb3d44ec", "metadata": {}, "outputs": [], @@ -1423,7 +1435,7 @@ }, { "cell_type": "code", - "execution_count": 250, + "execution_count": null, "id": "131db88a", "metadata": {}, "outputs": [ @@ -1433,7 +1445,7 @@ "torch.Size([50, 784])" ] }, - "execution_count": 250, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1445,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 251, + "execution_count": null, "id": "eb78352f", "metadata": {}, "outputs": [], @@ -1455,7 +1467,7 @@ }, { "cell_type": "code", - "execution_count": 252, + "execution_count": null, "id": "dee72fe9", "metadata": {}, "outputs": [], @@ -1473,7 +1485,7 @@ }, { "cell_type": "code", - "execution_count": 253, + "execution_count": null, "id": "dfa38cc7", "metadata": {}, "outputs": [ @@ -1505,7 +1517,7 @@ }, { "cell_type": "code", - "execution_count": 254, + "execution_count": null, "id": "dcc99a02", "metadata": {}, "outputs": [], @@ -1515,7 +1527,7 @@ }, { "cell_type": "code", - "execution_count": 269, + "execution_count": null, "id": "3460b690", "metadata": {}, "outputs": [], @@ -1533,7 +1545,7 @@ }, { "cell_type": "code", - "execution_count": 270, + "execution_count": null, "id": "bf506deb", "metadata": {}, "outputs": [], @@ -1543,7 +1555,7 @@ }, { "cell_type": "code", - "execution_count": 271, + "execution_count": null, "id": "270c8310", "metadata": {}, "outputs": [], @@ -1553,7 +1565,7 @@ }, { "cell_type": "code", - "execution_count": 276, + "execution_count": null, "id": "d86aa1c9", "metadata": {}, "outputs": [ @@ -1563,7 +1575,7 @@ "[0, 1, 2, 3, 4]" ] }, - "execution_count": 276, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1574,7 +1586,7 @@ }, { "cell_type": "code", - "execution_count": 277, + "execution_count": null, "id": "2a2f4c45", "metadata": {}, "outputs": [], @@ -1584,7 +1596,7 @@ }, { "cell_type": "code", - "execution_count": 278, + "execution_count": null, "id": "0d49229c", "metadata": {}, "outputs": [], @@ -1599,7 +1611,7 @@ }, { "cell_type": "code", - "execution_count": 282, + "execution_count": null, "id": "013b419e", "metadata": {}, "outputs": [ @@ -1609,7 +1621,7 @@ "[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]" ] }, - "execution_count": 282, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1621,7 +1633,7 @@ }, { "cell_type": "code", - "execution_count": 320, + "execution_count": null, "id": "9f8c9879", "metadata": {}, "outputs": [], @@ -1633,7 +1645,7 @@ }, { "cell_type": "code", - "execution_count": 336, + "execution_count": null, "id": "dd483f62", "metadata": {}, "outputs": [], @@ -1648,7 +1660,7 @@ }, { "cell_type": "code", - "execution_count": 347, + "execution_count": null, "id": "62297d8d", "metadata": {}, "outputs": [], @@ -1659,7 +1671,7 @@ }, { "cell_type": "code", - "execution_count": 348, + "execution_count": null, "id": "e7bcb939", "metadata": {}, "outputs": [], @@ -1670,7 +1682,7 @@ }, { "cell_type": "code", - "execution_count": 349, + "execution_count": null, "id": "89059be4", "metadata": {}, "outputs": [ @@ -1680,7 +1692,7 @@ "(torch.Size([50, 784]), torch.Size([50]))" ] }, - "execution_count": 349, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1692,13 +1704,13 @@ }, { "cell_type": "code", - "execution_count": 350, + "execution_count": null, "id": "0458cf76", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1716,7 +1728,7 @@ }, { "cell_type": "code", - "execution_count": 351, + "execution_count": null, "id": "4e8921d8", "metadata": {}, "outputs": [], @@ -1726,7 +1738,7 @@ }, { "cell_type": "code", - "execution_count": 352, + "execution_count": null, "id": "2740be53", "metadata": {}, "outputs": [ @@ -1758,7 +1770,7 @@ }, { "cell_type": "code", - "execution_count": 353, + "execution_count": null, "id": "cc2488a8", "metadata": {}, "outputs": [], @@ -1768,7 +1780,7 @@ }, { "cell_type": "code", - "execution_count": 359, + "execution_count": null, "id": "febc23a9", "metadata": {}, "outputs": [], @@ -1784,7 +1796,7 @@ }, { "cell_type": "code", - "execution_count": 360, + "execution_count": null, "id": "42c45253", "metadata": {}, "outputs": [], @@ -1794,13 +1806,13 @@ }, { "cell_type": "code", - "execution_count": 363, + "execution_count": null, "id": "de70d5ab", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -1830,17 +1842,19 @@ }, { "cell_type": "code", - "execution_count": 365, + "execution_count": null, "id": "4184f878", "metadata": {}, "outputs": [], "source": [ + "#| export\n", + "\n", "from torch.utils.data import DataLoader, SequentialSampler, RandomSampler, BatchSampler" ] }, { "cell_type": "code", - "execution_count": 366, + "execution_count": null, "id": "fc2d3ab3", "metadata": {}, "outputs": [], @@ -1850,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 376, + "execution_count": null, "id": "9b4d074a", "metadata": {}, "outputs": [ @@ -1860,7 +1874,7 @@ "24797" ] }, - "execution_count": 376, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1871,7 +1885,7 @@ }, { "cell_type": "code", - "execution_count": 412, + "execution_count": null, "id": "92e52220", "metadata": {}, "outputs": [ @@ -1896,7 +1910,7 @@ }, { "cell_type": "code", - "execution_count": 411, + "execution_count": null, "id": "02e1fb43", "metadata": {}, "outputs": [ @@ -1921,7 +1935,7 @@ }, { "cell_type": "code", - "execution_count": 413, + "execution_count": null, "id": "c230dcf8", "metadata": {}, "outputs": [], @@ -1932,7 +1946,7 @@ }, { "cell_type": "code", - "execution_count": 414, + "execution_count": null, "id": "d7556e64", "metadata": {}, "outputs": [], @@ -1943,7 +1957,7 @@ }, { "cell_type": "code", - "execution_count": 415, + "execution_count": null, "id": "28492c75", "metadata": {}, "outputs": [ @@ -1964,7 +1978,7 @@ }, { "cell_type": "code", - "execution_count": 416, + "execution_count": null, "id": "f764cc92", "metadata": {}, "outputs": [], @@ -1975,7 +1989,7 @@ }, { "cell_type": "code", - "execution_count": 417, + "execution_count": null, "id": "1c69f400", "metadata": {}, "outputs": [ @@ -2008,11 +2022,13 @@ }, { "cell_type": "code", - "execution_count": 436, + "execution_count": null, "id": "6fb1f426", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "def fit(epochs, model, loss_func, opt, train_dl, valid_ld):\n", " for epoch in range(epochs):\n", " model.train()\n", @@ -2039,11 +2055,13 @@ }, { "cell_type": "code", - "execution_count": 437, + "execution_count": null, "id": "3d422ab1", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "def get_dls(train_ds, valid_ds, bs, **kwargs):\n", " return (\n", " DataLoader(train_ds, bs, shuffle=True, **kwargs),\n", @@ -2053,7 +2071,7 @@ }, { "cell_type": "code", - "execution_count": 438, + "execution_count": null, "id": "5e110840", "metadata": {}, "outputs": [], @@ -2064,7 +2082,7 @@ }, { "cell_type": "code", - "execution_count": 439, + "execution_count": null, "id": "a9d23182", "metadata": {}, "outputs": [ @@ -2092,26 +2110,25 @@ "id": "a5d3d1ca", "metadata": {}, "outputs": [], + "source": [ + "#| hide\n", + "import nbdev; nbdev.nbdev_export();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ba7d787", + "metadata": {}, + "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "python3", "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.9.7" } }, "nbformat": 4, diff --git a/nbs/.ipynb_checkpoints/index-checkpoint.ipynb b/nbs/.ipynb_checkpoints/index-checkpoint.ipynb new file mode 100644 index 00000000..a8525b1b --- /dev/null +++ b/nbs/.ipynb_checkpoints/index-checkpoint.ipynb @@ -0,0 +1,27 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " This repository contains implementation code for important research papers and starter guides for common deep learning tools." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "python3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/nbs/00_core.ipynb b/nbs/00_core.ipynb deleted file mode 100644 index 6671b713..00000000 --- a/nbs/00_core.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# core\n", - "\n", - "> Fill in a module description here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| default_exp core" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "from nbdev.showdoc import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| export\n", - "def foo(): pass" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "import nbdev; nbdev.nbdev_export()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "python3", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/04_mini_batch_training.ipynb b/nbs/04_mini_batch_training.ipynb similarity index 91% rename from 04_mini_batch_training.ipynb rename to nbs/04_mini_batch_training.ipynb index de5817f5..14e5e454 100644 --- a/04_mini_batch_training.ipynb +++ b/nbs/04_mini_batch_training.ipynb @@ -2,11 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "a5c0e4d0", "metadata": {}, "outputs": [], "source": [ + "#| default_exp training" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dc75e7e", + "metadata": {}, + "outputs": [], + "source": [ + "#| export\n", + "\n", "import torch, torch.nn as nn\n", "import torch.nn.functional as F\n", "from pathlib import Path\n", @@ -15,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "0b0863e2", "metadata": {}, "outputs": [ @@ -28,13 +40,13 @@ " torch.Size([10000]))" ] }, - "execution_count": 7, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data_path = Path('data/mnist.pkl.gz')\n", + "data_path = Path('../data/mnist.pkl.gz')\n", "with gzip.open(data_path, 'r') as f:\n", " ((x_train, y_train), (x_test, y_test), _) = pickle.load(f, encoding='latin') \n", "x_train, y_train, x_test, y_test = map(torch.tensor, (x_train, y_train, x_test, y_test))\n", @@ -43,13 +55,13 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "ede327b7", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAG3ElEQVR4nO3df6jVdx3H8Xu917lus21mWxssd1OXstmspJSJBqHtj/4o4iZj/2T0R1tuVAarEf3CYkEMzGx/DJYbtFp3LNof/UAiZNC8tRaLimZMJTbt1vWiK2fpzjn91R+D+33fPJ7Lfd3r4/GnL7/3fEGe9wt+OOf0dzqdPiDPgtm+AWBq4oRQ4oRQ4oRQ4oRQg9W4ZcGI/8qFGba/Pdo/1Z97ckIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUIocUKowdm+AV6rf7D+Jxl409IZff3nP3t949YaapfXLlv+93IfurO/3P92/yWN27PrHiuvnWidLvf3jO4s9xWfOVjus8GTE0KJE0KJE0KJE0KJE0KJE0KJE0I555zCwOqV5d5ZtLDcj22+otzPrG8+k1tyeX1e99TN9XnfbPrpK4vL/RvfvrXcx9Y82rgdOXemvPa+8S3lfu1TnXJP5MkJocQJocQJocQJocQJocQJoS7Ko5TWe99Z7vfv21vuNyxsfmvTfHau0yr3L+75aLkPnq6PMzaM7mjcFr/0anntoon6qGXombFyT+TJCaHECaHECaHECaHECaHECaHECaEuynPORc8fK/ff/vu6cr9h4Xgvb6endh5fX+6H/1V/tOa+5Y83bqfa9Tnl1d/6VbnPpLn3hrDpeXJCKHFCKHFCKHFCKHFCKHFCKHFCqP5Op/mEaMuCkfl4fDStye0byv3lW+uPrxz4/WXl/tyde877nv5n18Tby/03m+tzzNbJU+Xe2XBz43b07vLSvuHbnqv/AlPa3x6d8rsRPTkhlDghlDghlDghlDghlDghlDghlHPOLgwsfWO5t05MlvuRR5vPKv+46aHy2nd//a5yv2rv7L2nku4454Q5RpwQSpwQSpwQSpwQSpwQSpwQ6qL83NoL1Zo4cUHXn3u5++/3vPH2P5X7Px4YqH9Au/6OTXJ4ckIocUIocUIocUIocUIocUIoRymzYPU9hxq37WveV1773WW/KPfNI58s98WPHSx3cnhyQihxQihxQihxQihxQihxQihxQijnnLOg+hq+E3esLq/965Nnyv1zux4p989/5EPl3vnd5Y3bdV97ury2r/iYVc6fJyeEEieEEieEEieEEieEEieEEieE8hWAc8zkxzaU+/e+9M1yHx68tOvXvvGRHeW+8sHj5f7q4aNdv/Z85isAYY4RJ4QSJ4QSJ4QSJ4QSJ4QSJ4RyzjnPdG5ZW+5vuO/Fcv/+W3/e9Wuv+uXHy/1tX2l+H2tfX19f6y+Hu37tucw5J8wx4oRQ4oRQ4oRQ4oRQ4oRQ4oRQzjkvMgNXX1Xux7ataNzG7tldXrtgmt/1tx/ZWu6nNp4o9/nKOSfMMeKEUOKEUOKEUOKEUOKEUI5S+L/98MX6KwCH+i8p91c6Z8v9A3d9qvln/2isvHYuc5QCc4w4IZQ4IZQ4IZQ4IZQ4IZQ4IdTgbN8AvdXeuLbcXxipvwLwprVHG7fpzjGns2fyHeU+9ONnLujnzzeenBBKnBBKnBBKnBBKnBBKnBBKnBDKOWeY/nU3lfuhu+uzxgdvebjcN11av6fyQvync67cD04O1z+gfbyHdzP3eXJCKHFCKHFCKHFCKHFCKHFCKHFCKOecM2BweFm5v7D92sbty9t+UF774csmurqnXrh3fF25H9i9vtyvfLj+3Ftey5MTQokTQokTQokTQokTQokTQjlKmcLg9W8p91Pvuqbct331Z+X+iSueOO976pWdx+vjjqe/03xcsmTfr8trr2w7KuklT04IJU4IJU4IJU4IJU4IJU4IJU4INW/POQeveXPjNvnQ68tr7xg+UO63LR7v6p56YcdLG8v92QfWlvvSx/9Q7kv+6awyhScnhBInhBInhBInhBInhBInhBInhIo95zz7/vpjGM9+erLc713xk8Zt6+tOd3VPvTLeOtO4bXpyZ3ntqi/8udyXnKzPKdvlShJPTgglTgglTgglTgglTgglTgglTggVe8559IP1741Da0Zn7LX3nlxe7rsPbC33/lZ/ua/adaRxWzk+Vl7bKlfmE09OCCVOCCVOCCVOCCVOCCVOCCVOCNXf6XQaxy0LRppHoCf2t0enPBj35IRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ4oRQ5UdjArPHkxNCiRNCiRNCiRNCiRNCiRNC/RfikCH0Nym1vwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -80,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "406daad9", "metadata": {}, "outputs": [], @@ -98,7 +110,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": null, "id": "e2f3649f", "metadata": {}, "outputs": [ @@ -108,7 +120,7 @@ "torch.Size([50000, 10])" ] }, - "execution_count": 119, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -136,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": null, "id": "84804a8f", "metadata": {}, "outputs": [], @@ -147,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": null, "id": "ea765bfa", "metadata": {}, "outputs": [ @@ -164,7 +176,7 @@ " grad_fn=)" ] }, - "execution_count": 121, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -186,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": null, "id": "a1f31278", "metadata": {}, "outputs": [], @@ -197,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": null, "id": "6a69a4cf", "metadata": {}, "outputs": [ @@ -214,7 +226,7 @@ " grad_fn=)" ] }, - "execution_count": 123, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -237,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": null, "id": "20df0377", "metadata": {}, "outputs": [], @@ -249,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "id": "2ae6ab2e", "metadata": {}, "outputs": [], @@ -260,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 126, + "execution_count": null, "id": "cc21ccc6", "metadata": {}, "outputs": [ @@ -277,7 +289,7 @@ " grad_fn=)" ] }, - "execution_count": 126, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -299,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 127, + "execution_count": null, "id": "b6b7ad06", "metadata": {}, "outputs": [], @@ -310,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 128, + "execution_count": null, "id": "02f8c028", "metadata": {}, "outputs": [ @@ -327,7 +339,7 @@ " grad_fn=)" ] }, - "execution_count": 128, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -350,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": null, "id": "33be78c3", "metadata": {}, "outputs": [], @@ -361,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 130, + "execution_count": null, "id": "fc5bb9c7", "metadata": {}, "outputs": [ @@ -371,7 +383,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 130, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -395,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": null, "id": "0edec9c1", "metadata": {}, "outputs": [ @@ -405,7 +417,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 131, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -428,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": null, "id": "082907a1", "metadata": {}, "outputs": [ @@ -438,7 +450,7 @@ "tensor(2.3028, grad_fn=)" ] }, - "execution_count": 132, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -472,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 133, + "execution_count": null, "id": "517b1844", "metadata": {}, "outputs": [], @@ -485,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": null, "id": "7b041157", "metadata": {}, "outputs": [ @@ -496,7 +508,7 @@ " -0.1361, -0.0224], grad_fn=)" ] }, - "execution_count": 134, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -511,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": null, "id": "633f7626", "metadata": {}, "outputs": [ @@ -521,7 +533,7 @@ "tensor(2.2846, grad_fn=)" ] }, - "execution_count": 135, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -532,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 136, + "execution_count": null, "id": "6b6f5946", "metadata": {}, "outputs": [ @@ -542,7 +554,7 @@ "tensor(0.1400)" ] }, - "execution_count": 136, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -553,7 +565,7 @@ }, { "cell_type": "code", - "execution_count": 137, + "execution_count": null, "id": "ee7b70dc", "metadata": {}, "outputs": [], @@ -564,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 138, + "execution_count": null, "id": "87f623a4", "metadata": {}, "outputs": [ @@ -582,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 139, + "execution_count": null, "id": "65dd9280", "metadata": {}, "outputs": [ @@ -606,7 +618,7 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": null, "id": "c04f10be", "metadata": {}, "outputs": [ @@ -652,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 147, + "execution_count": null, "id": "339d1ffc", "metadata": {}, "outputs": [ @@ -664,7 +676,7 @@ ")" ] }, - "execution_count": 147, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -678,7 +690,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": null, "id": "97def1e8", "metadata": {}, "outputs": [ @@ -688,7 +700,7 @@ "[('foo', Linear(in_features=3, out_features=4, bias=True))]" ] }, - "execution_count": 148, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -699,11 +711,9 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": null, "id": "32e0a480", - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [ { "data": { @@ -717,7 +727,7 @@ " tensor([-0.4074, 0.0654, 0.3297, -0.2555], requires_grad=True)]" ] }, - "execution_count": 149, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -728,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": null, "id": "9d920d80", "metadata": {}, "outputs": [], @@ -746,7 +756,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": null, "id": "2cb6ca4a", "metadata": {}, "outputs": [ @@ -760,7 +770,7 @@ ")" ] }, - "execution_count": 168, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -772,7 +782,7 @@ }, { "cell_type": "code", - "execution_count": 169, + "execution_count": null, "id": "2aef5321", "metadata": {}, "outputs": [ @@ -793,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 170, + "execution_count": null, "id": "22457bf7", "metadata": {}, "outputs": [ @@ -815,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 175, + "execution_count": null, "id": "32bd753a", "metadata": {}, "outputs": [], @@ -837,7 +847,7 @@ }, { "cell_type": "code", - "execution_count": 176, + "execution_count": null, "id": "6a67b005", "metadata": {}, "outputs": [ @@ -868,7 +878,7 @@ }, { "cell_type": "code", - "execution_count": 180, + "execution_count": null, "id": "a582a32f", "metadata": {}, "outputs": [], @@ -896,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 183, + "execution_count": null, "id": "7bd5ce9e", "metadata": {}, "outputs": [ @@ -906,7 +916,7 @@ "{'l1': Linear(in_features=784, out_features=50, bias=True), 'l2': Linear(in_features=50, out_features=10, bias=True), 'relu': ReLU()}" ] }, - "execution_count": 183, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -918,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": null, "id": "a8b93c6b", "metadata": {}, "outputs": [ @@ -951,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": null, "id": "23d70dcd", "metadata": {}, "outputs": [], @@ -961,7 +971,7 @@ }, { "cell_type": "code", - "execution_count": 187, + "execution_count": null, "id": "b382bbb5", "metadata": {}, "outputs": [], @@ -971,7 +981,7 @@ }, { "cell_type": "code", - "execution_count": 188, + "execution_count": null, "id": "f55b47ea", "metadata": {}, "outputs": [], @@ -989,7 +999,7 @@ }, { "cell_type": "code", - "execution_count": 189, + "execution_count": null, "id": "6d37a750", "metadata": {}, "outputs": [ @@ -1003,7 +1013,7 @@ ")" ] }, - "execution_count": 189, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1015,7 +1025,7 @@ }, { "cell_type": "code", - "execution_count": 190, + "execution_count": null, "id": "55f5f543", "metadata": {}, "outputs": [ @@ -1025,7 +1035,7 @@ "torch.Size([50, 10])" ] }, - "execution_count": 190, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1047,7 +1057,7 @@ }, { "cell_type": "code", - "execution_count": 191, + "execution_count": null, "id": "3506dc88", "metadata": {}, "outputs": [], @@ -1065,7 +1075,7 @@ }, { "cell_type": "code", - "execution_count": 192, + "execution_count": null, "id": "58c2e8ac", "metadata": {}, "outputs": [ @@ -1075,7 +1085,7 @@ "torch.Size([50, 10])" ] }, - "execution_count": 192, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1098,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": 193, + "execution_count": null, "id": "7ce1a92e", "metadata": {}, "outputs": [], @@ -1108,7 +1118,7 @@ }, { "cell_type": "code", - "execution_count": 194, + "execution_count": null, "id": "f80dc0e5", "metadata": {}, "outputs": [ @@ -1128,7 +1138,7 @@ }, { "cell_type": "code", - "execution_count": 195, + "execution_count": null, "id": "e81d3544", "metadata": {}, "outputs": [ @@ -1142,7 +1152,7 @@ ")" ] }, - "execution_count": 195, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1164,7 +1174,7 @@ }, { "cell_type": "code", - "execution_count": 200, + "execution_count": null, "id": "39fdd1f0", "metadata": {}, "outputs": [], @@ -1185,7 +1195,7 @@ }, { "cell_type": "code", - "execution_count": 201, + "execution_count": null, "id": "c3e3464d", "metadata": {}, "outputs": [], @@ -1195,7 +1205,7 @@ }, { "cell_type": "code", - "execution_count": 202, + "execution_count": null, "id": "79f0305d", "metadata": {}, "outputs": [], @@ -1205,7 +1215,7 @@ }, { "cell_type": "code", - "execution_count": 203, + "execution_count": null, "id": "1ea522e3", "metadata": {}, "outputs": [ @@ -1234,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 204, + "execution_count": null, "id": "5a693464", "metadata": {}, "outputs": [], @@ -1244,7 +1254,7 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": null, "id": "99cdc0f1", "metadata": {}, "outputs": [], @@ -1257,7 +1267,7 @@ }, { "cell_type": "code", - "execution_count": 210, + "execution_count": null, "id": "2e7dd21f", "metadata": {}, "outputs": [ @@ -1267,7 +1277,7 @@ "tensor(2.2912, grad_fn=)" ] }, - "execution_count": 210, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1279,7 +1289,7 @@ }, { "cell_type": "code", - "execution_count": 211, + "execution_count": null, "id": "ff4db4e6", "metadata": {}, "outputs": [ @@ -1319,11 +1329,13 @@ }, { "cell_type": "code", - "execution_count": 220, + "execution_count": null, "id": "904dbf15", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "class Dataset:\n", " def __init__(self, x, y):\n", " self.x, self.y = x, y\n", @@ -1337,7 +1349,7 @@ }, { "cell_type": "code", - "execution_count": 221, + "execution_count": null, "id": "9a8c8ad6", "metadata": {}, "outputs": [], @@ -1347,7 +1359,7 @@ }, { "cell_type": "code", - "execution_count": 222, + "execution_count": null, "id": "8b6f44b2", "metadata": {}, "outputs": [], @@ -1357,7 +1369,7 @@ }, { "cell_type": "code", - "execution_count": 223, + "execution_count": null, "id": "f2045956", "metadata": {}, "outputs": [ @@ -1396,7 +1408,7 @@ }, { "cell_type": "code", - "execution_count": 248, + "execution_count": null, "id": "dc723267", "metadata": {}, "outputs": [], @@ -1412,7 +1424,7 @@ }, { "cell_type": "code", - "execution_count": 249, + "execution_count": null, "id": "cb3d44ec", "metadata": {}, "outputs": [], @@ -1423,7 +1435,7 @@ }, { "cell_type": "code", - "execution_count": 250, + "execution_count": null, "id": "131db88a", "metadata": {}, "outputs": [ @@ -1433,7 +1445,7 @@ "torch.Size([50, 784])" ] }, - "execution_count": 250, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1445,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 251, + "execution_count": null, "id": "eb78352f", "metadata": {}, "outputs": [], @@ -1455,7 +1467,7 @@ }, { "cell_type": "code", - "execution_count": 252, + "execution_count": null, "id": "dee72fe9", "metadata": {}, "outputs": [], @@ -1473,7 +1485,7 @@ }, { "cell_type": "code", - "execution_count": 253, + "execution_count": null, "id": "dfa38cc7", "metadata": {}, "outputs": [ @@ -1505,7 +1517,7 @@ }, { "cell_type": "code", - "execution_count": 254, + "execution_count": null, "id": "dcc99a02", "metadata": {}, "outputs": [], @@ -1515,7 +1527,7 @@ }, { "cell_type": "code", - "execution_count": 269, + "execution_count": null, "id": "3460b690", "metadata": {}, "outputs": [], @@ -1533,7 +1545,7 @@ }, { "cell_type": "code", - "execution_count": 270, + "execution_count": null, "id": "bf506deb", "metadata": {}, "outputs": [], @@ -1543,7 +1555,7 @@ }, { "cell_type": "code", - "execution_count": 271, + "execution_count": null, "id": "270c8310", "metadata": {}, "outputs": [], @@ -1553,7 +1565,7 @@ }, { "cell_type": "code", - "execution_count": 276, + "execution_count": null, "id": "d86aa1c9", "metadata": {}, "outputs": [ @@ -1563,7 +1575,7 @@ "[0, 1, 2, 3, 4]" ] }, - "execution_count": 276, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1574,7 +1586,7 @@ }, { "cell_type": "code", - "execution_count": 277, + "execution_count": null, "id": "2a2f4c45", "metadata": {}, "outputs": [], @@ -1584,7 +1596,7 @@ }, { "cell_type": "code", - "execution_count": 278, + "execution_count": null, "id": "0d49229c", "metadata": {}, "outputs": [], @@ -1599,7 +1611,7 @@ }, { "cell_type": "code", - "execution_count": 282, + "execution_count": null, "id": "013b419e", "metadata": {}, "outputs": [ @@ -1609,7 +1621,7 @@ "[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]" ] }, - "execution_count": 282, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1621,7 +1633,7 @@ }, { "cell_type": "code", - "execution_count": 320, + "execution_count": null, "id": "9f8c9879", "metadata": {}, "outputs": [], @@ -1633,7 +1645,7 @@ }, { "cell_type": "code", - "execution_count": 336, + "execution_count": null, "id": "dd483f62", "metadata": {}, "outputs": [], @@ -1648,7 +1660,7 @@ }, { "cell_type": "code", - "execution_count": 347, + "execution_count": null, "id": "62297d8d", "metadata": {}, "outputs": [], @@ -1659,7 +1671,7 @@ }, { "cell_type": "code", - "execution_count": 348, + "execution_count": null, "id": "e7bcb939", "metadata": {}, "outputs": [], @@ -1670,7 +1682,7 @@ }, { "cell_type": "code", - "execution_count": 349, + "execution_count": null, "id": "89059be4", "metadata": {}, "outputs": [ @@ -1680,7 +1692,7 @@ "(torch.Size([50, 784]), torch.Size([50]))" ] }, - "execution_count": 349, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1692,13 +1704,13 @@ }, { "cell_type": "code", - "execution_count": 350, + "execution_count": null, "id": "0458cf76", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1716,7 +1728,7 @@ }, { "cell_type": "code", - "execution_count": 351, + "execution_count": null, "id": "4e8921d8", "metadata": {}, "outputs": [], @@ -1726,7 +1738,7 @@ }, { "cell_type": "code", - "execution_count": 352, + "execution_count": null, "id": "2740be53", "metadata": {}, "outputs": [ @@ -1758,7 +1770,7 @@ }, { "cell_type": "code", - "execution_count": 353, + "execution_count": null, "id": "cc2488a8", "metadata": {}, "outputs": [], @@ -1768,7 +1780,7 @@ }, { "cell_type": "code", - "execution_count": 359, + "execution_count": null, "id": "febc23a9", "metadata": {}, "outputs": [], @@ -1784,7 +1796,7 @@ }, { "cell_type": "code", - "execution_count": 360, + "execution_count": null, "id": "42c45253", "metadata": {}, "outputs": [], @@ -1794,13 +1806,13 @@ }, { "cell_type": "code", - "execution_count": 363, + "execution_count": null, "id": "de70d5ab", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE3UlEQVR4nO3dT4vVZRiA4WY0C0srCg207H8ELQxaJFEQKdQHkAJb1SKCVi1bFUS0LsI+QYuMQNokUkYtJNKgRIKCCjRCKBDKtBrntA48LzjNOPc417U8Dz94OWfu88C8izMzmUyuAHpml/sAwIWJE6LECVHihChxQtTa0XDX7G7/yoUldnB+38yFXrc5IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUcOfAGT1+eHd7VNnc2fHfy73PHdkkU+zutmcECVOiBInRIkTosQJUeKEKHFClHvOVeb3px8azr9+9M2psyeOP7XYx2HA5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64yp+8afx+vn103dXbq9Ibhs7ct5EBMZXNClDghSpwQJU6IEidEiROiXKXwH+cn81Nn1358zSU8CTYnRIkTosQJUeKEKHFClDghSpwQ5Z5zldny2Inh/Ofzf06d3fzhj8Nn5xZ0IqaxOSFKnBAlTogSJ0SJE6LECVHihCj3nJeZNZs3Ded7thwezp/88vmps62/HF/QmVgYmxOixAlR4oQocUKUOCFKnBAlTohyz3mZ+f6lO4fzPRs+Gs5fOTn+mT8uHZsTosQJUeKEKHFClDghSpwQJU6Ics95mTm/+e/h/I/JX8P57fv/Wczj8D/YnBAlTogSJ0SJE6LECVHihChXKSvMmuuvG85f3/HBcP7gZy8M53d8cvSiz8TSsDkhSpwQJU6IEidEiROixAlR4oQo95wrzJlH7h3Od197aDh/+R/fxyuFTwqixAlR4oQocUKUOCFKnBAlTohyz7nCnHhi5n89v/nAukU6CUvN5oQocUKUOCFKnBAlTogSJ0SJE6Lcc64wk3Xzw/nn58Yf6Q0HvhvOz1/0iVgqNidEiROixAlR4oQocUKUOCFKnBDlnjNm7bZbhvP3d749nD9z5Lnh/Nbfjl30mVgeNidEiROixAlR4oQocUKUOCHKVUrMt69uGs63rxt/ZH+dWr+Yx2EZ2ZwQJU6IEidEiROixAlR4oQocUKUe85lMHl4+9TZ0cffGj578OwNw/l9b5wczueGU0psTogSJ0SJE6LECVHihChxQpQ4Ico95zL46cXJ1NnG2auHzx47t3U4nzv584LORI/NCVHihChxQpQ4IUqcECVOiBInRLnnXAb7d+wdTMf3nHsP7RzO777iiwWciCKbE6LECVHihChxQpQ4IUqcEOUqZQms2bhxON+2duFv+41f+T5dLXzSECVOiBInRIkTosQJUeKEKHFClHvOJfD9O3cM51fNTH/bX/v1/uGzN733zXA+P5yykticECVOiBInRIkTosQJUeKEKHFClHvOJTB3dvy2fnruyqmzw88+MHx2cub4gs7EymNzQpQ4IUqcECVOiBInRIkTosQJUTOTyWTqcNfs7ulDYFEcnN83c6HXbU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocULU8CcAgeVjc0KUOCFKnBAlTogSJ0SJE6L+BWVGdMTZncVCAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -1830,17 +1842,19 @@ }, { "cell_type": "code", - "execution_count": 365, + "execution_count": null, "id": "4184f878", "metadata": {}, "outputs": [], "source": [ + "#| export\n", + "\n", "from torch.utils.data import DataLoader, SequentialSampler, RandomSampler, BatchSampler" ] }, { "cell_type": "code", - "execution_count": 366, + "execution_count": null, "id": "fc2d3ab3", "metadata": {}, "outputs": [], @@ -1850,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 376, + "execution_count": null, "id": "9b4d074a", "metadata": {}, "outputs": [ @@ -1860,7 +1874,7 @@ "24797" ] }, - "execution_count": 376, + "execution_count": null, "metadata": {}, "output_type": "execute_result" } @@ -1871,7 +1885,7 @@ }, { "cell_type": "code", - "execution_count": 412, + "execution_count": null, "id": "92e52220", "metadata": {}, "outputs": [ @@ -1896,7 +1910,7 @@ }, { "cell_type": "code", - "execution_count": 411, + "execution_count": null, "id": "02e1fb43", "metadata": {}, "outputs": [ @@ -1921,7 +1935,7 @@ }, { "cell_type": "code", - "execution_count": 413, + "execution_count": null, "id": "c230dcf8", "metadata": {}, "outputs": [], @@ -1932,7 +1946,7 @@ }, { "cell_type": "code", - "execution_count": 414, + "execution_count": null, "id": "d7556e64", "metadata": {}, "outputs": [], @@ -1943,7 +1957,7 @@ }, { "cell_type": "code", - "execution_count": 415, + "execution_count": null, "id": "28492c75", "metadata": {}, "outputs": [ @@ -1964,7 +1978,7 @@ }, { "cell_type": "code", - "execution_count": 416, + "execution_count": null, "id": "f764cc92", "metadata": {}, "outputs": [], @@ -1975,7 +1989,7 @@ }, { "cell_type": "code", - "execution_count": 417, + "execution_count": null, "id": "1c69f400", "metadata": {}, "outputs": [ @@ -2008,11 +2022,13 @@ }, { "cell_type": "code", - "execution_count": 436, + "execution_count": null, "id": "6fb1f426", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "def fit(epochs, model, loss_func, opt, train_dl, valid_ld):\n", " for epoch in range(epochs):\n", " model.train()\n", @@ -2039,11 +2055,13 @@ }, { "cell_type": "code", - "execution_count": 437, + "execution_count": null, "id": "3d422ab1", "metadata": {}, "outputs": [], "source": [ + "#|export\n", + "\n", "def get_dls(train_ds, valid_ds, bs, **kwargs):\n", " return (\n", " DataLoader(train_ds, bs, shuffle=True, **kwargs),\n", @@ -2053,7 +2071,7 @@ }, { "cell_type": "code", - "execution_count": 438, + "execution_count": null, "id": "5e110840", "metadata": {}, "outputs": [], @@ -2064,7 +2082,7 @@ }, { "cell_type": "code", - "execution_count": 439, + "execution_count": null, "id": "a9d23182", "metadata": {}, "outputs": [ @@ -2092,26 +2110,25 @@ "id": "a5d3d1ca", "metadata": {}, "outputs": [], + "source": [ + "#| hide\n", + "import nbdev; nbdev.nbdev_export();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ba7d787", + "metadata": {}, + "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "python3", "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.9.7" } }, "nbformat": 4, diff --git a/nbs/index.ipynb b/nbs/index.ipynb index 85f109ab..a8525b1b 100644 --- a/nbs/index.ipynb +++ b/nbs/index.ipynb @@ -1,79 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#| hide\n", - "from practice_deep_learning.core import *" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# practice_deep_learning\n", - "\n", - "> Deep Learning Portal 🔥 This repository contains implementation code for important research papers and starter guides for common deep learning tools." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This file will become your README and also the index of your documentation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Install" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```sh\n", - "pip install practice_deep_learning\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## How to use" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fill me in please! Don't forget code examples:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": null, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "1+1" + " This repository contains implementation code for important research papers and starter guides for common deep learning tools." ] }, { diff --git a/nbs/sidebar.yml b/nbs/sidebar.yml index 45222d2c..1390528d 100644 --- a/nbs/sidebar.yml +++ b/nbs/sidebar.yml @@ -2,4 +2,3 @@ website: sidebar: contents: - index.ipynb - - 00_core.ipynb diff --git a/practice_deep_learning/__pycache__/__init__.cpython-39.pyc b/practice_deep_learning/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 00000000..2724c842 Binary files /dev/null and b/practice_deep_learning/__pycache__/__init__.cpython-39.pyc differ diff --git a/practice_deep_learning/__pycache__/_modidx.cpython-39.pyc b/practice_deep_learning/__pycache__/_modidx.cpython-39.pyc new file mode 100644 index 00000000..dd3dcdf2 Binary files /dev/null and b/practice_deep_learning/__pycache__/_modidx.cpython-39.pyc differ diff --git a/practice_deep_learning/__pycache__/core.cpython-39.pyc b/practice_deep_learning/__pycache__/core.cpython-39.pyc new file mode 100644 index 00000000..66878687 Binary files /dev/null and b/practice_deep_learning/__pycache__/core.cpython-39.pyc differ diff --git a/practice_deep_learning/_modidx.py b/practice_deep_learning/_modidx.py index 4621b02d..a18489cf 100644 --- a/practice_deep_learning/_modidx.py +++ b/practice_deep_learning/_modidx.py @@ -5,4 +5,15 @@ 'doc_host': 'https://arun477.github.io', 'git_url': 'https://github.com/arun477/practice_deep_learning', 'lib_path': 'practice_deep_learning'}, - 'syms': {'practice_deep_learning.core': {'practice_deep_learning.core.foo': ('core.html#foo', 'practice_deep_learning/core.py')}}} + 'syms': { 'practice_deep_learning.training': { 'practice_deep_learning.training.Dataset': ( 'mini_batch_training.html#dataset', + 'practice_deep_learning/training.py'), + 'practice_deep_learning.training.Dataset.__getitem__': ( 'mini_batch_training.html#dataset.__getitem__', + 'practice_deep_learning/training.py'), + 'practice_deep_learning.training.Dataset.__init__': ( 'mini_batch_training.html#dataset.__init__', + 'practice_deep_learning/training.py'), + 'practice_deep_learning.training.Dataset.__len__': ( 'mini_batch_training.html#dataset.__len__', + 'practice_deep_learning/training.py'), + 'practice_deep_learning.training.fit': ( 'mini_batch_training.html#fit', + 'practice_deep_learning/training.py'), + 'practice_deep_learning.training.get_dls': ( 'mini_batch_training.html#get_dls', + 'practice_deep_learning/training.py')}}} diff --git a/practice_deep_learning/core.py b/practice_deep_learning/core.py deleted file mode 100644 index 6552cc5d..00000000 --- a/practice_deep_learning/core.py +++ /dev/null @@ -1,7 +0,0 @@ -# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/00_core.ipynb. - -# %% auto 0 -__all__ = ['foo'] - -# %% ../nbs/00_core.ipynb 3 -def foo(): pass diff --git a/practice_deep_learning/training.py b/practice_deep_learning/training.py new file mode 100644 index 00000000..1f4024d4 --- /dev/null +++ b/practice_deep_learning/training.py @@ -0,0 +1,55 @@ +# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/04_mini_batch_training.ipynb. + +# %% auto 0 +__all__ = ['Dataset', 'fit', 'get_dls'] + +# %% ../nbs/04_mini_batch_training.ipynb 1 +import torch, torch.nn as nn +import torch.nn.functional as F +from pathlib import Path +import gzip, pickle, matplotlib.pyplot as plt + +# %% ../nbs/04_mini_batch_training.ipynb 74 +class Dataset: + def __init__(self, x, y): + self.x, self.y = x, y + + def __len__(self): + return len(self.x) + + def __getitem__(self, i): + return self.x[i], self.y[i] + +# %% ../nbs/04_mini_batch_training.ipynb 108 +from torch.utils.data import DataLoader, SequentialSampler, RandomSampler, BatchSampler + +# %% ../nbs/04_mini_batch_training.ipynb 119 +def fit(epochs, model, loss_func, opt, train_dl, valid_ld): + for epoch in range(epochs): + model.train() + for xb, yb in train_dl: + preds = model(xb) + loss = loss_func(preds, yb) + loss.backward() + opt.step() + opt.zero_grad() + + model.eval() + with torch.no_grad(): + total_loss, total_acc, count = 0., 0., 0 + for xb, yb in valid_dl: + preds = model(xb) + n = len(xb) + count += n + total_loss += loss_func(preds, yb).item()*n + total_acc += accuracy(preds, yb).item()*n + print(epoch, total_loss/count, total_acc/count) + + return total_loss/count, total_acc/count + +# %% ../nbs/04_mini_batch_training.ipynb 120 +def get_dls(train_ds, valid_ds, bs, **kwargs): + return ( + DataLoader(train_ds, bs, shuffle=True, **kwargs), + DataLoader(valid_ds, bs*2, shuffle=False, **kwargs) + )