├── README.md └── TrainBasicNN.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # TrainBasicNN 2 | train a simple neural network with only Numpy and Pandas 3 |
4 |
5 | ![TrainBasicNN_thumbnail](https://user-images.githubusercontent.com/32107652/219529241-6fc0a62d-110a-47dc-8e43-26fa6deb7ab8.jpg) 6 |
7 |

Watch on YouTube

8 | This repository was created to accomodate my YouTube tutorial: 9 |
10 | https://youtu.be/xpPX3fBM9dU 11 |
12 |
13 | author: Mariya Sha 14 |
15 | dependencies: 16 | 17 | - Numpy 18 | - Pandas 19 | -------------------------------------------------------------------------------- /TrainBasicNN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Train Basic Neural Network\n", 8 | "\n", 9 | "a fun exercise to see how well you understand my AI Simplified Playlist:\n", 10 | "
\n", 11 | "https://youtube.com/playlist?list=PLqXS1b2lRpYTpUIEu3oxfhhTuBXmMPppA\n", 12 | "
\n", 13 | "
\n", 14 | "The entire code below is explained step by step, command by command, in this tutorial of mine: \n", 15 | "
\n", 16 | "https://youtu.be/xpPX3fBM9dU\n", 17 | "
\n", 18 | "
\n", 19 | "by: Mariya Sha" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "### STEP 1: Generate Data" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 10, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "name": "stdout", 36 | "output_type": "stream", 37 | "text": [ 38 | " x0 x1 x2 targets\n", 39 | "0 0.512593 0.838298 0.640243 1\n", 40 | "1 0.805120 0.025566 0.594743 1\n", 41 | "2 0.190806 0.025967 0.676498 1\n", 42 | "3 0.360109 0.018419 0.864023 0\n" 43 | ] 44 | } 45 | ], 46 | "source": [ 47 | "import numpy as np\n", 48 | "import pandas as pd\n", 49 | "\n", 50 | "rg = np.random.default_rng()\n", 51 | "\n", 52 | "def generate_data(n_features, n_values):\n", 53 | " features = rg.random((n_features, n_values))\n", 54 | " weights = rg.random((1, n_values))[0]\n", 55 | " targets = np.random.choice([0,1], n_features)\n", 56 | " data = pd.DataFrame(features, columns=[\"x0\", \"x1\", \"x2\"])\n", 57 | " data[\"targets\"] = targets\n", 58 | " return data, weights\n", 59 | " \n", 60 | "data, weights = generate_data(4,3)\n", 61 | "print(data)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "### STEP 2: Train Model" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 24, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "name": "stdout", 78 | "output_type": "stream", 79 | "text": [ 80 | "**************************\n", 81 | "epoch 0\n", 82 | "0.24596691500539186\n", 83 | "**************************\n", 84 | "epoch 1\n", 85 | "0.2443171531087477\n", 86 | "**************************\n", 87 | "epoch 2\n", 88 | "0.24289522824952253\n", 89 | "**************************\n", 90 | "epoch 3\n", 91 | "0.24165890496422804\n", 92 | "**************************\n", 93 | "epoch 4\n", 94 | "0.2405725595304472\n", 95 | "**************************\n", 96 | "epoch 5\n", 97 | "0.23960656764117708\n", 98 | "**************************\n", 99 | "epoch 6\n", 100 | "0.23873660149262244\n", 101 | "**************************\n", 102 | "epoch 7\n", 103 | "0.2379429049172851\n", 104 | "**************************\n", 105 | "epoch 8\n", 106 | "0.23720959397885258\n", 107 | "**************************\n", 108 | "epoch 9\n", 109 | "0.23652401256308533\n", 110 | "**************************\n", 111 | "epoch 10\n", 112 | "0.23587615861020694\n", 113 | "**************************\n", 114 | "epoch 11\n", 115 | "0.23525818660458353\n", 116 | "**************************\n", 117 | "epoch 12\n", 118 | "0.23466398521804402\n", 119 | "**************************\n", 120 | "epoch 13\n", 121 | "0.23408882489715055\n", 122 | "**************************\n", 123 | "epoch 14\n", 124 | "0.2335290680072384\n", 125 | "**************************\n", 126 | "epoch 15\n", 127 | "0.23298193330514133\n", 128 | "**************************\n", 129 | "epoch 16\n", 130 | "0.2324453065375283\n", 131 | "**************************\n", 132 | "epoch 17\n", 133 | "0.23191758950167354\n", 134 | "**************************\n", 135 | "epoch 18\n", 136 | "0.23139758071261793\n", 137 | "**************************\n", 138 | "epoch 19\n", 139 | "0.2308843817297398\n", 140 | "**************************\n", 141 | "epoch 20\n", 142 | "0.23037732410302442\n", 143 | "**************************\n", 144 | "epoch 21\n", 145 | "0.22987591274502225\n", 146 | "**************************\n", 147 | "epoch 22\n", 148 | "0.22937978228861505\n", 149 | "**************************\n", 150 | "epoch 23\n", 151 | "0.2288886636425573\n", 152 | "**************************\n", 153 | "epoch 24\n", 154 | "0.22840235850730414\n", 155 | "**************************\n", 156 | "epoch 25\n", 157 | "0.22792072007041672\n", 158 | "**************************\n", 159 | "epoch 26\n", 160 | "0.22744363847449492\n", 161 | "**************************\n", 162 | "epoch 27\n", 163 | "0.22697102995277707\n", 164 | "**************************\n", 165 | "epoch 28\n", 166 | "0.2265028287696355\n", 167 | "**************************\n", 168 | "epoch 29\n", 169 | "0.22603898129561023\n", 170 | "**************************\n", 171 | "epoch 30\n", 172 | "0.22557944169852032\n", 173 | "**************************\n", 174 | "epoch 31\n", 175 | "0.22512416885141728\n", 176 | "**************************\n", 177 | "epoch 32\n", 178 | "0.22467312415123228\n", 179 | "**************************\n", 180 | "epoch 33\n", 181 | "0.22422627001433504\n", 182 | "**************************\n", 183 | "epoch 34\n", 184 | "0.22378356887123127\n", 185 | "**************************\n", 186 | "epoch 35\n", 187 | "0.22334498252581814\n", 188 | "**************************\n", 189 | "epoch 36\n", 190 | "0.2229104717777971\n", 191 | "**************************\n", 192 | "epoch 37\n", 193 | "0.22247999623224962\n", 194 | "**************************\n", 195 | "epoch 38\n", 196 | "0.22205351423975417\n", 197 | "**************************\n", 198 | "epoch 39\n", 199 | "0.2216309829251563\n", 200 | "**************************\n", 201 | "epoch 40\n", 202 | "0.22121235827424998\n", 203 | "**************************\n", 204 | "epoch 41\n", 205 | "0.220797595256041\n", 206 | "**************************\n", 207 | "epoch 42\n", 208 | "0.22038664796457108\n", 209 | "**************************\n", 210 | "epoch 43\n", 211 | "0.21997946976899468\n", 212 | "**************************\n", 213 | "epoch 44\n", 214 | "0.21957601346410016\n", 215 | "**************************\n", 216 | "epoch 45\n", 217 | "0.21917623141604006\n", 218 | "**************************\n", 219 | "epoch 46\n", 220 | "0.21878007569992317\n", 221 | "**************************\n", 222 | "epoch 47\n", 223 | "0.21838749822727888\n", 224 | "**************************\n", 225 | "epoch 48\n", 226 | "0.21799845086237785\n", 227 | "**************************\n", 228 | "epoch 49\n", 229 | "0.21761288552707136\n" 230 | ] 231 | } 232 | ], 233 | "source": [ 234 | "bias = 0.5\n", 235 | "l_rate = 0.1\n", 236 | "epochs = 50\n", 237 | "epoch_loss = []\n", 238 | "\n", 239 | "def get_weighted_sum(feature, weights, bias):\n", 240 | " return np.dot(feature, weights) + bias\n", 241 | "\n", 242 | "def sigmoid(w_sum):\n", 243 | " return 1/(1+np.exp(-w_sum))\n", 244 | "\n", 245 | "def cross_entropy(target, prediction):\n", 246 | " return -(target*np.log10(prediction) + (1-target)*np.log10(1-prediction))\n", 247 | "\n", 248 | "def update_weights(weights, l_rate, target, prediction, feature):\n", 249 | " new_weights = []\n", 250 | " for x, w in zip(feature, weights):\n", 251 | " new_w = w + l_rate*(target-prediction)*x\n", 252 | " new_weights.append(new_w)\n", 253 | " return new_weights\n", 254 | "\n", 255 | "def update_bias(bias, l_rate, target, prediction):\n", 256 | " return bias + l_rate*(target-prediction)\n", 257 | "\n", 258 | "def train_model(data, weights, bias, l_rate, epochs):\n", 259 | " for e in range(epochs):\n", 260 | " individual_loss = []\n", 261 | " for i in range(len(data)):\n", 262 | " feature = data.loc[i][:-1]\n", 263 | " target = data.loc[i][-1]\n", 264 | " w_sum = get_weighted_sum(feature, weights, bias)\n", 265 | " prediction = sigmoid(w_sum)\n", 266 | " loss = cross_entropy(target, prediction)\n", 267 | " individual_loss.append(loss)\n", 268 | " # gradient descent\n", 269 | " weights = update_weights(weights, l_rate, target, prediction, feature)\n", 270 | " bias = update_bias(bias, l_rate, target, prediction)\n", 271 | " average_loss = sum(individual_loss)/len(individual_loss)\n", 272 | " epoch_loss.append(average_loss)\n", 273 | " print(\"**************************\")\n", 274 | " print(\"epoch\", e)\n", 275 | " print(average_loss)\n", 276 | " \n", 277 | "train_model(data, weights, bias, l_rate, epochs)" 278 | ] 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "metadata": {}, 283 | "source": [ 284 | "### STEP 3: Plot/Visuallize data" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": 25, 290 | "metadata": {}, 291 | "outputs": [ 292 | { 293 | "data": { 294 | "text/plain": [ 295 | "" 296 | ] 297 | }, 298 | "execution_count": 25, 299 | "metadata": {}, 300 | "output_type": "execute_result" 301 | }, 302 | { 303 | "data": { 304 | "image/png": "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\n", 305 | "text/plain": [ 306 | "
" 307 | ] 308 | }, 309 | "metadata": { 310 | "needs_background": "light" 311 | }, 312 | "output_type": "display_data" 313 | } 314 | ], 315 | "source": [ 316 | "df = pd.DataFrame(epoch_loss)\n", 317 | "df_plot = df.plot(kind=\"line\", grid=True)\n", 318 | "df_plot" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": null, 324 | "metadata": {}, 325 | "outputs": [], 326 | "source": [] 327 | } 328 | ], 329 | "metadata": { 330 | "kernelspec": { 331 | "display_name": "Python 3 (ipykernel)", 332 | "language": "python", 333 | "name": "python3" 334 | }, 335 | "language_info": { 336 | "codemirror_mode": { 337 | "name": "ipython", 338 | "version": 3 339 | }, 340 | "file_extension": ".py", 341 | "mimetype": "text/x-python", 342 | "name": "python", 343 | "nbconvert_exporter": "python", 344 | "pygments_lexer": "ipython3", 345 | "version": "3.9.7" 346 | } 347 | }, 348 | "nbformat": 4, 349 | "nbformat_minor": 4 350 | } 351 | --------------------------------------------------------------------------------