├── init
├── images
├── init
├── ann.png
├── or.png
├── xor.png
├── ANDand.png
├── combo.png
├── image1.png
├── image2.png
├── matmul.png
├── nand.png
├── deepnet.png
└── image_2.png
├── README.md
├── imdb-reviews-classification.ipynb
├── forward-pass.ipynb
└── keras.ipynb
/init:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/images/init:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/images/ann.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/ann.png
--------------------------------------------------------------------------------
/images/or.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/or.png
--------------------------------------------------------------------------------
/images/xor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/xor.png
--------------------------------------------------------------------------------
/images/ANDand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/ANDand.png
--------------------------------------------------------------------------------
/images/combo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/combo.png
--------------------------------------------------------------------------------
/images/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/image1.png
--------------------------------------------------------------------------------
/images/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/image2.png
--------------------------------------------------------------------------------
/images/matmul.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/matmul.png
--------------------------------------------------------------------------------
/images/nand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/nand.png
--------------------------------------------------------------------------------
/images/deepnet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/deepnet.png
--------------------------------------------------------------------------------
/images/image_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ContentUpgrad/intro_to_neural_networks/main/images/image_2.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Welcome to Neural Networks for NLP
2 |
3 | ## TOC:
4 | - What is where?
5 | - FAQs
6 |
7 | ### What is where?
8 | The folder structure is given below:
9 |
10 | 
11 |
12 | As you can see there are three main code files when you log in:
13 |
14 | 1. **forward-pass.ipynb** This is the code file for session 1: Understanding Neural Networks
15 | 2. **keras.ipynb** This is where all the code files for session 3: Understanding Tensorflow are kept
16 | 3. **imdb-reviews-classification.ipynb** This is the code file for session 4: Case Study: IMDB Movie review classification
17 |
18 | The datasets required are linked in the code files itself. Please follow the steps that are shown in the video demonstration to install the data files.
19 | OR
20 | You can download the data files from [here](https://drive.google.com/drive/u/0/folders/1hYw0TQbwcM2YWEiKN-2c_kHCPtHO_TMC)
21 |
22 |
23 |
24 | ### FAQs
25 | How do i download all the files in github?
26 | 
27 | Click on Code button and then click on Download ZIP
28 | OR
29 | Use `git clone https://github.com/ContentUpgrad/intro_to_neural_networks.git` command on your terminal if git is installed in your machine.
30 |
--------------------------------------------------------------------------------
/imdb-reviews-classification.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "respective-webster",
6 | "metadata": {},
7 | "source": [
8 | "# Text Classification"
9 | ]
10 | },
11 | {
12 | "cell_type": "raw",
13 | "id": "adverse-evolution",
14 | "metadata": {},
15 | "source": [
16 | "----------------------------------------------------------------------\n",
17 | "Filename : imdb-reviews-classification.ipynb\n",
18 | "Author : Jaidev Deshpande\n",
19 | "Purpose : Understanding text classification using keras\n",
20 | "Libraries: tensorflow.keras, numpy, sklearn and pandas\n",
21 | "----------------------------------------------------------------------"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": null,
27 | "id": "seasonal-balloon",
28 | "metadata": {},
29 | "outputs": [],
30 | "source": [
31 | "# Imports\n",
32 | "\n",
33 | "from tensorflow.keras.preprocessing import text_dataset_from_directory\n",
34 | "from tensorflow.keras import Sequential\n",
35 | "from tensorflow.keras.layers import Dense\n",
36 | "from tensorflow.keras.optimizers import SGD\n",
37 | "\n",
38 | "import pandas as pd\n",
39 | "import numpy as np\n",
40 | "from sklearn.feature_extraction.text import TfidfVectorizer\n",
41 | "from sklearn.model_selection import train_test_split\n",
42 | "import matplotlib.pyplot as plt\n",
43 | "%matplotlib inline"
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "id": "corrected-railway",
49 | "metadata": {},
50 | "source": [
51 | "## The Problem: Large Movie Dataset Review\n",
52 | "### Classify movie reviews from IMDB into positive or negative sentiment.\n",
53 | "### Download the dataset [here](https://drive.google.com/drive/u/0/folders/1hYw0TQbwcM2YWEiKN-2c_kHCPtHO_TMC)"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": null,
59 | "id": "fossil-vertical",
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "# Importing & preprocessing the dataset\n",
64 | "\n",
65 | "train_ds = text_dataset_from_directory('aclImdb/train')\n",
66 | "test_ds = text_dataset_from_directory('aclImdb/test')\n",
67 | "\n",
68 | "dfTrain = pd.DataFrame(train_ds.unbatch().as_numpy_iterator(), columns=['text', 'label'])\n",
69 | "dfTest = pd.DataFrame(test_ds.unbatch().as_numpy_iterator(), columns=['text', 'label'])\n",
70 | "_, xts = train_test_split(dfTest, stratify=dfTest['label'], test_size=0.25)"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": null,
76 | "id": "vertical-northern",
77 | "metadata": {},
78 | "outputs": [],
79 | "source": [
80 | "# Look at a sample movie review\n",
81 | "\n",
82 | "print(dfTrain.loc[0, 'text'])"
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": null,
88 | "id": "virgin-illustration",
89 | "metadata": {},
90 | "outputs": [],
91 | "source": [
92 | "# Look at the label of the review\n",
93 | "\n",
94 | "dfTrain.loc[0, 'label']"
95 | ]
96 | },
97 | {
98 | "cell_type": "code",
99 | "execution_count": null,
100 | "id": "sustained-camcorder",
101 | "metadata": {},
102 | "outputs": [],
103 | "source": [
104 | "pd.options.display.max_colwidth = 100\n",
105 | "dfTrain.head()"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "execution_count": null,
111 | "id": "improved-negotiation",
112 | "metadata": {},
113 | "outputs": [],
114 | "source": [
115 | "dfTest.head()"
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": null,
121 | "id": "enormous-comment",
122 | "metadata": {},
123 | "outputs": [],
124 | "source": [
125 | "# Feature Extraction - Text to TFIDF\n",
126 | "\n",
127 | "vect = TfidfVectorizer(stop_words='english')\n",
128 | "XTrain = vect.fit_transform(dfTrain['text']).toarray()\n",
129 | "XTest = vect.transform(xts['text']).toarray()"
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": null,
135 | "id": "included-healing",
136 | "metadata": {},
137 | "outputs": [],
138 | "source": [
139 | "XTrain.shape"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": null,
145 | "id": "according-russia",
146 | "metadata": {},
147 | "outputs": [],
148 | "source": [
149 | "# Assemble and compile the neural network\n",
150 | "\n",
151 | "model = Sequential([\n",
152 | " Dense(128, input_shape=(XTrain.shape[1],), activation='relu'),\n",
153 | " Dense(128, activation='relu'),\n",
154 | " Dense(64, activation='relu'),\n",
155 | " Dense(1, activation='sigmoid')\n",
156 | "])\n",
157 | "model.compile(loss='binary_crossentropy', optimizer=SGD(lr=1e-3), metrics=['accuracy'])"
158 | ]
159 | },
160 | {
161 | "cell_type": "code",
162 | "execution_count": null,
163 | "id": "protective-parking",
164 | "metadata": {
165 | "scrolled": true
166 | },
167 | "outputs": [],
168 | "source": [
169 | "# Train the neural network\n",
170 | "\n",
171 | "history = model.fit(XTrain, dfTrain['label'], batch_size=64, validation_data=(XTest, xts['label']), epochs=50)"
172 | ]
173 | },
174 | {
175 | "cell_type": "code",
176 | "execution_count": null,
177 | "id": "completed-poultry",
178 | "metadata": {},
179 | "outputs": [],
180 | "source": [
181 | "# Visualize the learning curve\n",
182 | "\n",
183 | "plt.plot(history.history['accuracy'], label='Train Accuracy')\n",
184 | "plt.plot(history.history['val_accuracy'], label='Test Accuracy')\n",
185 | "plt.legend()"
186 | ]
187 | },
188 | {
189 | "cell_type": "code",
190 | "execution_count": null,
191 | "id": "metallic-office",
192 | "metadata": {},
193 | "outputs": [],
194 | "source": []
195 | }
196 | ],
197 | "metadata": {
198 | "kernelspec": {
199 | "display_name": "Python 3",
200 | "language": "python",
201 | "name": "python3"
202 | },
203 | "language_info": {
204 | "codemirror_mode": {
205 | "name": "ipython",
206 | "version": 3
207 | },
208 | "file_extension": ".py",
209 | "mimetype": "text/x-python",
210 | "name": "python",
211 | "nbconvert_exporter": "python",
212 | "pygments_lexer": "ipython3",
213 | "version": "3.7.7"
214 | }
215 | },
216 | "nbformat": 4,
217 | "nbformat_minor": 5
218 | }
219 |
--------------------------------------------------------------------------------
/forward-pass.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "looking-election",
6 | "metadata": {},
7 | "source": [
8 | "# Forward Pass"
9 | ]
10 | },
11 | {
12 | "cell_type": "raw",
13 | "id": "continuous-royalty",
14 | "metadata": {},
15 | "source": [
16 | "----------------------------------------------------------------------\n",
17 | "Filename : forward-pass.ipynb\n",
18 | "Author : Jaidev Deshpande\n",
19 | "Content : Understanding feed forward propagation\n",
20 | "Libraries: numpy, sklearn and pandas\n",
21 | "----------------------------------------------------------------------"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": null,
27 | "id": "understood-island",
28 | "metadata": {},
29 | "outputs": [],
30 | "source": [
31 | "# Importing libraries\n",
32 | "\n",
33 | "from sklearn.datasets import load_iris\n",
34 | "import pandas as pd\n",
35 | "import numpy as np"
36 | ]
37 | },
38 | {
39 | "cell_type": "code",
40 | "execution_count": null,
41 | "id": "spoken-clarity",
42 | "metadata": {},
43 | "outputs": [],
44 | "source": [
45 | "# Load the Iris dataset\n",
46 | "\n",
47 | "iris = load_iris()\n",
48 | "X = iris.data\n",
49 | "y = iris.target\n",
50 | "df = pd.DataFrame(X, columns=iris.feature_names)\n",
51 | "df['species'] = iris.target_names[y]\n",
52 | "df.sample(n=5)"
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "id": "western-consensus",
58 | "metadata": {},
59 | "source": [
60 | "
"
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": null,
66 | "id": "detailed-nomination",
67 | "metadata": {},
68 | "outputs": [],
69 | "source": [
70 | "# Activation functions\n",
71 | "\n",
72 | "def sigmoid(x):\n",
73 | " return 1 / (1 + np.exp(-x))\n",
74 | "\n",
75 | "\n",
76 | "def softmax(x):\n",
77 | " return np.exp(x) / np.exp(x).sum()"
78 | ]
79 | },
80 | {
81 | "cell_type": "markdown",
82 | "id": "unable-typing",
83 | "metadata": {},
84 | "source": [
85 | "## Matrix Multiplication\n",
86 | "
"
87 | ]
88 | },
89 | {
90 | "cell_type": "markdown",
91 | "id": "played-brighton",
92 | "metadata": {},
93 | "source": [
94 | "## Layer 1 Weights, Biases and Activation"
95 | ]
96 | },
97 | {
98 | "cell_type": "markdown",
99 | "id": "mounted-penetration",
100 | "metadata": {},
101 | "source": [
102 | "
"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": null,
108 | "id": "loving-metropolitan",
109 | "metadata": {},
110 | "outputs": [],
111 | "source": [
112 | "df.head()"
113 | ]
114 | },
115 | {
116 | "cell_type": "code",
117 | "execution_count": null,
118 | "id": "split-tension",
119 | "metadata": {},
120 | "outputs": [],
121 | "source": [
122 | "x = X[:5]\n",
123 | "x"
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "execution_count": null,
129 | "id": "cross-finder",
130 | "metadata": {},
131 | "outputs": [],
132 | "source": [
133 | "# Initialize weights and biases\n",
134 | "\n",
135 | "w1 = np.random.rand(4, 5)\n",
136 | "b1 = np.random.rand(5)\n",
137 | "print(w1.shape)\n",
138 | "print(b1.shape)"
139 | ]
140 | },
141 | {
142 | "cell_type": "code",
143 | "execution_count": null,
144 | "id": "recorded-prison",
145 | "metadata": {},
146 | "outputs": [],
147 | "source": [
148 | "# Take a data sample\n",
149 | "\n",
150 | "sample = x[0]\n",
151 | "sample"
152 | ]
153 | },
154 | {
155 | "cell_type": "code",
156 | "execution_count": null,
157 | "id": "american-access",
158 | "metadata": {},
159 | "outputs": [],
160 | "source": [
161 | "print(w1)"
162 | ]
163 | },
164 | {
165 | "cell_type": "code",
166 | "execution_count": null,
167 | "id": "governing-reader",
168 | "metadata": {},
169 | "outputs": [],
170 | "source": [
171 | "# Multiply the sample with the first layer weights <𝐱,𝐰1>\n",
172 | "\n",
173 | "a1 = np.dot(sample, w1)\n",
174 | "a1"
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": null,
180 | "id": "concrete-differential",
181 | "metadata": {},
182 | "outputs": [],
183 | "source": [
184 | "b1"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": null,
190 | "id": "institutional-talent",
191 | "metadata": {},
192 | "outputs": [],
193 | "source": [
194 | "# Add the bias to the product <𝐱,𝐰1>+ b\n",
195 | "\n",
196 | "a1 + b1"
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": null,
202 | "id": "balanced-storm",
203 | "metadata": {},
204 | "outputs": [],
205 | "source": [
206 | "# Apply the activation to get the output of the first layer f(<𝐱,𝐰1>+ b)\n",
207 | "\n",
208 | "f1 = sigmoid(a1 + b1)\n",
209 | "f1"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "id": "promising-exhibit",
215 | "metadata": {},
216 | "source": [
217 | "## Layer 2: Weights, Biases and Activations"
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "id": "acknowledged-cruise",
223 | "metadata": {},
224 | "source": [
225 | "
"
226 | ]
227 | },
228 | {
229 | "cell_type": "code",
230 | "execution_count": null,
231 | "id": "color-source",
232 | "metadata": {},
233 | "outputs": [],
234 | "source": [
235 | "w2 = np.random.rand(5, 7)\n",
236 | "b2 = np.random.rand(7)"
237 | ]
238 | },
239 | {
240 | "cell_type": "code",
241 | "execution_count": null,
242 | "id": "visible-fifth",
243 | "metadata": {},
244 | "outputs": [],
245 | "source": [
246 | "a2 = np.dot(f1, w2) + b2\n",
247 | "a2"
248 | ]
249 | },
250 | {
251 | "cell_type": "code",
252 | "execution_count": null,
253 | "id": "radical-serum",
254 | "metadata": {},
255 | "outputs": [],
256 | "source": [
257 | "f2 = sigmoid(a2)\n",
258 | "f2"
259 | ]
260 | },
261 | {
262 | "cell_type": "markdown",
263 | "id": "ahead-outreach",
264 | "metadata": {},
265 | "source": [
266 | "## Layer 3: Weights, Biases and Activations"
267 | ]
268 | },
269 | {
270 | "cell_type": "markdown",
271 | "id": "fuzzy-homeless",
272 | "metadata": {},
273 | "source": [
274 | "
"
275 | ]
276 | },
277 | {
278 | "cell_type": "code",
279 | "execution_count": null,
280 | "id": "conventional-white",
281 | "metadata": {},
282 | "outputs": [],
283 | "source": [
284 | "w3 = np.random.rand(7, 3)\n",
285 | "b3 = np.random.rand(3)"
286 | ]
287 | },
288 | {
289 | "cell_type": "code",
290 | "execution_count": null,
291 | "id": "beautiful-springfield",
292 | "metadata": {},
293 | "outputs": [],
294 | "source": [
295 | "a3 = np.dot(f2, w3) + b3\n",
296 | "a3"
297 | ]
298 | },
299 | {
300 | "cell_type": "code",
301 | "execution_count": null,
302 | "id": "solid-inquiry",
303 | "metadata": {},
304 | "outputs": [],
305 | "source": [
306 | "f3 = softmax(a3)\n",
307 | "f3"
308 | ]
309 | },
310 | {
311 | "cell_type": "code",
312 | "execution_count": null,
313 | "id": "valuable-science",
314 | "metadata": {},
315 | "outputs": [],
316 | "source": []
317 | }
318 | ],
319 | "metadata": {
320 | "kernelspec": {
321 | "display_name": "Python 3",
322 | "language": "python",
323 | "name": "python3"
324 | },
325 | "language_info": {
326 | "codemirror_mode": {
327 | "name": "ipython",
328 | "version": 3
329 | },
330 | "file_extension": ".py",
331 | "mimetype": "text/x-python",
332 | "name": "python",
333 | "nbconvert_exporter": "python",
334 | "pygments_lexer": "ipython3",
335 | "version": "3.7.7"
336 | }
337 | },
338 | "nbformat": 4,
339 | "nbformat_minor": 5
340 | }
341 |
--------------------------------------------------------------------------------
/keras.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## [Installing Tensorflow / Keras](https://www.tensorflow.org/install)"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 2,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "# Imports\n",
17 | "\n",
18 | "from tensorflow.keras.layers import Dense\n",
19 | "from tensorflow.keras import Sequential\n",
20 | "from tensorflow.keras.optimizers import SGD\n",
21 | "from tensorflow.keras.utils import to_categorical, plot_model\n",
22 | "import pandas as pd\n",
23 | "import numpy as np\n",
24 | "import matplotlib.pyplot as plt\n",
25 | "%matplotlib inline"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "## Problem: **Credit Card Fraud Detection**\n",
33 | "### Given a list of 28 anonimyzed features and the amount of money involved in a credt card transaction, predict whether the transaction is likely to be fraudulent.\n",
34 | "### Source: https://www.kaggle.com/mlg-ulb/creditcardfraud/"
35 | ]
36 | },
37 | {
38 | "cell_type": "code",
39 | "execution_count": 3,
40 | "metadata": {},
41 | "outputs": [
42 | {
43 | "data": {
44 | "text/html": [
45 | "
\n",
46 | "\n",
59 | "
\n",
60 | " \n",
61 | " \n",
62 | " | \n",
63 | " V1 | \n",
64 | " V2 | \n",
65 | " V3 | \n",
66 | " V4 | \n",
67 | " V5 | \n",
68 | " V6 | \n",
69 | " V7 | \n",
70 | " V8 | \n",
71 | " V9 | \n",
72 | " V10 | \n",
73 | " ... | \n",
74 | " V21 | \n",
75 | " V22 | \n",
76 | " V23 | \n",
77 | " V24 | \n",
78 | " V25 | \n",
79 | " V26 | \n",
80 | " V27 | \n",
81 | " V28 | \n",
82 | " Amount | \n",
83 | " Class | \n",
84 | "
\n",
85 | " \n",
86 | " \n",
87 | " \n",
88 | " | 0 | \n",
89 | " -1.359807 | \n",
90 | " -0.072781 | \n",
91 | " 2.536347 | \n",
92 | " 1.378155 | \n",
93 | " -0.338321 | \n",
94 | " 0.462388 | \n",
95 | " 0.239599 | \n",
96 | " 0.098698 | \n",
97 | " 0.363787 | \n",
98 | " 0.090794 | \n",
99 | " ... | \n",
100 | " -0.018307 | \n",
101 | " 0.277838 | \n",
102 | " -0.110474 | \n",
103 | " 0.066928 | \n",
104 | " 0.128539 | \n",
105 | " -0.189115 | \n",
106 | " 0.133558 | \n",
107 | " -0.021053 | \n",
108 | " 149.62 | \n",
109 | " 0 | \n",
110 | "
\n",
111 | " \n",
112 | " | 1 | \n",
113 | " 1.191857 | \n",
114 | " 0.266151 | \n",
115 | " 0.166480 | \n",
116 | " 0.448154 | \n",
117 | " 0.060018 | \n",
118 | " -0.082361 | \n",
119 | " -0.078803 | \n",
120 | " 0.085102 | \n",
121 | " -0.255425 | \n",
122 | " -0.166974 | \n",
123 | " ... | \n",
124 | " -0.225775 | \n",
125 | " -0.638672 | \n",
126 | " 0.101288 | \n",
127 | " -0.339846 | \n",
128 | " 0.167170 | \n",
129 | " 0.125895 | \n",
130 | " -0.008983 | \n",
131 | " 0.014724 | \n",
132 | " 2.69 | \n",
133 | " 0 | \n",
134 | "
\n",
135 | " \n",
136 | " | 2 | \n",
137 | " -1.358354 | \n",
138 | " -1.340163 | \n",
139 | " 1.773209 | \n",
140 | " 0.379780 | \n",
141 | " -0.503198 | \n",
142 | " 1.800499 | \n",
143 | " 0.791461 | \n",
144 | " 0.247676 | \n",
145 | " -1.514654 | \n",
146 | " 0.207643 | \n",
147 | " ... | \n",
148 | " 0.247998 | \n",
149 | " 0.771679 | \n",
150 | " 0.909412 | \n",
151 | " -0.689281 | \n",
152 | " -0.327642 | \n",
153 | " -0.139097 | \n",
154 | " -0.055353 | \n",
155 | " -0.059752 | \n",
156 | " 378.66 | \n",
157 | " 0 | \n",
158 | "
\n",
159 | " \n",
160 | " | 3 | \n",
161 | " -0.966272 | \n",
162 | " -0.185226 | \n",
163 | " 1.792993 | \n",
164 | " -0.863291 | \n",
165 | " -0.010309 | \n",
166 | " 1.247203 | \n",
167 | " 0.237609 | \n",
168 | " 0.377436 | \n",
169 | " -1.387024 | \n",
170 | " -0.054952 | \n",
171 | " ... | \n",
172 | " -0.108300 | \n",
173 | " 0.005274 | \n",
174 | " -0.190321 | \n",
175 | " -1.175575 | \n",
176 | " 0.647376 | \n",
177 | " -0.221929 | \n",
178 | " 0.062723 | \n",
179 | " 0.061458 | \n",
180 | " 123.50 | \n",
181 | " 0 | \n",
182 | "
\n",
183 | " \n",
184 | " | 4 | \n",
185 | " -1.158233 | \n",
186 | " 0.877737 | \n",
187 | " 1.548718 | \n",
188 | " 0.403034 | \n",
189 | " -0.407193 | \n",
190 | " 0.095921 | \n",
191 | " 0.592941 | \n",
192 | " -0.270533 | \n",
193 | " 0.817739 | \n",
194 | " 0.753074 | \n",
195 | " ... | \n",
196 | " -0.009431 | \n",
197 | " 0.798278 | \n",
198 | " -0.137458 | \n",
199 | " 0.141267 | \n",
200 | " -0.206010 | \n",
201 | " 0.502292 | \n",
202 | " 0.219422 | \n",
203 | " 0.215153 | \n",
204 | " 69.99 | \n",
205 | " 0 | \n",
206 | "
\n",
207 | " \n",
208 | "
\n",
209 | "
5 rows × 30 columns
\n",
210 | "
"
211 | ],
212 | "text/plain": [
213 | " V1 V2 V3 V4 V5 V6 V7 \\\n",
214 | "0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 \n",
215 | "1 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 \n",
216 | "2 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 \n",
217 | "3 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 \n",
218 | "4 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 \n",
219 | "\n",
220 | " V8 V9 V10 ... V21 V22 V23 V24 \\\n",
221 | "0 0.098698 0.363787 0.090794 ... -0.018307 0.277838 -0.110474 0.066928 \n",
222 | "1 0.085102 -0.255425 -0.166974 ... -0.225775 -0.638672 0.101288 -0.339846 \n",
223 | "2 0.247676 -1.514654 0.207643 ... 0.247998 0.771679 0.909412 -0.689281 \n",
224 | "3 0.377436 -1.387024 -0.054952 ... -0.108300 0.005274 -0.190321 -1.175575 \n",
225 | "4 -0.270533 0.817739 0.753074 ... -0.009431 0.798278 -0.137458 0.141267 \n",
226 | "\n",
227 | " V25 V26 V27 V28 Amount Class \n",
228 | "0 0.128539 -0.189115 0.133558 -0.021053 149.62 0 \n",
229 | "1 0.167170 0.125895 -0.008983 0.014724 2.69 0 \n",
230 | "2 -0.327642 -0.139097 -0.055353 -0.059752 378.66 0 \n",
231 | "3 0.647376 -0.221929 0.062723 0.061458 123.50 0 \n",
232 | "4 -0.206010 0.502292 0.219422 0.215153 69.99 0 \n",
233 | "\n",
234 | "[5 rows x 30 columns]"
235 | ]
236 | },
237 | "execution_count": 3,
238 | "metadata": {},
239 | "output_type": "execute_result"
240 | }
241 | ],
242 | "source": [
243 | "# Preview dataset\n",
244 | "\n",
245 | "df = pd.read_csv('creditcard.csv')\n",
246 | "df.drop(['Time'], axis=1, inplace=True)\n",
247 | "df.head()"
248 | ]
249 | },
250 | {
251 | "cell_type": "code",
252 | "execution_count": 4,
253 | "metadata": {},
254 | "outputs": [
255 | {
256 | "name": "stdout",
257 | "output_type": "stream",
258 | "text": [
259 | "284807\n"
260 | ]
261 | }
262 | ],
263 | "source": [
264 | "print(len(df))"
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": 5,
270 | "metadata": {},
271 | "outputs": [
272 | {
273 | "data": {
274 | "text/plain": [
275 | "0 0.998273\n",
276 | "1 0.001727\n",
277 | "Name: Class, dtype: float64"
278 | ]
279 | },
280 | "execution_count": 5,
281 | "metadata": {},
282 | "output_type": "execute_result"
283 | }
284 | ],
285 | "source": [
286 | "# Check the proportion of the classes\n",
287 | "\n",
288 | "df['Class'].value_counts(normalize=True)"
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": 6,
294 | "metadata": {},
295 | "outputs": [
296 | {
297 | "data": {
298 | "text/plain": [
299 | ""
300 | ]
301 | },
302 | "execution_count": 6,
303 | "metadata": {},
304 | "output_type": "execute_result"
305 | },
306 | {
307 | "data": {
308 | "image/png": "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\n",
309 | "text/plain": [
310 | ""
311 | ]
312 | },
313 | "metadata": {},
314 | "output_type": "display_data"
315 | }
316 | ],
317 | "source": [
318 | "df['Class'].value_counts(normalize=True).plot(kind='pie')"
319 | ]
320 | },
321 | {
322 | "cell_type": "code",
323 | "execution_count": 7,
324 | "metadata": {},
325 | "outputs": [],
326 | "source": [
327 | "# Define the input and the output\n",
328 | "\n",
329 | "y = df.pop('Class').values\n",
330 | "X = df.values"
331 | ]
332 | },
333 | {
334 | "cell_type": "code",
335 | "execution_count": 8,
336 | "metadata": {},
337 | "outputs": [],
338 | "source": [
339 | "# Assemble the network\n",
340 | "\n",
341 | "model = Sequential([\n",
342 | " Dense(16, input_shape=(29,), activation='relu'),\n",
343 | " Dense(8, activation='relu'),\n",
344 | " Dense(2, activation='softmax')\n",
345 | "])\n",
346 | "model.compile(loss='sparse_categorical_crossentropy', optimizer=SGD(lr=1e-3), metrics=['categorical_accuracy'])"
347 | ]
348 | },
349 | {
350 | "cell_type": "code",
351 | "execution_count": 9,
352 | "metadata": {},
353 | "outputs": [
354 | {
355 | "name": "stdout",
356 | "output_type": "stream",
357 | "text": [
358 | "('Failed to import pydot. You must `pip install pydot` and install graphviz (https://graphviz.gitlab.io/download/), ', 'for `pydotprint` to work.')\n"
359 | ]
360 | }
361 | ],
362 | "source": [
363 | "# View the network - layer by layer\n",
364 | "\n",
365 | "plot_model(model, show_shapes=True, rankdir='LR')"
366 | ]
367 | },
368 | {
369 | "cell_type": "code",
370 | "execution_count": 10,
371 | "metadata": {},
372 | "outputs": [
373 | {
374 | "data": {
375 | "text/plain": [
376 | "[,\n",
377 | " ,\n",
378 | " ]"
379 | ]
380 | },
381 | "execution_count": 10,
382 | "metadata": {},
383 | "output_type": "execute_result"
384 | }
385 | ],
386 | "source": [
387 | "model.layers"
388 | ]
389 | },
390 | {
391 | "cell_type": "code",
392 | "execution_count": 11,
393 | "metadata": {},
394 | "outputs": [],
395 | "source": [
396 | "layer1, layer2, layer3 = model.layers"
397 | ]
398 | },
399 | {
400 | "cell_type": "code",
401 | "execution_count": 12,
402 | "metadata": {},
403 | "outputs": [
404 | {
405 | "name": "stdout",
406 | "output_type": "stream",
407 | "text": [
408 | "(29, 16)\n",
409 | "(16,)\n"
410 | ]
411 | }
412 | ],
413 | "source": [
414 | "# View the shapes of weights and biases for each layer\n",
415 | "\n",
416 | "l1_weight, l1_bias = layer1.weights\n",
417 | "print(l1_weight.shape)\n",
418 | "print(l1_bias.shape)"
419 | ]
420 | },
421 | {
422 | "cell_type": "code",
423 | "execution_count": 13,
424 | "metadata": {},
425 | "outputs": [
426 | {
427 | "name": "stdout",
428 | "output_type": "stream",
429 | "text": [
430 | "(16, 8)\n",
431 | "(8,)\n"
432 | ]
433 | }
434 | ],
435 | "source": [
436 | "l2_weight, l2_bias = layer2.weights\n",
437 | "print(l2_weight.shape)\n",
438 | "print(l2_bias.shape)"
439 | ]
440 | },
441 | {
442 | "cell_type": "code",
443 | "execution_count": 14,
444 | "metadata": {},
445 | "outputs": [
446 | {
447 | "name": "stdout",
448 | "output_type": "stream",
449 | "text": [
450 | "(8, 2)\n",
451 | "(2,)\n"
452 | ]
453 | }
454 | ],
455 | "source": [
456 | "l3_weight, l3_bias = layer3.weights\n",
457 | "print(l3_weight.shape)\n",
458 | "print(l3_bias.shape)"
459 | ]
460 | },
461 | {
462 | "cell_type": "code",
463 | "execution_count": 15,
464 | "metadata": {
465 | "scrolled": true
466 | },
467 | "outputs": [
468 | {
469 | "name": "stdout",
470 | "output_type": "stream",
471 | "text": [
472 | "Epoch 1/30\n",
473 | "2226/2226 [==============================] - 2s 590us/step - loss: 0.1794 - categorical_accuracy: 0.9629\n",
474 | "Epoch 2/30\n",
475 | "2226/2226 [==============================] - 1s 583us/step - loss: 0.1216 - categorical_accuracy: 0.9975\n",
476 | "Epoch 3/30\n",
477 | "2226/2226 [==============================] - 1s 594us/step - loss: 0.0876 - categorical_accuracy: 0.9991\n",
478 | "Epoch 4/30\n",
479 | "2226/2226 [==============================] - 1s 660us/step - loss: 0.0608 - categorical_accuracy: 0.9997\n",
480 | "Epoch 5/30\n",
481 | "2226/2226 [==============================] - 1s 670us/step - loss: 0.0422 - categorical_accuracy: 0.9998\n",
482 | "Epoch 6/30\n",
483 | "2226/2226 [==============================] - 1s 658us/step - loss: 0.0338 - categorical_accuracy: 0.9999\n",
484 | "Epoch 7/30\n",
485 | "2226/2226 [==============================] - 1s 625us/step - loss: 0.0267 - categorical_accuracy: 0.9997\n",
486 | "Epoch 8/30\n",
487 | "2226/2226 [==============================] - 1s 628us/step - loss: 0.0240 - categorical_accuracy: 0.9996\n",
488 | "Epoch 9/30\n",
489 | "2226/2226 [==============================] - 1s 668us/step - loss: 0.0193 - categorical_accuracy: 0.9995\n",
490 | "Epoch 10/30\n",
491 | "2226/2226 [==============================] - 1s 644us/step - loss: 0.0164 - categorical_accuracy: 0.9995\n",
492 | "Epoch 11/30\n",
493 | "2226/2226 [==============================] - 1s 654us/step - loss: 0.0135 - categorical_accuracy: 0.9994\n",
494 | "Epoch 12/30\n",
495 | "2226/2226 [==============================] - 2s 697us/step - loss: 0.0140 - categorical_accuracy: 0.9993\n",
496 | "Epoch 13/30\n",
497 | "2226/2226 [==============================] - 2s 839us/step - loss: 0.0114 - categorical_accuracy: 0.9993\n",
498 | "Epoch 14/30\n",
499 | "2226/2226 [==============================] - 2s 860us/step - loss: 0.0110 - categorical_accuracy: 0.9993\n",
500 | "Epoch 15/30\n",
501 | "2226/2226 [==============================] - 1s 668us/step - loss: 0.0113 - categorical_accuracy: 0.9992\n",
502 | "Epoch 16/30\n",
503 | "2226/2226 [==============================] - 2s 727us/step - loss: 0.0128 - categorical_accuracy: 0.9992\n",
504 | "Epoch 17/30\n",
505 | "2226/2226 [==============================] - 1s 645us/step - loss: 0.0098 - categorical_accuracy: 0.9991\n",
506 | "Epoch 18/30\n",
507 | "2226/2226 [==============================] - 1s 658us/step - loss: 0.0109 - categorical_accuracy: 0.9992\n",
508 | "Epoch 19/30\n",
509 | "2226/2226 [==============================] - 1s 648us/step - loss: 0.0094 - categorical_accuracy: 0.9991\n",
510 | "Epoch 20/30\n",
511 | "2226/2226 [==============================] - 2s 700us/step - loss: 0.0102 - categorical_accuracy: 0.9992\n",
512 | "Epoch 21/30\n",
513 | "2226/2226 [==============================] - 1s 666us/step - loss: 0.0095 - categorical_accuracy: 0.9991\n",
514 | "Epoch 22/30\n",
515 | "2226/2226 [==============================] - 2s 678us/step - loss: 0.0092 - categorical_accuracy: 0.9992\n",
516 | "Epoch 23/30\n",
517 | "2226/2226 [==============================] - 2s 865us/step - loss: 0.0087 - categorical_accuracy: 0.9992\n",
518 | "Epoch 24/30\n",
519 | "2226/2226 [==============================] - 3s 1ms/step - loss: 0.0079 - categorical_accuracy: 0.9992\n",
520 | "Epoch 25/30\n",
521 | "2226/2226 [==============================] - 2s 1ms/step - loss: 0.0120 - categorical_accuracy: 0.9991\n",
522 | "Epoch 26/30\n",
523 | "2226/2226 [==============================] - 2s 960us/step - loss: 0.0072 - categorical_accuracy: 0.9992\n",
524 | "Epoch 27/30\n",
525 | "2226/2226 [==============================] - 2s 982us/step - loss: 0.0093 - categorical_accuracy: 0.9991\n",
526 | "Epoch 28/30\n",
527 | "2226/2226 [==============================] - 2s 1ms/step - loss: 0.0077 - categorical_accuracy: 0.9991\n",
528 | "Epoch 29/30\n",
529 | "2226/2226 [==============================] - 2s 936us/step - loss: 0.0091 - categorical_accuracy: 0.9990\n",
530 | "Epoch 30/30\n",
531 | "2226/2226 [==============================] - 2s 853us/step - loss: 0.0091 - categorical_accuracy: 0.9989\n"
532 | ]
533 | }
534 | ],
535 | "source": [
536 | "# Train the model\n",
537 | "\n",
538 | "history = model.fit(X, y, batch_size=128, epochs=30)"
539 | ]
540 | },
541 | {
542 | "cell_type": "code",
543 | "execution_count": 16,
544 | "metadata": {},
545 | "outputs": [
546 | {
547 | "data": {
548 | "text/plain": [
549 | "[]"
550 | ]
551 | },
552 | "execution_count": 16,
553 | "metadata": {},
554 | "output_type": "execute_result"
555 | },
556 | {
557 | "data": {
558 | "image/png": "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\n",
559 | "text/plain": [
560 | ""
561 | ]
562 | },
563 | "metadata": {
564 | "needs_background": "light"
565 | },
566 | "output_type": "display_data"
567 | }
568 | ],
569 | "source": [
570 | "# Plot the loss across epochs\n",
571 | "\n",
572 | "plt.plot(history.history['loss'], label='Loss')"
573 | ]
574 | },
575 | {
576 | "cell_type": "code",
577 | "execution_count": 17,
578 | "metadata": {},
579 | "outputs": [
580 | {
581 | "data": {
582 | "text/plain": [
583 | "[]"
584 | ]
585 | },
586 | "execution_count": 17,
587 | "metadata": {},
588 | "output_type": "execute_result"
589 | },
590 | {
591 | "data": {
592 | "image/png": "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\n",
593 | "text/plain": [
594 | ""
595 | ]
596 | },
597 | "metadata": {
598 | "needs_background": "light"
599 | },
600 | "output_type": "display_data"
601 | }
602 | ],
603 | "source": [
604 | "# Plot the accuracy across epochs\n",
605 | "\n",
606 | "plt.plot(history.history['categorical_accuracy'], label='Accuracy')"
607 | ]
608 | },
609 | {
610 | "cell_type": "code",
611 | "execution_count": null,
612 | "metadata": {},
613 | "outputs": [],
614 | "source": []
615 | }
616 | ],
617 | "metadata": {
618 | "kernelspec": {
619 | "display_name": "Python 3",
620 | "language": "python",
621 | "name": "python3"
622 | },
623 | "language_info": {
624 | "codemirror_mode": {
625 | "name": "ipython",
626 | "version": 3
627 | },
628 | "file_extension": ".py",
629 | "mimetype": "text/x-python",
630 | "name": "python",
631 | "nbconvert_exporter": "python",
632 | "pygments_lexer": "ipython3",
633 | "version": "3.8.5"
634 | }
635 | },
636 | "nbformat": 4,
637 | "nbformat_minor": 5
638 | }
639 |
--------------------------------------------------------------------------------