CAN_attack_detection.ipynb
67.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Untitled3.ipynb.zip",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"display_name": "Python 3",
"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.7.6"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "pTOLXzPreVMW"
},
"source": [
"# *Pre process*"
]
},
{
"cell_type": "code",
"metadata": {
"id": "lAltJ7NjFz5e"
},
"source": [
"import csv\n",
"\n",
"f_fuzzy = open('fuzzy_dataset.csv', 'r')\n",
"f_dos = open('DoS_dataset.csv', 'r')\n",
"f_spoof = open('gear_dataset.csv', 'r')\n",
"\n",
"f2 = open('flattened_dataset.csv', 'w')\n",
"\n",
"c_fuzzy = csv.reader(f_fuzzy)\n",
"c_dos = csv.reader(f_dos)\n",
"c_spoof = csv.reader(f_spoof)\n",
"\n",
"fw = csv.writer(f2)\n",
"fw.writerow(['TimeStamp', 'CAN_ID', 'DLC', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'Class'])\n",
"\n",
"for line in c_fuzzy :\n",
" newdata = []\n",
" #TimeStamp\n",
" newdata.append(line[0])\n",
" #CAN_ID \n",
" can_id = int(line[1], 16)\n",
" newdata.append(can_id)\n",
" #DLC\n",
" newdata.append(line[2])\n",
"\n",
" ll = len(line)\n",
" num = int(line[2])\n",
"\n",
" data = []\n",
" if num == 8 :\n",
" data = line[3:11]\n",
" else :\n",
" data = line[3: 3 + num] \n",
" for _ in range(8 - num):\n",
" data.append('0')\n",
" \n",
" newdata.extend(list(map(lambda x:int(x, 16), data)))\n",
"\n",
" #Class\n",
" if line[-1] == 'T':\n",
" newdata.append('F')\n",
" else:\n",
" newdata.append('R')\n",
" \n",
" fw.writerow(newdata)\n",
"\n",
"for line in c_dos :\n",
" newdata = []\n",
" #TimeStamp\n",
" newdata.append(line[0])\n",
" #CAN_ID \n",
" can_id = int(line[1], 16)\n",
" newdata.append(can_id)\n",
" #DLC\n",
" newdata.append(line[2])\n",
"\n",
" ll = len(line)\n",
" num = int(line[2])\n",
"\n",
" data = []\n",
" if num == 8 :\n",
" data = line[3:11]\n",
" else :\n",
" data = line[3: 3 + num] \n",
" for _ in range(8 - num):\n",
" data.append('0')\n",
" \n",
" newdata.extend(list(map(lambda x:int(x, 16), data)))\n",
"\n",
" #Class\n",
" if line[-1] == 'T':\n",
" newdata.append('D')\n",
" else:\n",
" newdata.append('R')\n",
" \n",
" fw.writerow(newdata)\n",
"\n",
"for line in c_spoof :\n",
" newdata = []\n",
" #TimeStamp\n",
" newdata.append(line[0])\n",
" #CAN_ID \n",
" can_id = int(line[1], 16)\n",
" newdata.append(can_id)\n",
" #DLC\n",
" newdata.append(line[2])\n",
"\n",
" ll = len(line)\n",
" num = int(line[2])\n",
"\n",
" data = []\n",
" if num == 8 :\n",
" data = line[3:11]\n",
" else :\n",
" data = line[3: 3 + num] \n",
" for _ in range(8 - num):\n",
" data.append('0')\n",
" \n",
" newdata.extend(list(map(lambda x:int(x, 16), data)))\n",
"\n",
" #Class\n",
" if line[-1] == 'T':\n",
" newdata.append('S')\n",
" else:\n",
" newdata.append('R')\n",
" \n",
" fw.writerow(newdata)\n",
"\n",
"f_fuzzy.close()\n",
"f_dos.close()\n",
"f_spoof.close()\n",
"f2.close()\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "uXQDTXcy-svF",
"outputId": "e2ef2d92-a7ac-4edd-efe5-f1cd1fdd0640",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
}
},
"source": [
"import pandas as pd\n",
"DoSData = 'flattened_dataset.csv'\n",
"data2 = pd.read_csv(DoSData)\n",
"data2.head(3)"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>TimeStamp</th>\n",
" <th>CAN_ID</th>\n",
" <th>DLC</th>\n",
" <th>D0</th>\n",
" <th>D1</th>\n",
" <th>D2</th>\n",
" <th>D3</th>\n",
" <th>D4</th>\n",
" <th>D5</th>\n",
" <th>D6</th>\n",
" <th>D7</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.478196e+09</td>\n",
" <td>1349</td>\n",
" <td>8</td>\n",
" <td>216</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>138</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>R</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.478196e+09</td>\n",
" <td>688</td>\n",
" <td>5</td>\n",
" <td>255</td>\n",
" <td>127</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>73</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>R</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.478196e+09</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>21</td>\n",
" <td>R</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" TimeStamp CAN_ID DLC D0 D1 D2 D3 D4 D5 D6 D7 Class\n",
"0 1.478196e+09 1349 8 216 0 0 138 0 0 0 0 R\n",
"1 1.478196e+09 688 5 255 127 0 5 73 0 0 0 R\n",
"2 1.478196e+09 2 8 0 0 0 0 0 1 7 21 R"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "cOJ-HhIjaGuw"
},
"source": [
"import numpy as np\n",
"import os\n",
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Vqdupl65laNN",
"outputId": "4ff814be-b707-48be-8455-f4e7548baa6c",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Mounted at /content/drive\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "NMIiv0ydmU9M",
"outputId": "ce8efb61-2749-4b90-a8c8-41752532457c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 142
}
},
"source": [
"DATASET = 'flattened_dataset.csv'\n",
"\n",
"data = pd.read_csv(DATASET)\n",
"data.head(3)\n",
"\n",
"# Timestamp / CAN_ID / DLC / DATA[0~7] / Flag(T or R)\n",
"# Flag T : injected message\n",
"# Flag R : normal message"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>TimeStamp</th>\n",
" <th>CAN_ID</th>\n",
" <th>DLC</th>\n",
" <th>D0</th>\n",
" <th>D1</th>\n",
" <th>D2</th>\n",
" <th>D3</th>\n",
" <th>D4</th>\n",
" <th>D5</th>\n",
" <th>D6</th>\n",
" <th>D7</th>\n",
" <th>Class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.478196e+09</td>\n",
" <td>1349</td>\n",
" <td>8</td>\n",
" <td>216</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>138</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>R</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.478196e+09</td>\n",
" <td>688</td>\n",
" <td>5</td>\n",
" <td>255</td>\n",
" <td>127</td>\n",
" <td>0</td>\n",
" <td>5</td>\n",
" <td>73</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>R</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.478196e+09</td>\n",
" <td>2</td>\n",
" <td>8</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>21</td>\n",
" <td>R</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" TimeStamp CAN_ID DLC D0 D1 D2 D3 D4 D5 D6 D7 Class\n",
"0 1.478196e+09 1349 8 216 0 0 138 0 0 0 0 R\n",
"1 1.478196e+09 688 5 255 127 0 5 73 0 0 0 R\n",
"2 1.478196e+09 2 8 0 0 0 0 0 1 7 21 R"
]
},
"metadata": {
"tags": []
},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "DP5WOQ4u-ZeB",
"outputId": "1df9f838-df43-43f1-edca-9d2dc73dd832",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
"print(data[22300:22310])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
" TimeStamp CAN_ID DLC D0 D1 D2 D3 D4 D5 D6 D7 Class\n",
"22300 1.478196e+09 1264 8 0 0 0 128 0 103 209 19 R\n",
"22301 1.478196e+09 516 8 46 83 79 59 102 176 183 207 F\n",
"22302 1.478196e+09 1854 8 228 145 60 2 206 144 153 114 F\n",
"22303 1.478196e+09 688 5 254 255 0 7 142 0 0 0 R\n",
"22304 1.478196e+09 1465 8 137 118 76 181 133 103 221 15 F\n",
"22305 1.478196e+09 848 8 5 32 244 104 120 0 0 193 R\n",
"22306 1.478196e+09 1256 8 98 64 27 38 174 199 230 232 F\n",
"22307 1.478196e+09 868 8 81 131 115 250 11 5 92 212 F\n",
"22308 1.478196e+09 955 8 205 183 172 152 197 46 6 100 F\n",
"22309 1.478196e+09 704 8 21 0 0 0 0 0 0 0 R\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "b5MCnW9uATlv"
},
"source": [
"import csv\n",
"\n",
"def Preprocess() :\n",
" f1 = open('flattened_dataset.csv', 'r')\n",
" fr = csv.reader(f1)\n",
" d = [] \n",
" for line in fr :\n",
" l = []\n",
" #l.append(line[0])\n",
" l.append(line[1])\n",
" l.append(line[2])\n",
" l.extend(line[3:11])\n",
" class_ = [1,0,0,0]\n",
" if line[-1] == 'R' :\n",
" class_ = [1,0,0,0]\n",
" elif line[-1] == 'F':\n",
" class_ = [0,1,0,0]\n",
" elif line[-1] == 'D':\n",
" class_ = [0,0,1,0]\n",
" elif line[-1] == 'S':\n",
" class_ = [0,0,0,1]\n",
" l.append(class_)\n",
" d.append(l)\n",
" d = d[1:]\n",
" return d\n",
"\n",
"datalist = Preprocess()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZAlE8vpReK9-"
},
"source": [
"# *Spilt train-set and test-set*"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Tr2hXz7MLKH-"
},
"source": [
"def CreateSequences(arr, length) : # Three-Dim\n",
" data = []\n",
" if length == 1 :\n",
" for i in range((len(arr))) :\n",
" t = [arr[i]]\n",
" data.append(t)\n",
" else :\n",
" for i in range(len(arr)-length-1):\n",
" t = arr[i:(i+length)]\n",
" data.append(t)\n",
" \n",
" return data"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "KNa4pIvphsev"
},
"source": [
"import numpy\n",
"df = pd.DataFrame(datalist, columns=['CAN_ID', 'DLC', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'Class'])\n",
"n = len(df)\n",
"\n",
"X_train = df.iloc[0:n, 0:10].values # 나머지\n",
"Y_train = df.iloc[0:n, 10].values # class\n",
"\n",
"X_train = X_train.astype(numpy.float32)\n",
"#Y_train = Y_train.astype(numpy.float32)\n",
"\n",
"X_train = CreateSequences(X_train, 1)\n",
"Y_train = CreateSequences(Y_train, 1)\n",
"\n",
"# Data and labels are all numpy array\n",
"X_train = np.asarray(X_train)\n",
"Y_train = np.asarray(Y_train)\n",
"\n",
"Y_train = np.squeeze(Y_train, axis=1)\n",
"x_train, x_test, y_train, y_test = train_test_split(X_train, Y_train, test_size=0.3, random_state=321)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "OPZKbqORgQ4N",
"outputId": "35b3f0f9-515e-48ca-c7de-3af6ed2e4565",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
"print(Y_train.shape)\n",
"print(x_train.shape)\n",
"print(y_train.shape)\n",
"print(x_test.shape)\n",
"print(y_test.shape)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"(11947773, 4)\n",
"(8363441, 1, 10)\n",
"(8363441, 4)\n",
"(3584332, 1, 10)\n",
"(3584332, 4)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6bAB8v9seCuK"
},
"source": [
"# *Model*"
]
},
{
"cell_type": "code",
"metadata": {
"id": "j35mqU12m9w4",
"outputId": "483cd30c-2473-4cc1-d407-2b1f14abeff6",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
"# Model\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, LSTM, SimpleRNN, Activation, RepeatVector, TimeDistributed\n",
"from keras.utils import np_utils\n",
"from keras.layers.normalization import BatchNormalization\n",
"\n",
"model = Sequential()\n",
"\n",
"#model.add(LSTM(1, activation='relu', input_shape=(1, 11), input_dim=11, return_sequences=True))\n",
"# Timestamp마다 출력을 반환하려면 return_sequences=True\n",
"\"\"\"\n",
"model.add(LSTM(100, return_sequences=True, activation='tanh', input_shape=(1, 11)))\n",
"model.add(Dense(50, activation='relu'))\n",
"model.add(Dense(30, activation='relu'))\n",
"model.add(Dense(10, activation='relu'))\n",
"model.add(Dense(1, activation='sigmoid'))\n",
"\"\"\"\n",
"\"\"\"\n",
"model.add(LSTM(32, return_sequences=True, stateful=True, batch_input_shape=(1, 1, 11)))\n",
"model.add(BatchNormalization())\n",
"model.add(LSTM(32, return_sequences=True, stateful=True))\n",
"model.add(BatchNormalization())\n",
"model.add(LSTM(32, stateful=True))\n",
"model.add(BatchNormalization())\n",
"model.add(Dense(50, activation='relu'))\n",
"model.add(BatchNormalization())\n",
"model.add(Dense(1, activation='sigmoid'))\n",
"\"\"\"\n",
"\n",
"model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, input_shape=(1, 10)))\n",
"#model.add(Dense(1, activation='sigmoid'))\n",
"model.add(Dense(4, activation='softmax'))\n",
"#model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n",
"model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
"model.summary()"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU\n",
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"lstm (LSTM) (None, 100) 44400 \n",
"_________________________________________________________________\n",
"dense (Dense) (None, 4) 404 \n",
"=================================================================\n",
"Total params: 44,804\n",
"Trainable params: 44,804\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xNHDmdrorjdd",
"outputId": "a6dd00a6-a5ac-432f-b0a3-6aed03c31791",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
" history = model.fit(x_train, y_train, batch_size=100, epochs=20, validation_data=(x_test, y_test))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0202 - accuracy: 0.9946 - val_loss: 0.0029 - val_accuracy: 0.9995\n",
"Epoch 2/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0143 - accuracy: 0.9963 - val_loss: 0.0020 - val_accuracy: 0.9996\n",
"Epoch 3/20\n",
"83635/83635 [==============================] - 533s 6ms/step - loss: 0.0116 - accuracy: 0.9970 - val_loss: 0.0028 - val_accuracy: 0.9995\n",
"Epoch 4/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0112 - accuracy: 0.9972 - val_loss: 0.0028 - val_accuracy: 0.9997\n",
"Epoch 5/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0110 - accuracy: 0.9972 - val_loss: 0.0029 - val_accuracy: 0.9995\n",
"Epoch 6/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0104 - accuracy: 0.9974 - val_loss: 0.0037 - val_accuracy: 0.9997\n",
"Epoch 7/20\n",
"83635/83635 [==============================] - 533s 6ms/step - loss: 0.0102 - accuracy: 0.9974 - val_loss: 0.0041 - val_accuracy: 0.9997\n",
"Epoch 8/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0102 - accuracy: 0.9975 - val_loss: 0.0017 - val_accuracy: 0.9998\n",
"Epoch 9/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0106 - accuracy: 0.9974 - val_loss: 0.0022 - val_accuracy: 0.9996\n",
"Epoch 10/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0098 - accuracy: 0.9976 - val_loss: 0.0020 - val_accuracy: 0.9997\n",
"Epoch 11/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0094 - accuracy: 0.9977 - val_loss: 0.0057 - val_accuracy: 0.9998\n",
"Epoch 12/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0086 - accuracy: 0.9979 - val_loss: 0.0028 - val_accuracy: 0.9995\n",
"Epoch 13/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0086 - accuracy: 0.9979 - val_loss: 0.0032 - val_accuracy: 0.9996\n",
"Epoch 14/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0080 - accuracy: 0.9981 - val_loss: 0.0019 - val_accuracy: 0.9998\n",
"Epoch 15/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0078 - accuracy: 0.9982 - val_loss: 0.0016 - val_accuracy: 0.9998\n",
"Epoch 16/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0081 - accuracy: 0.9981 - val_loss: 0.0021 - val_accuracy: 0.9996\n",
"Epoch 17/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0075 - accuracy: 0.9983 - val_loss: 0.0012 - val_accuracy: 0.9998\n",
"Epoch 18/20\n",
"83635/83635 [==============================] - 534s 6ms/step - loss: 0.0076 - accuracy: 0.9983 - val_loss: 0.0015 - val_accuracy: 0.9998\n",
"Epoch 19/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0080 - accuracy: 0.9981 - val_loss: 0.0019 - val_accuracy: 0.9996\n",
"Epoch 20/20\n",
"83635/83635 [==============================] - 535s 6ms/step - loss: 0.0077 - accuracy: 0.9982 - val_loss: 0.0020 - val_accuracy: 0.9997\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "dVZF0rWNUjR-",
"outputId": "1cf0e4a0-101f-472c-c229-fdf4a51de519",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"source": [
"print(\"\\n Test accuracy : %.4f\"%(model.evaluate(x_test, y_test)[1]))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"112011/112011 [==============================] - 181s 2ms/step - loss: 0.0020 - accuracy: 0.9997\n",
"\n",
" Test accuracy : 0.9997\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "foUA4MEwXzoj",
"outputId": "4b967d97-ecce-4f8d-b26c-685000a0f44f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 279
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# 학습셋 오차\n",
"y_loss = history.history['loss']\n",
"# 테스트셋 오차\n",
"y_vloss = history.history['val_loss']\n",
"\n",
"plt.plot(y_loss)\n",
"plt.plot(y_vloss)\n",
"plt.ylabel('loss')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['loss','val_loss'])\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "pYRf0HTYhtUm",
"outputId": "94fbccf0-3d55-49a8-91b9-ddc1be6936f3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 280
}
},
"source": [
"y_acc = history.history['accuracy']\n",
"y_vacc = history.history['val_accuracy']\n",
"\n",
"plt.plot(y_acc)\n",
"plt.plot(y_vacc)\n",
"plt.ylabel('loss')\n",
"plt.xlabel('epoch')\n",
"plt.legend(['accuracy','val_accuracy'])\n",
"plt.show()"
],
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "FgKqLFcMh13F"
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}