├── README.md
└── TrainBasicNN.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # TrainBasicNN
2 | train a simple neural network with only Numpy and Pandas
3 |
4 |
5 | 
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 |
--------------------------------------------------------------------------------