-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtitanic-competition
1190 lines (1190 loc) · 248 KB
/
titanic-competition
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
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"cells": [
{
"cell_type": "markdown",
"id": "27c85955",
"metadata": {
"papermill": {
"duration": 0.005527,
"end_time": "2024-07-20T17:13:46.666317",
"exception": false,
"start_time": "2024-07-20T17:13:46.660790",
"status": "completed"
},
"tags": []
},
"source": [
"/kaggle/input/titanic/train.csv\n",
"/kaggle/input/titanic/test.csv\n",
"/kaggle/input/titanic/gender_submission.csv\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "0ccccbbd",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:46.679611Z",
"iopub.status.busy": "2024-07-20T17:13:46.678643Z",
"iopub.status.idle": "2024-07-20T17:13:52.608778Z",
"shell.execute_reply": "2024-07-20T17:13:52.607172Z"
},
"papermill": {
"duration": 5.938621,
"end_time": "2024-07-20T17:13:52.611609",
"exception": false,
"start_time": "2024-07-20T17:13:46.672988",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['train.csv', 'test.csv', 'gender_submission.csv']\n"
]
}
],
"source": [
"import os\n",
"import numpy as np\n",
"import torch\n",
"import torch.nn as nn\n",
"from torch.utils.data import DataLoader\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Set random seed for reproducibility\n",
"torch.manual_seed(42)\n",
"np.random.seed(42)\n",
"\n",
"# Setup path\n",
"TRAIN_PATH = '/kaggle/input/titanic/train.csv'\n",
"TEST_PATH = '/kaggle/input/titanic/test.csv'\n",
"OUTPUT_PATH = '/kaggle/working/gender_submission.csv'\n",
"print(os.listdir('/kaggle/input/titanic'))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "962c9186",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:52.624246Z",
"iopub.status.busy": "2024-07-20T17:13:52.623080Z",
"iopub.status.idle": "2024-07-20T17:13:52.691571Z",
"shell.execute_reply": "2024-07-20T17:13:52.690122Z"
},
"papermill": {
"duration": 0.078917,
"end_time": "2024-07-20T17:13:52.695640",
"exception": false,
"start_time": "2024-07-20T17:13:52.616723",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train data:\n",
" PassengerId Survived Pclass \\\n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"3 4 1 1 \n",
"4 5 0 3 \n",
"\n",
" Name Sex Age SibSp \\\n",
"0 Braund, Mr. Owen Harris male 22.0 1 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
"2 Heikkinen, Miss. Laina female 26.0 0 \n",
"3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
"4 Allen, Mr. William Henry male 35.0 0 \n",
"\n",
" Parch Ticket Fare Cabin Embarked \n",
"0 0 A/5 21171 7.2500 NaN S \n",
"1 0 PC 17599 71.2833 C85 C \n",
"2 0 STON/O2. 3101282 7.9250 NaN S \n",
"3 0 113803 53.1000 C123 S \n",
"4 0 373450 8.0500 NaN S \n",
"\n",
"\n",
"\n",
"Test data:\n",
" PassengerId Pclass Name Sex \\\n",
"0 892 3 Kelly, Mr. James male \n",
"1 893 3 Wilkes, Mrs. James (Ellen Needs) female \n",
"2 894 2 Myles, Mr. Thomas Francis male \n",
"3 895 3 Wirz, Mr. Albert male \n",
"4 896 3 Hirvonen, Mrs. Alexander (Helga E Lindqvist) female \n",
"\n",
" Age SibSp Parch Ticket Fare Cabin Embarked \n",
"0 34.5 0 0 330911 7.8292 NaN Q \n",
"1 47.0 1 0 363272 7.0000 NaN S \n",
"2 62.0 0 0 240276 9.6875 NaN Q \n",
"3 27.0 0 0 315154 8.6625 NaN S \n",
"4 22.0 1 1 3101298 12.2875 NaN S \n"
]
}
],
"source": [
"# Visualize data\n",
"train_df = pd.read_csv(TRAIN_PATH)\n",
"test_df = pd.read_csv(TEST_PATH)\n",
"print(\"Train data:\")\n",
"print(train_df.head())\n",
"print('\\n\\n')\n",
"print(\"Test data:\")\n",
"print(test_df.head()) "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "cb5c36e9",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:52.709557Z",
"iopub.status.busy": "2024-07-20T17:13:52.708977Z",
"iopub.status.idle": "2024-07-20T17:13:54.365325Z",
"shell.execute_reply": "2024-07-20T17:13:54.363787Z"
},
"papermill": {
"duration": 1.666945,
"end_time": "2024-07-20T17:13:54.368613",
"exception": false,
"start_time": "2024-07-20T17:13:52.701668",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train data:\n",
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 891 entries, 0 to 890\n",
"Data columns (total 8 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 PassengerId 891 non-null int64 \n",
" 1 Pclass 891 non-null int64 \n",
" 2 Sex 891 non-null int64 \n",
" 3 Age 891 non-null float64\n",
" 4 SibSp 891 non-null int64 \n",
" 5 Parch 891 non-null int64 \n",
" 6 Fare 891 non-null float64\n",
" 7 Cabin 891 non-null int64 \n",
"dtypes: float64(2), int64(6)\n",
"memory usage: 55.8 KB\n",
"None\n",
"\n",
"\n",
"\n",
"Test data:\n",
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 418 entries, 0 to 417\n",
"Data columns (total 8 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 PassengerId 418 non-null int64 \n",
" 1 Pclass 418 non-null int64 \n",
" 2 Sex 418 non-null int64 \n",
" 3 Age 418 non-null float64\n",
" 4 SibSp 418 non-null int64 \n",
" 5 Parch 418 non-null int64 \n",
" 6 Fare 418 non-null float64\n",
" 7 Cabin 418 non-null int64 \n",
"dtypes: float64(2), int64(6)\n",
"memory usage: 26.2 KB\n",
"None\n"
]
},
{
"data": {
"image/png": "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iorS+vXr9dhjj6l3794aMWLEeeeVizknAKD1iY+PV9euXdWjRw+NHTtWnTt31vr163XVVVe5BGbffPONKioqNGzYMH3wwQf1zvOzn/3MJTCrra3Vhg0bNHr0aJfArI77KuUpU6a47Bs2bJhqamr02WefNcYwgSZHaAZchJqaGq1Zs0a33nqrjh07piNHjujIkSOKjY1VaWmpCgoKJEmfffaZunXrVu+RGPcvbB45ckROp1NPPvmkunbt6lLqPizw/ZdCAwDahhtvvFHr1q3TN998o/fff1/p6ek6ffq07rvvPh08ePAHj73uuutctjt37qxu3brp008/NfbV/UVNcXGxvvrqK7322msaNWqUtm/frrFjx17SOQEArU9WVpby8/P11ltv6eDBg/rkk0+UkJAgScrLy1NcXJwCAwMVEhKirl27asWKFaqoqKh3nqioKJftL7/8Una7/aJfMxAREeGyfcUVV0gS789Eq8HjmcBF2L59u06ePKk1a9ZozZo19epzcnI0cuTIiz5fbW2tpO8e1ambvNy5B20AgLbD399fN954o2688Ub17NlTDz30kNauXduoX2QODQ3VXXfdpbvuuku33HKLduzYoc8++8x49xkAoO266aabzrsS7H//939111136eabb9by5cvVrVs3+fn5afXq1crNza3X/vur0i6Fj4/Pefe7P8YJtFSEZsBFyMnJUVhYmLKysurVrVu3TuvXr9fKlSsVGRmpt956S99++63LarMjR464HHPNNddIkvz8/BQfH9+0nQcAtGh1f6g5efLkD7Y7fPiw8YoASTpz5oxOnjypO+6446KusWPHDp08edIlNLuccwIAWp9//OMfCgwM1Jtvvmm8V1n67vH+i9G1a1eZTCbt37+/qboItCg8ngn8iP/85z9at26d7rzzTt133331Smpqqk6fPq3XX39dCQkJqq6u1ksvvWQcX1tbWy9sCwsL0y233KI//elP5/1DEp9hBoC256233jrv36zXvT+sV69eP3j8iy++qOrqamN7xYoVOnfunEaNGiVJstls533Es6qqSgUFBfL29q63ivnHzgkAaFt8fHzk5eVlvJNZkj799FNt2LDhoo739vbWPffco40bN2rPnj316llBhraGlWbAj3j99dd1+vTpC35FLC4uTl27dlVOTo7Wr1+vm266Sb/97W915MgR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tZK4b57EfHNpfmz+wfn92Pzj4+Pj6S62SD8296C+H5t30LyYa1qu9jCf1dbWyuFweLobl6Stz5tnzpzR0aNH1a1bN0935ZK06PnZwx8iaBZr1qxxBgQEOLOzs50HDx50TpkyxRkcHOy02Wye7lqLMXXqVGdQUJDz7bffdp48edIo3377rdHm17/+tTMiIsK5fft25549e5xWq9VptVo92OuWyf0rLNy383v//fedvr6+zqefftp5+PBhZ05OjrNjx47Ov/3tb0abRYsWOYODg52vvfaa88MPP3TefffdzqioKOd//vMfD/bcs5KTk51XXXWVMy8vz3ns2DHnunXrnFdeeaXz8ccfN9pw3zyH+abhLmb+wcVpzV8Bay4XM/fA1cXMO2hebWmuOX36tPOf//yn85///KdTkvP55593/vOf/3R+9tlnnu5ag7W1+eyJJ55w7tixw3ns2DHnhx9+6HziiSecXl5ezq1bt3q6a42mNc+bv/3tb51vv/2289ixY8733nvPGR8f77zyyiudZWVlnu7aJWnJ83O7CM2cTqfzhRdecEZERDj9/f2dN910k7OoqMjTXWpRJJ23rF692mjzn//8x/nII484r7jiCmfHjh2d9957r/PkyZOe63QL5f7Ll/t2YRs3bnTecMMNzoCAAGd0dLTzxRdfdKmvra11Pvnkk06z2ewMCAhwjhgxwnno0CEP9bZlsNvtzkcffdQZERHhDAwMdF5zzTXO//f//p/T4XAYbbhvnsV80zAXM//g4rTm//lvTj8298DVxcw7aH5tZa556623zjsHJCcne7prDdbW5rOHH37YGRkZ6fT393d27drVOWLEiDYVmDmdrXve/PnPf+7s1q2b09/f33nVVVc5f/7znzuPHDni6W5dlpY6P3s5nU5n861rAwAAAAAAAFq+Nv9OMwAAAAAAAKChCM0AAAAAAAAAN4RmAAAAAAAAgBtCMwAAAAAAAMANoRkAAAAAAADghtAMAAAAAAAAcENoBgAAAAAAALghNAMAAAAAAADcEJoBAAAAAAAAbgjNAAAAAAAAADeEZgAAAAAAAIAbQjMAAAAAAADADaEZAAAAAAAA4IbQDAAAAAAAAHBDaAYAAAAAAAC4ITQDAAAAAAAA3BCaAQAAAAAAAG4IzQAAAAAAAAA3hGYAAAAAAACAG0IzAAAAAAAAwA2hGQAAAAAAAOCG0AwAAAAAAABwQ2gGAAAAAAAAuCE0AwAAAAAAANwQmgEAAAAAAABuCM0AAAAAAAAAN4RmAAAArcCnn34qLy8vZWdne7orAAAA7QKhGfAjsrOz5eXldd7yxBNPeLp7AIAWzn0eCQwMVM+ePZWamqrS0lJPdw8AAAAX4OvpDgCtRUZGhqKiolz23XDDDR7qDQCgtambRyorK/Xuu+9qxYoV2rx5s/bv36+OHTt6unsAAABwQ2gGXKRRo0Zp8ODBjXa+s2fPqlOnTo12PgBAy/b9eeRXv/qVQkND9fzzz+u1117TuHHjPNw7AAAAuOPxTOAyfPbZZ3rkkUfUq1cvdejQQaGhobr//vv16aefurSrezRnx44deuSRRxQWFqbu3bsb9W+88YaGDRumTp06qUuXLkpMTNSBAweaeTQAgOY0fPhwSdKxY8ckSeXl5ZoxY4auvvpqBQQEqHv37po4caK++uqrC57jww8/1IMPPqhrrrlGgYGBslgsevjhh/X111+7tDt9+rSmT59unDssLEy33XabPvjgA6PN4cOHlZSUJIvFosDAQHXv3l1jx45VRUVFE4weAACg5WOlGXCRKioq6v3BZffu3dq5c6fGjh2r7t2769NPP9WKFSt0yy236ODBg/Uet3nkkUfUtWtXzZkzR2fPnpUk/fWvf1VycrISEhL0zDPP6Ntvv9WKFSs0dOhQ/fOf/9TVV1/dXEMEADSjo0ePSpJCQ0N15swZDRs2TB999JEefvhhDRw4UF999ZVef/11ff7557ryyivPe478/Hx98skneuihh2SxWHTgwAG9+OKLOnDggIqKiuTl5SVJ+vWvf62///3vSk1NVUxMjL7++mu9++67+uijjzRw4EBVVVUpISFBDodD06ZNk8Vi0RdffKG8vDyVl5crKCio2e4LAABAS0FoBlyk+Pj4evu+/fZb3XfffS77Ro8eLavVqn/84x+aMGGCS11ISIgKCgrk4+MjSTpz5ox+85vf6Fe/+pVefPFFo11ycrJ69eqlhQsXuuwHALRedX/5UllZqffee08ZGRnq0KGD7rzzTv3+97/X/v37tW7dOt17773GMbNnz5bT6bzgOR955BH99re/ddkXFxencePG6d1339WwYcMkSZs2bdLkyZP13HPPGe0ef/xx4+eDBw/q2LFjWrt2rcu8NmfOnMseNwAAQGtFaAZcpKysLPXs2dNlX4cOHYyfq6urZbfbde211yo4OFgffPBBvdBs8uTJRmAmfbdCoLy8XOPGjXNZxebj46PY2Fi99dZbTTQaAEBzc//Ll8jISOXk5Oiqq67SP/7xD/Xr188lMKtTt1rsfL4/D1VWVurMmTOKi4uTJH3wwQdGaBYcHKxdu3bpxIkTCg8Pr3eeupVkb775pu644w4+TAAAACBCM+Ci3XTTTfU+BPCf//xHmZmZWr16tb744guX1QDneweM+9c3Dx8+LOn/3mvjzmQyXW63AQAtRN1fvvj6+spsNqtXr17y9v7u9bJHjx5VUlJSg8956tQpzZ8/X2vWrFFZWZlL3ffnocWLFys5OVk9evTQoEGDdMcdd2jixIm65pprJH03P6Wlpen5559XTk6Ohg0bprvuuku//OUveTQTAAC0W4RmwGWYNm2aVq9erenTp8tqtSooKEheXl4aO3asamtr67X//ooASUabv/71r7JYLPXa+/rynygAtBXn+8uXy/XAAw9o586dmjlzpvr376/OnTurtrZWt99+u8s89MADD2jYsGFav369tm7dqt///vd65plntG7dOo0aNUqS9Nxzz+nBBx/Ua6+9pq1bt+o3v/mNMjMzVVRU5PLxGgAAgPaCP5EDl+Hvf/+7kpOTXd4RU1lZqfLy8os6/ic/+YkkKSws7LzvTAMAtA8/+clPtH///gYd880336igoEDz5893efdY3Spmd926ddMjjzyiRx55RGVlZRo4cKCefvppIzSTpD59+qhPnz6aPXu2du7cqSFDhmjlypV66qmnLm1gAAAArZi3pzsAtGY+Pj71XtD8wgsvqKam5qKOT0hIkMlk0sKFC1VdXV2v/ssvv2yUfgIAWrakpCT961//0vr16+vVXehDAHXvyHSvX7p0qct2TU1NvVcGhIWFKTw8XA6HQ5Jkt9t17tw5lzZ9+vSRt7e30QYAAKC9YaUZcBnuvPNO/fWvf1VQUJBiYmJUWFiobdu2KTQ09KKON5lMWrFihSZMmKCBAwdq7Nix6tq1q0pKSrRp0yYNGTJEf/zjH5t4FAAAT5s5c6b+/ve/6/7779fDDz+sQYMG6dSpU3r99de1cuVK9evXr94xJpNJN998sxYvXqzq6mpdddVV2rp1q44dO+bS7vTp0+revbvuu+8+9evXT507d9a2bdu0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lZmf/exnplu3bubDDz80xnS+8X7VoUOHzMCBA82IESPM3Llz3es725gXLVpkvvWtb5kzZ864l7/+9a/u9s423s7gar97rT799FPTo0cPk5GRYY4dO2ZeeOEFExQUZPLy8nxTcDvh7by9/fbbRpIpKyvz+PlobGz0TcHtwLUc96zee+89ExQUZJYvX26OHTtmFi5caLp162ZKS0t9WLl/tWTeNm7caOx2u8e+5nK5fFi1/13tPYcV+9rVefvZo7PPqbfz8cMf/tDk5OSYDz74wBw/ftz86Ec/MmFhYeb//u//fFx522jpZ9OTJ0+aG264wdx1111m8uTJvinWR7ydk9raWjN69GgzceJE8+6775qTJ0+awsJCU1JS4uPK24a38/HKK68Ym81mXnnlFXPy5Emze/duEx0dbZ544gkfV942/PUevEuFZnfccYdJS0tzP25sbDT9+/c32dnZfqyqdVh3mqamJhMVFWV+9atfuddVVVUZm81mfve73xljjDl27JiRZA4fPuzu8+abb5qAgADzl7/8xWe1t1RlZaWRZPbt22eM+cf4unXrZrZu3eruc/z4cSPJFBUVGWP+8YMWGBjo8UZ4zZo1xm63m9raWt8OoIX69OljXn755U493nPnzplbbrnF5Ofnm7vvvtsdmnXGMS9atMiMHDmy2bbOON7O5loO2D/96U/Nt771LY9106ZNM8nJyW1YWfvmTWj297//3Sc1dQTW415zfvCDH5iUlBSPdYmJieZf//Vf27q8duta5m3jxo0mLCzMd0V1EJfeczSHfe3qvP3s0dnn9Ho/izU0NJjevXubTZs2tVWJPtWS+WhoaDBjx441L7/8sklNTe10oZm3c7JmzRpz0003mbq6Ol+V6FPezkdaWpoZN26cx7qMjAxz5513tmmd/uDL9+Bd5t8z6+rqVFxcrKSkJPe6wMBAJSUlqaioyI+VtY2TJ0/K5XJ5jDcsLEyJiYnu8RYVFSk8PFyjR49290lKSlJgYKAOHjzo85q9VV1dLUmKiIiQJBUXF6u+vt5jzHFxcYqNjfUY8/Dhw+VwONx9kpOTVVNTo6NHj/qweu81NjZqy5YtunDhgpxOZ6ceb1pamlJSUjzGJnXe7/HHH3+s/v3766abbtL06dNVXl4uqfOOt6spKiq6bF9OTk7ulMeetjBq1ChFR0frvvvu03vvvefv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",
"text/plain": [
"<Figure size 1500x1000 with 6 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Preprocess data\n",
"\n",
"# Transform port of embarkation to -1, 0, 1 for Southampton, Cherbourg, Queenstown\n",
"train_df['Embarked'] = train_df['Embarked'].map({'S': -1, 'C': 0, 'Q': 1})\n",
"test_df['Embarked'] = test_df['Embarked'].map({'S': -1, 'C': 0, 'Q': 1})\n",
"\n",
"# Transform sex to 0, 1\n",
"train_df['Sex'] = train_df['Sex'].map({\"male\": 1, 'female': -1})\n",
"test_df['Sex'] = test_df['Sex'].map({\"male\": 1, 'female': -1})\n",
"\n",
"# Encode cabin letters + numbers to numbers\n",
"train_df['Cabin'] = train_df['Cabin'].str.extract('([A-Za-z])')\n",
"test_df['Cabin'] = test_df['Cabin'].str.extract('([A-Za-z])')\n",
"train_df['Cabin'] = train_df['Cabin'].fillna('U')\n",
"test_df['Cabin'] = test_df['Cabin'].fillna('U')\n",
"cabin_mapping = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'T': 7, 'U': 8}\n",
"train_df['Cabin'] = train_df['Cabin'].map(cabin_mapping)\n",
"test_df['Cabin'] = test_df['Cabin'].map(cabin_mapping)\n",
"\n",
"# Get target variable\n",
"y = train_df['Survived']\n",
"\n",
"# Get rid of unnecessary columns\n",
"X = train_df.drop(['Survived', 'Name', 'Ticket', 'Embarked'], axis=1)\n",
"X_test = test_df.drop(['Name', 'Ticket', 'Embarked'], axis=1)\n",
"\n",
"# Fill missing values\n",
"X['Age'] = X['Age'].fillna(X['Age'].mean())\n",
"X['Fare'] = X['Fare'].fillna(X['Fare'].mean())\n",
"X_test['Age'] = X_test['Age'].fillna(X_test['Age'].mean())\n",
"X_test['Fare'] = X_test['Fare'].fillna(X_test['Fare'].mean())\n",
"\n",
"# Make sure there are no missing values and all values are numerical\n",
"print(\"Train data:\")\n",
"print(X.info())\n",
"print('\\n\\n')\n",
"print(\"Test data:\")\n",
"print(X_test.info())\n",
"\n",
"\n",
"class TitanicDataset(torch.utils.data.Dataset):\n",
" def __init__(self, X, y):\n",
" self.X = torch.tensor(X.values, dtype=torch.float32)\n",
" self.y = torch.tensor(y.values, dtype=torch.int64)\n",
"\n",
" def __len__(self):\n",
" return len(self.X)\n",
"\n",
" def __getitem__(self, idx):\n",
" return self.X[idx], self.y[idx]\n",
" \n",
"# Split data into training and validation sets\n",
"X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"\n",
"# Create dataloaders\n",
"train_dataset = TitanicDataset(X_train, y_train)\n",
"val_dataset = TitanicDataset(X_val, y_val)\n",
"train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n",
"val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)\n",
"\n",
"# Plot disribution of age, number of siblings/spouses, number of parents/children, number of fare and class\n",
"fig, axs = plt.subplots(2, 3, figsize=(15, 10))\n",
"axs[0, 0].hist(X['Age'], bins=20)\n",
"axs[0, 0].set_title('Age')\n",
"axs[0, 1].hist(X['SibSp'], bins=20)\n",
"axs[0, 1].set_title('SibSp')\n",
"axs[0, 2].hist(X['Parch'], bins=20)\n",
"axs[0, 2].set_title('Parch')\n",
"axs[1, 0].hist(X['Fare'], bins=20)\n",
"axs[1, 0].set_title('Fare')\n",
"axs[1, 1].hist(X['Pclass'], bins=20)\n",
"axs[1, 1].set_title('Pclass')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4e206102",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:54.382348Z",
"iopub.status.busy": "2024-07-20T17:13:54.381954Z",
"iopub.status.idle": "2024-07-20T17:13:54.412136Z",
"shell.execute_reply": "2024-07-20T17:13:54.411015Z"
},
"papermill": {
"duration": 0.040249,
"end_time": "2024-07-20T17:13:54.414903",
"exception": false,
"start_time": "2024-07-20T17:13:54.374654",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MLP(\n",
" (fc1): Linear(in_features=8, out_features=256, bias=True)\n",
" (fc2): Linear(in_features=256, out_features=256, bias=True)\n",
" (fc3): Linear(in_features=256, out_features=256, bias=True)\n",
" (fc4): Linear(in_features=256, out_features=2, bias=True)\n",
" (relu): ReLU()\n",
" (dropout): Dropout(p=0.2, inplace=False)\n",
")\n"
]
}
],
"source": [
"# Initialize model (3 hidden layers with 256 neurons each) with dropout\n",
"\n",
"class MLP(nn.Module):\n",
" def __init__(self, *args, **kwargs) -> None:\n",
" super().__init__(*args, **kwargs)\n",
" self.fc1 = nn.Linear(8, 256)\n",
" self.fc2 = nn.Linear(256, 256)\n",
" self.fc3 = nn.Linear(256, 256)\n",
" self.fc4 = nn.Linear(256, 2)\n",
" self.relu = nn.ReLU()\n",
" self.dropout = nn.Dropout(0.2)\n",
"\n",
" def forward(self, x):\n",
" x = self.fc1(x)\n",
" x = self.relu(x)\n",
" x = self.dropout(x)\n",
" x = self.fc2(x)\n",
" x = self.relu(x)\n",
" x = self.dropout(x)\n",
" x = self.fc3(x)\n",
" x = self.relu(x)\n",
" x = self.dropout(x)\n",
" x = self.fc4(x)\n",
" return x\n",
" \n",
"model = MLP()\n",
"print(model)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ce28eed6",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:54.428837Z",
"iopub.status.busy": "2024-07-20T17:13:54.428424Z",
"iopub.status.idle": "2024-07-20T17:13:56.011168Z",
"shell.execute_reply": "2024-07-20T17:13:56.009839Z"
},
"papermill": {
"duration": 1.592995,
"end_time": "2024-07-20T17:13:56.013860",
"exception": false,
"start_time": "2024-07-20T17:13:54.420865",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of parameters: 134402\n"
]
}
],
"source": [
"# Initialize loss function and optimizer\n",
"criterion = nn.CrossEntropyLoss()\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=0.004)\n",
"print(f\"Number of parameters: {sum(p.numel() for p in model.parameters())}\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "efaaaf96",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:13:56.028637Z",
"iopub.status.busy": "2024-07-20T17:13:56.027419Z",
"iopub.status.idle": "2024-07-20T17:15:00.890714Z",
"shell.execute_reply": "2024-07-20T17:15:00.889458Z"
},
"papermill": {
"duration": 64.873512,
"end_time": "2024-07-20T17:15:00.893482",
"exception": false,
"start_time": "2024-07-20T17:13:56.019970",
"status": "completed"
},
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/500 | Train loss: 7.3948 | Train accuracy: 0.5204 | Val loss: 0.7027 | Val accuracy: 0.5913\n",
"Epoch 2/500 | Train loss: 0.7426 | Train accuracy: 0.5924 | Val loss: 0.6764 | Val accuracy: 0.5877\n",
"Epoch 3/500 | Train loss: 0.7127 | Train accuracy: 0.5707 | Val loss: 0.6991 | Val accuracy: 0.3739\n",
"Epoch 4/500 | Train loss: 0.6872 | Train accuracy: 0.6141 | Val loss: 0.6649 | Val accuracy: 0.5877\n",
"Epoch 5/500 | Train loss: 0.6678 | Train accuracy: 0.6332 | Val loss: 0.6596 | Val accuracy: 0.5981\n",
"Epoch 6/500 | Train loss: 0.6670 | Train accuracy: 0.6223 | Val loss: 0.6547 | Val accuracy: 0.6086\n",
"Epoch 7/500 | Train loss: 0.6419 | Train accuracy: 0.6454 | Val loss: 0.6679 | Val accuracy: 0.5981\n",
"Epoch 8/500 | Train loss: 0.6489 | Train accuracy: 0.6658 | Val loss: 0.6290 | Val accuracy: 0.6261\n",
"Epoch 9/500 | Train loss: 0.6511 | Train accuracy: 0.6236 | Val loss: 0.7445 | Val accuracy: 0.6086\n",
"Epoch 10/500 | Train loss: 0.6773 | Train accuracy: 0.6399 | Val loss: 0.7073 | Val accuracy: 0.4940\n",
"Epoch 11/500 | Train loss: 0.6552 | Train accuracy: 0.6495 | Val loss: 0.6444 | Val accuracy: 0.6033\n",
"Epoch 12/500 | Train loss: 0.6400 | Train accuracy: 0.6590 | Val loss: 0.6106 | Val accuracy: 0.6765\n",
"Epoch 13/500 | Train loss: 0.6454 | Train accuracy: 0.6726 | Val loss: 0.6338 | Val accuracy: 0.6678\n",
"Epoch 14/500 | Train loss: 0.6353 | Train accuracy: 0.6535 | Val loss: 0.6034 | Val accuracy: 0.6834\n",
"Epoch 15/500 | Train loss: 0.6303 | Train accuracy: 0.6359 | Val loss: 0.6194 | Val accuracy: 0.6033\n",
"Epoch 16/500 | Train loss: 0.6369 | Train accuracy: 0.6739 | Val loss: 0.6436 | Val accuracy: 0.6138\n",
"Epoch 17/500 | Train loss: 0.6329 | Train accuracy: 0.6576 | Val loss: 0.6145 | Val accuracy: 0.7146\n",
"Epoch 18/500 | Train loss: 0.6216 | Train accuracy: 0.6753 | Val loss: 0.6100 | Val accuracy: 0.6642\n",
"Epoch 19/500 | Train loss: 0.6161 | Train accuracy: 0.6726 | Val loss: 0.6101 | Val accuracy: 0.6798\n",
"Epoch 20/500 | Train loss: 0.6200 | Train accuracy: 0.6766 | Val loss: 0.5888 | Val accuracy: 0.6886\n",
"Epoch 21/500 | Train loss: 0.6051 | Train accuracy: 0.6834 | Val loss: 0.5823 | Val accuracy: 0.6798\n",
"Epoch 22/500 | Train loss: 0.6327 | Train accuracy: 0.6726 | Val loss: 0.5983 | Val accuracy: 0.6782\n",
"Epoch 23/500 | Train loss: 0.6161 | Train accuracy: 0.6753 | Val loss: 0.6212 | Val accuracy: 0.6658\n",
"Epoch 24/500 | Train loss: 0.6274 | Train accuracy: 0.6793 | Val loss: 0.5879 | Val accuracy: 0.7146\n",
"Epoch 25/500 | Train loss: 0.6213 | Train accuracy: 0.6603 | Val loss: 0.5804 | Val accuracy: 0.6902\n",
"Epoch 26/500 | Train loss: 0.6004 | Train accuracy: 0.6766 | Val loss: 0.5650 | Val accuracy: 0.6886\n",
"Epoch 27/500 | Train loss: 0.5960 | Train accuracy: 0.6943 | Val loss: 0.5779 | Val accuracy: 0.7163\n",
"Epoch 28/500 | Train loss: 0.5793 | Train accuracy: 0.6916 | Val loss: 0.5643 | Val accuracy: 0.6694\n",
"Epoch 29/500 | Train loss: 0.6020 | Train accuracy: 0.6753 | Val loss: 0.6113 | Val accuracy: 0.6746\n",
"Epoch 30/500 | Train loss: 0.6031 | Train accuracy: 0.6793 | Val loss: 0.6184 | Val accuracy: 0.5981\n",
"Epoch 31/500 | Train loss: 0.6083 | Train accuracy: 0.7011 | Val loss: 0.5626 | Val accuracy: 0.6434\n",
"Epoch 32/500 | Train loss: 0.6193 | Train accuracy: 0.6658 | Val loss: 0.5688 | Val accuracy: 0.7303\n",
"Epoch 33/500 | Train loss: 0.6274 | Train accuracy: 0.6440 | Val loss: 0.6462 | Val accuracy: 0.6242\n",
"Epoch 34/500 | Train loss: 0.6025 | Train accuracy: 0.6916 | Val loss: 0.6320 | Val accuracy: 0.6086\n",
"Epoch 35/500 | Train loss: 0.5988 | Train accuracy: 0.7133 | Val loss: 0.5232 | Val accuracy: 0.6990\n",
"Epoch 36/500 | Train loss: 0.5902 | Train accuracy: 0.6875 | Val loss: 0.5518 | Val accuracy: 0.6938\n",
"Epoch 37/500 | Train loss: 0.5513 | Train accuracy: 0.7188 | Val loss: 0.5155 | Val accuracy: 0.7303\n",
"Epoch 38/500 | Train loss: 0.5813 | Train accuracy: 0.6970 | Val loss: 0.5274 | Val accuracy: 0.7478\n",
"Epoch 39/500 | Train loss: 0.5647 | Train accuracy: 0.7215 | Val loss: 0.5158 | Val accuracy: 0.7390\n",
"Epoch 40/500 | Train loss: 0.5659 | Train accuracy: 0.7228 | Val loss: 0.5361 | Val accuracy: 0.7878\n",
"Epoch 41/500 | Train loss: 0.5618 | Train accuracy: 0.7160 | Val loss: 0.5106 | Val accuracy: 0.7146\n",
"Epoch 42/500 | Train loss: 0.5547 | Train accuracy: 0.7215 | Val loss: 0.5122 | Val accuracy: 0.7514\n",
"Epoch 43/500 | Train loss: 0.5580 | Train accuracy: 0.7011 | Val loss: 0.4911 | Val accuracy: 0.8174\n",
"Epoch 44/500 | Train loss: 0.5810 | Train accuracy: 0.7242 | Val loss: 0.5403 | Val accuracy: 0.6886\n",
"Epoch 45/500 | Train loss: 0.5423 | Train accuracy: 0.7473 | Val loss: 0.4957 | Val accuracy: 0.7791\n",
"Epoch 46/500 | Train loss: 0.5400 | Train accuracy: 0.7554 | Val loss: 0.4993 | Val accuracy: 0.7686\n",
"Epoch 47/500 | Train loss: 0.5471 | Train accuracy: 0.7473 | Val loss: 0.4566 | Val accuracy: 0.7947\n",
"Epoch 48/500 | Train loss: 0.6304 | Train accuracy: 0.7024 | Val loss: 0.5330 | Val accuracy: 0.7042\n",
"Epoch 49/500 | Train loss: 0.5838 | Train accuracy: 0.7296 | Val loss: 0.5590 | Val accuracy: 0.7843\n",
"Epoch 50/500 | Train loss: 0.5514 | Train accuracy: 0.7283 | Val loss: 0.5452 | Val accuracy: 0.7582\n",
"Epoch 51/500 | Train loss: 0.5449 | Train accuracy: 0.7446 | Val loss: 0.4943 | Val accuracy: 0.7791\n",
"Epoch 52/500 | Train loss: 0.5445 | Train accuracy: 0.7405 | Val loss: 0.4971 | Val accuracy: 0.7755\n",
"Epoch 53/500 | Train loss: 0.5526 | Train accuracy: 0.7364 | Val loss: 0.5397 | Val accuracy: 0.7651\n",
"Epoch 54/500 | Train loss: 0.5475 | Train accuracy: 0.7459 | Val loss: 0.5296 | Val accuracy: 0.7755\n",
"Epoch 55/500 | Train loss: 0.5706 | Train accuracy: 0.7228 | Val loss: 0.5886 | Val accuracy: 0.7061\n",
"Epoch 56/500 | Train loss: 0.5838 | Train accuracy: 0.7283 | Val loss: 0.5605 | Val accuracy: 0.7374\n",
"Epoch 57/500 | Train loss: 0.5849 | Train accuracy: 0.7188 | Val loss: 0.4989 | Val accuracy: 0.7999\n",
"Epoch 58/500 | Train loss: 0.5178 | Train accuracy: 0.7432 | Val loss: 0.4796 | Val accuracy: 0.7843\n",
"Epoch 59/500 | Train loss: 0.5501 | Train accuracy: 0.7486 | Val loss: 0.4815 | Val accuracy: 0.7738\n",
"Epoch 60/500 | Train loss: 0.5827 | Train accuracy: 0.6562 | Val loss: 0.5786 | Val accuracy: 0.6573\n",
"Epoch 61/500 | Train loss: 0.5631 | Train accuracy: 0.7120 | Val loss: 0.4970 | Val accuracy: 0.7843\n",
"Epoch 62/500 | Train loss: 0.5180 | Train accuracy: 0.7486 | Val loss: 0.4705 | Val accuracy: 0.7999\n",
"Epoch 63/500 | Train loss: 0.5065 | Train accuracy: 0.7595 | Val loss: 0.4656 | Val accuracy: 0.7947\n",
"Epoch 64/500 | Train loss: 0.5086 | Train accuracy: 0.7595 | Val loss: 0.4513 | Val accuracy: 0.7999\n",
"Epoch 65/500 | Train loss: 0.4947 | Train accuracy: 0.7541 | Val loss: 0.4869 | Val accuracy: 0.7999\n",
"Epoch 66/500 | Train loss: 0.4721 | Train accuracy: 0.7908 | Val loss: 0.4494 | Val accuracy: 0.7947\n",
"Epoch 67/500 | Train loss: 0.4951 | Train accuracy: 0.7799 | Val loss: 0.4533 | Val accuracy: 0.8051\n",
"Epoch 68/500 | Train loss: 0.5299 | Train accuracy: 0.7649 | Val loss: 0.4794 | Val accuracy: 0.7982\n",
"Epoch 69/500 | Train loss: 0.4941 | Train accuracy: 0.7758 | Val loss: 0.4641 | Val accuracy: 0.7843\n",
"Epoch 70/500 | Train loss: 0.4900 | Train accuracy: 0.7772 | Val loss: 0.4579 | Val accuracy: 0.8087\n",
"Epoch 71/500 | Train loss: 0.4832 | Train accuracy: 0.7717 | Val loss: 0.4807 | Val accuracy: 0.7791\n",
"Epoch 72/500 | Train loss: 0.4981 | Train accuracy: 0.7731 | Val loss: 0.4740 | Val accuracy: 0.7738\n",
"Epoch 73/500 | Train loss: 0.4708 | Train accuracy: 0.7935 | Val loss: 0.4790 | Val accuracy: 0.8051\n",
"Epoch 74/500 | Train loss: 0.4912 | Train accuracy: 0.7812 | Val loss: 0.4802 | Val accuracy: 0.8051\n",
"Epoch 75/500 | Train loss: 0.4820 | Train accuracy: 0.7840 | Val loss: 0.5080 | Val accuracy: 0.7530\n",
"Epoch 76/500 | Train loss: 0.5129 | Train accuracy: 0.7731 | Val loss: 0.4787 | Val accuracy: 0.7947\n",
"Epoch 77/500 | Train loss: 0.4974 | Train accuracy: 0.7690 | Val loss: 0.4544 | Val accuracy: 0.7843\n",
"Epoch 78/500 | Train loss: 0.4780 | Train accuracy: 0.7772 | Val loss: 0.4648 | Val accuracy: 0.7999\n",
"Epoch 79/500 | Train loss: 0.5128 | Train accuracy: 0.7609 | Val loss: 0.5201 | Val accuracy: 0.7791\n",
"Epoch 80/500 | Train loss: 0.4981 | Train accuracy: 0.7568 | Val loss: 0.4521 | Val accuracy: 0.7947\n",
"Epoch 81/500 | Train loss: 0.5097 | Train accuracy: 0.7785 | Val loss: 0.5671 | Val accuracy: 0.7930\n",
"Epoch 82/500 | Train loss: 0.4789 | Train accuracy: 0.7880 | Val loss: 0.4879 | Val accuracy: 0.7911\n",
"Epoch 83/500 | Train loss: 0.5103 | Train accuracy: 0.7772 | Val loss: 0.5248 | Val accuracy: 0.7703\n",
"Epoch 84/500 | Train loss: 0.5186 | Train accuracy: 0.7745 | Val loss: 0.4949 | Val accuracy: 0.7791\n",
"Epoch 85/500 | Train loss: 0.4897 | Train accuracy: 0.7826 | Val loss: 0.4508 | Val accuracy: 0.7791\n",
"Epoch 86/500 | Train loss: 0.5008 | Train accuracy: 0.7772 | Val loss: 0.4518 | Val accuracy: 0.7878\n",
"Epoch 87/500 | Train loss: 0.4841 | Train accuracy: 0.7717 | Val loss: 0.4705 | Val accuracy: 0.7843\n",
"Epoch 88/500 | Train loss: 0.4581 | Train accuracy: 0.8016 | Val loss: 0.4372 | Val accuracy: 0.8155\n",
"Epoch 89/500 | Train loss: 0.4889 | Train accuracy: 0.7799 | Val loss: 0.5077 | Val accuracy: 0.7390\n",
"Epoch 90/500 | Train loss: 0.5240 | Train accuracy: 0.7717 | Val loss: 0.4778 | Val accuracy: 0.7738\n",
"Epoch 91/500 | Train loss: 0.4783 | Train accuracy: 0.7989 | Val loss: 0.4542 | Val accuracy: 0.7774\n",
"Epoch 92/500 | Train loss: 0.4667 | Train accuracy: 0.7880 | Val loss: 0.4474 | Val accuracy: 0.7826\n",
"Epoch 93/500 | Train loss: 0.4777 | Train accuracy: 0.7921 | Val loss: 0.4694 | Val accuracy: 0.7947\n",
"Epoch 94/500 | Train loss: 0.4507 | Train accuracy: 0.7880 | Val loss: 0.4554 | Val accuracy: 0.7791\n",
"Epoch 95/500 | Train loss: 0.4728 | Train accuracy: 0.7894 | Val loss: 0.4604 | Val accuracy: 0.7947\n",
"Epoch 96/500 | Train loss: 0.4639 | Train accuracy: 0.7962 | Val loss: 0.4695 | Val accuracy: 0.8120\n",
"Epoch 97/500 | Train loss: 0.4936 | Train accuracy: 0.7772 | Val loss: 0.4905 | Val accuracy: 0.7791\n",
"Epoch 98/500 | Train loss: 0.5037 | Train accuracy: 0.7636 | Val loss: 0.4980 | Val accuracy: 0.7843\n",
"Epoch 99/500 | Train loss: 0.4687 | Train accuracy: 0.8030 | Val loss: 0.4495 | Val accuracy: 0.7791\n",
"Epoch 100/500 | Train loss: 0.4580 | Train accuracy: 0.7880 | Val loss: 0.4742 | Val accuracy: 0.7911\n",
"Epoch 101/500 | Train loss: 0.5175 | Train accuracy: 0.7649 | Val loss: 0.4823 | Val accuracy: 0.7651\n",
"Epoch 102/500 | Train loss: 0.5914 | Train accuracy: 0.7772 | Val loss: 0.5935 | Val accuracy: 0.7303\n",
"Epoch 103/500 | Train loss: 0.5090 | Train accuracy: 0.7853 | Val loss: 0.4693 | Val accuracy: 0.7791\n",
"Epoch 104/500 | Train loss: 0.4906 | Train accuracy: 0.7962 | Val loss: 0.4577 | Val accuracy: 0.7651\n",
"Epoch 105/500 | Train loss: 0.4829 | Train accuracy: 0.7989 | Val loss: 0.4619 | Val accuracy: 0.7843\n",
"Epoch 106/500 | Train loss: 0.4805 | Train accuracy: 0.7867 | Val loss: 0.4520 | Val accuracy: 0.7651\n",
"Epoch 107/500 | Train loss: 0.5011 | Train accuracy: 0.7785 | Val loss: 0.4903 | Val accuracy: 0.7703\n",
"Epoch 108/500 | Train loss: 0.4723 | Train accuracy: 0.7731 | Val loss: 0.4575 | Val accuracy: 0.7755\n",
"Epoch 109/500 | Train loss: 0.4838 | Train accuracy: 0.7663 | Val loss: 0.4895 | Val accuracy: 0.7495\n",
"Epoch 110/500 | Train loss: 0.4679 | Train accuracy: 0.7989 | Val loss: 0.5073 | Val accuracy: 0.7755\n",
"Epoch 111/500 | Train loss: 0.4879 | Train accuracy: 0.7717 | Val loss: 0.4663 | Val accuracy: 0.7947\n",
"Epoch 112/500 | Train loss: 0.4881 | Train accuracy: 0.7853 | Val loss: 0.5333 | Val accuracy: 0.7755\n",
"Epoch 113/500 | Train loss: 0.4783 | Train accuracy: 0.7880 | Val loss: 0.4400 | Val accuracy: 0.7982\n",
"Epoch 114/500 | Train loss: 0.4860 | Train accuracy: 0.7853 | Val loss: 0.4811 | Val accuracy: 0.7963\n",
"Epoch 115/500 | Train loss: 0.4703 | Train accuracy: 0.7853 | Val loss: 0.4713 | Val accuracy: 0.7999\n",
"Epoch 116/500 | Train loss: 0.4907 | Train accuracy: 0.7867 | Val loss: 0.4593 | Val accuracy: 0.7791\n",
"Epoch 117/500 | Train loss: 0.4821 | Train accuracy: 0.7758 | Val loss: 0.5429 | Val accuracy: 0.7286\n",
"Epoch 118/500 | Train loss: 0.4994 | Train accuracy: 0.7677 | Val loss: 0.5996 | Val accuracy: 0.7547\n",
"Epoch 119/500 | Train loss: 0.6503 | Train accuracy: 0.7717 | Val loss: 0.5160 | Val accuracy: 0.7511\n",
"Epoch 120/500 | Train loss: 0.5065 | Train accuracy: 0.7704 | Val loss: 0.4650 | Val accuracy: 0.8051\n",
"Epoch 121/500 | Train loss: 0.4958 | Train accuracy: 0.7690 | Val loss: 0.4893 | Val accuracy: 0.7651\n",
"Epoch 122/500 | Train loss: 0.4978 | Train accuracy: 0.7840 | Val loss: 0.4940 | Val accuracy: 0.7999\n",
"Epoch 123/500 | Train loss: 0.4749 | Train accuracy: 0.7935 | Val loss: 0.4968 | Val accuracy: 0.7547\n",
"Epoch 124/500 | Train loss: 0.4756 | Train accuracy: 0.7785 | Val loss: 0.4441 | Val accuracy: 0.7843\n",
"Epoch 125/500 | Train loss: 0.4739 | Train accuracy: 0.7853 | Val loss: 0.4466 | Val accuracy: 0.7791\n",
"Epoch 126/500 | Train loss: 0.4756 | Train accuracy: 0.7840 | Val loss: 0.4792 | Val accuracy: 0.7807\n",
"Epoch 127/500 | Train loss: 0.4677 | Train accuracy: 0.7989 | Val loss: 0.4845 | Val accuracy: 0.7738\n",
"Epoch 128/500 | Train loss: 0.4929 | Train accuracy: 0.7880 | Val loss: 0.4758 | Val accuracy: 0.7547\n",
"Epoch 129/500 | Train loss: 0.4842 | Train accuracy: 0.7758 | Val loss: 0.4395 | Val accuracy: 0.7895\n",
"Epoch 130/500 | Train loss: 0.4599 | Train accuracy: 0.8003 | Val loss: 0.4635 | Val accuracy: 0.7859\n",
"Epoch 131/500 | Train loss: 0.5378 | Train accuracy: 0.7541 | Val loss: 0.4808 | Val accuracy: 0.7823\n",
"Epoch 132/500 | Train loss: 0.4942 | Train accuracy: 0.7432 | Val loss: 0.4777 | Val accuracy: 0.7963\n",
"Epoch 133/500 | Train loss: 0.4695 | Train accuracy: 0.7921 | Val loss: 0.4917 | Val accuracy: 0.7755\n",
"Epoch 134/500 | Train loss: 0.4620 | Train accuracy: 0.8111 | Val loss: 0.5460 | Val accuracy: 0.7686\n",
"Epoch 135/500 | Train loss: 0.4706 | Train accuracy: 0.7989 | Val loss: 0.5088 | Val accuracy: 0.7599\n",
"Epoch 136/500 | Train loss: 0.5122 | Train accuracy: 0.7772 | Val loss: 0.4891 | Val accuracy: 0.7876\n",
"Epoch 137/500 | Train loss: 0.4903 | Train accuracy: 0.7758 | Val loss: 0.4459 | Val accuracy: 0.7843\n",
"Epoch 138/500 | Train loss: 0.4712 | Train accuracy: 0.7785 | Val loss: 0.4570 | Val accuracy: 0.7651\n",
"Epoch 139/500 | Train loss: 0.4865 | Train accuracy: 0.7758 | Val loss: 0.4513 | Val accuracy: 0.7791\n",
"Epoch 140/500 | Train loss: 0.4669 | Train accuracy: 0.7894 | Val loss: 0.4559 | Val accuracy: 0.7755\n",
"Epoch 141/500 | Train loss: 0.4784 | Train accuracy: 0.7663 | Val loss: 0.4577 | Val accuracy: 0.7755\n",
"Epoch 142/500 | Train loss: 0.4913 | Train accuracy: 0.7812 | Val loss: 0.4337 | Val accuracy: 0.7999\n",
"Epoch 143/500 | Train loss: 0.5020 | Train accuracy: 0.7799 | Val loss: 0.4599 | Val accuracy: 0.7651\n",
"Epoch 144/500 | Train loss: 0.4619 | Train accuracy: 0.7921 | Val loss: 0.4250 | Val accuracy: 0.7947\n",
"Epoch 145/500 | Train loss: 0.4580 | Train accuracy: 0.7908 | Val loss: 0.4624 | Val accuracy: 0.8067\n",
"Epoch 146/500 | Train loss: 0.4695 | Train accuracy: 0.7853 | Val loss: 0.4546 | Val accuracy: 0.7859\n",
"Epoch 147/500 | Train loss: 0.4601 | Train accuracy: 0.7989 | Val loss: 0.4468 | Val accuracy: 0.7895\n",
"Epoch 148/500 | Train loss: 0.4500 | Train accuracy: 0.8030 | Val loss: 0.4661 | Val accuracy: 0.7895\n",
"Epoch 149/500 | Train loss: 0.4624 | Train accuracy: 0.7745 | Val loss: 0.4713 | Val accuracy: 0.8051\n",
"Epoch 150/500 | Train loss: 0.4684 | Train accuracy: 0.7935 | Val loss: 0.4687 | Val accuracy: 0.7686\n",
"Epoch 151/500 | Train loss: 0.4503 | Train accuracy: 0.8043 | Val loss: 0.4490 | Val accuracy: 0.7791\n",
"Epoch 152/500 | Train loss: 0.4527 | Train accuracy: 0.8003 | Val loss: 0.4982 | Val accuracy: 0.7755\n",
"Epoch 153/500 | Train loss: 0.4696 | Train accuracy: 0.7880 | Val loss: 0.4713 | Val accuracy: 0.7703\n",
"Epoch 154/500 | Train loss: 0.4827 | Train accuracy: 0.7894 | Val loss: 0.4799 | Val accuracy: 0.7755\n",
"Epoch 155/500 | Train loss: 0.4640 | Train accuracy: 0.7880 | Val loss: 0.4679 | Val accuracy: 0.7859\n",
"Epoch 156/500 | Train loss: 0.4496 | Train accuracy: 0.8111 | Val loss: 0.4743 | Val accuracy: 0.7755\n",
"Epoch 157/500 | Train loss: 0.4781 | Train accuracy: 0.7921 | Val loss: 0.4866 | Val accuracy: 0.7771\n",
"Epoch 158/500 | Train loss: 0.4532 | Train accuracy: 0.7812 | Val loss: 0.4986 | Val accuracy: 0.7843\n",
"Epoch 159/500 | Train loss: 0.4276 | Train accuracy: 0.8030 | Val loss: 0.4644 | Val accuracy: 0.7911\n",
"Epoch 160/500 | Train loss: 0.4838 | Train accuracy: 0.7867 | Val loss: 0.4667 | Val accuracy: 0.7911\n",
"Epoch 161/500 | Train loss: 0.4898 | Train accuracy: 0.7908 | Val loss: 0.5006 | Val accuracy: 0.7651\n",
"Epoch 162/500 | Train loss: 0.4793 | Train accuracy: 0.7935 | Val loss: 0.4941 | Val accuracy: 0.7703\n",
"Epoch 163/500 | Train loss: 0.4780 | Train accuracy: 0.7989 | Val loss: 0.5040 | Val accuracy: 0.7651\n",
"Epoch 164/500 | Train loss: 0.4522 | Train accuracy: 0.8016 | Val loss: 0.4584 | Val accuracy: 0.7703\n",
"Epoch 165/500 | Train loss: 0.4865 | Train accuracy: 0.7785 | Val loss: 0.4623 | Val accuracy: 0.7615\n",
"Epoch 166/500 | Train loss: 0.4769 | Train accuracy: 0.7976 | Val loss: 0.4507 | Val accuracy: 0.7771\n",
"Epoch 167/500 | Train loss: 0.4409 | Train accuracy: 0.8084 | Val loss: 0.4749 | Val accuracy: 0.7703\n",
"Epoch 168/500 | Train loss: 0.4599 | Train accuracy: 0.7962 | Val loss: 0.5127 | Val accuracy: 0.7651\n",
"Epoch 169/500 | Train loss: 0.4698 | Train accuracy: 0.7921 | Val loss: 0.4431 | Val accuracy: 0.7755\n",
"Epoch 170/500 | Train loss: 0.4575 | Train accuracy: 0.7948 | Val loss: 0.4686 | Val accuracy: 0.7895\n",
"Epoch 171/500 | Train loss: 0.4734 | Train accuracy: 0.7867 | Val loss: 0.4557 | Val accuracy: 0.7843\n",
"Epoch 172/500 | Train loss: 0.4687 | Train accuracy: 0.7908 | Val loss: 0.4413 | Val accuracy: 0.7826\n",
"Epoch 173/500 | Train loss: 0.4629 | Train accuracy: 0.7799 | Val loss: 0.4885 | Val accuracy: 0.7791\n",
"Epoch 174/500 | Train loss: 0.4762 | Train accuracy: 0.8003 | Val loss: 0.4521 | Val accuracy: 0.7791\n",
"Epoch 175/500 | Train loss: 0.4621 | Train accuracy: 0.7935 | Val loss: 0.4696 | Val accuracy: 0.7807\n",
"Epoch 176/500 | Train loss: 0.4364 | Train accuracy: 0.8315 | Val loss: 0.4892 | Val accuracy: 0.7738\n",
"Epoch 177/500 | Train loss: 0.4900 | Train accuracy: 0.7962 | Val loss: 0.4659 | Val accuracy: 0.7530\n",
"Epoch 178/500 | Train loss: 0.4768 | Train accuracy: 0.7935 | Val loss: 0.4855 | Val accuracy: 0.7634\n",
"Epoch 179/500 | Train loss: 0.4616 | Train accuracy: 0.7962 | Val loss: 0.4786 | Val accuracy: 0.7686\n",
"Epoch 180/500 | Train loss: 0.4529 | Train accuracy: 0.7880 | Val loss: 0.4955 | Val accuracy: 0.7738\n",
"Epoch 181/500 | Train loss: 0.4732 | Train accuracy: 0.8098 | Val loss: 0.5164 | Val accuracy: 0.7738\n",
"Epoch 182/500 | Train loss: 0.4847 | Train accuracy: 0.7921 | Val loss: 0.4744 | Val accuracy: 0.7738\n",
"Epoch 183/500 | Train loss: 0.4462 | Train accuracy: 0.7921 | Val loss: 0.4432 | Val accuracy: 0.7738\n",
"Epoch 184/500 | Train loss: 0.4626 | Train accuracy: 0.8043 | Val loss: 0.4659 | Val accuracy: 0.7843\n",
"Epoch 185/500 | Train loss: 0.4789 | Train accuracy: 0.7976 | Val loss: 0.4928 | Val accuracy: 0.7651\n",
"Epoch 186/500 | Train loss: 0.4719 | Train accuracy: 0.7853 | Val loss: 0.4542 | Val accuracy: 0.7843\n",
"Epoch 187/500 | Train loss: 0.4488 | Train accuracy: 0.7935 | Val loss: 0.4888 | Val accuracy: 0.7791\n",
"Epoch 188/500 | Train loss: 0.4445 | Train accuracy: 0.8057 | Val loss: 0.4623 | Val accuracy: 0.7651\n",
"Epoch 189/500 | Train loss: 0.4676 | Train accuracy: 0.7880 | Val loss: 0.5435 | Val accuracy: 0.7651\n",
"Epoch 190/500 | Train loss: 0.4403 | Train accuracy: 0.8071 | Val loss: 0.5423 | Val accuracy: 0.7703\n",
"Epoch 191/500 | Train loss: 0.4469 | Train accuracy: 0.7812 | Val loss: 0.4362 | Val accuracy: 0.7791\n",
"Epoch 192/500 | Train loss: 0.4598 | Train accuracy: 0.8057 | Val loss: 0.5153 | Val accuracy: 0.7843\n",
"Epoch 193/500 | Train loss: 0.5071 | Train accuracy: 0.7840 | Val loss: 0.4662 | Val accuracy: 0.7807\n",
"Epoch 194/500 | Train loss: 0.4805 | Train accuracy: 0.7826 | Val loss: 0.4629 | Val accuracy: 0.7911\n",
"Epoch 195/500 | Train loss: 0.4935 | Train accuracy: 0.7731 | Val loss: 0.4281 | Val accuracy: 0.7738\n",
"Epoch 196/500 | Train loss: 0.4381 | Train accuracy: 0.8016 | Val loss: 0.4408 | Val accuracy: 0.7999\n",
"Epoch 197/500 | Train loss: 0.4912 | Train accuracy: 0.7622 | Val loss: 0.4509 | Val accuracy: 0.7686\n",
"Epoch 198/500 | Train loss: 0.4611 | Train accuracy: 0.7948 | Val loss: 0.4689 | Val accuracy: 0.7738\n",
"Epoch 199/500 | Train loss: 0.4429 | Train accuracy: 0.8152 | Val loss: 0.4324 | Val accuracy: 0.7982\n",
"Epoch 200/500 | Train loss: 0.4568 | Train accuracy: 0.7867 | Val loss: 0.4618 | Val accuracy: 0.7599\n",
"Epoch 201/500 | Train loss: 0.4627 | Train accuracy: 0.7853 | Val loss: 0.5148 | Val accuracy: 0.7599\n",
"Epoch 202/500 | Train loss: 0.4532 | Train accuracy: 0.7880 | Val loss: 0.4484 | Val accuracy: 0.7843\n",
"Epoch 203/500 | Train loss: 0.4649 | Train accuracy: 0.7976 | Val loss: 0.4737 | Val accuracy: 0.7738\n",
"Epoch 204/500 | Train loss: 0.4626 | Train accuracy: 0.8003 | Val loss: 0.4788 | Val accuracy: 0.7686\n",
"Epoch 205/500 | Train loss: 0.4575 | Train accuracy: 0.8084 | Val loss: 0.4627 | Val accuracy: 0.7686\n",
"Epoch 206/500 | Train loss: 0.4433 | Train accuracy: 0.8003 | Val loss: 0.4782 | Val accuracy: 0.7738\n",
"Epoch 207/500 | Train loss: 0.4753 | Train accuracy: 0.7867 | Val loss: 0.5141 | Val accuracy: 0.7791\n",
"Epoch 208/500 | Train loss: 0.4806 | Train accuracy: 0.7921 | Val loss: 0.5379 | Val accuracy: 0.7599\n",
"Epoch 209/500 | Train loss: 0.4376 | Train accuracy: 0.8003 | Val loss: 0.4614 | Val accuracy: 0.7738\n",
"Epoch 210/500 | Train loss: 0.4636 | Train accuracy: 0.7962 | Val loss: 0.5077 | Val accuracy: 0.7599\n",
"Epoch 211/500 | Train loss: 0.4341 | Train accuracy: 0.8098 | Val loss: 0.5305 | Val accuracy: 0.7599\n",
"Epoch 212/500 | Train loss: 0.4426 | Train accuracy: 0.8139 | Val loss: 0.5305 | Val accuracy: 0.7599\n",
"Epoch 213/500 | Train loss: 0.4712 | Train accuracy: 0.7976 | Val loss: 0.5412 | Val accuracy: 0.7703\n",
"Epoch 214/500 | Train loss: 0.4397 | Train accuracy: 0.7935 | Val loss: 0.4718 | Val accuracy: 0.7895\n",
"Epoch 215/500 | Train loss: 0.4590 | Train accuracy: 0.7948 | Val loss: 0.5227 | Val accuracy: 0.7738\n",
"Epoch 216/500 | Train loss: 0.4624 | Train accuracy: 0.7989 | Val loss: 0.5093 | Val accuracy: 0.7651\n",
"Epoch 217/500 | Train loss: 0.4484 | Train accuracy: 0.7948 | Val loss: 0.4897 | Val accuracy: 0.7807\n",
"Epoch 218/500 | Train loss: 0.4397 | Train accuracy: 0.8152 | Val loss: 0.4789 | Val accuracy: 0.7895\n",
"Epoch 219/500 | Train loss: 0.4472 | Train accuracy: 0.8030 | Val loss: 0.4545 | Val accuracy: 0.7843\n",
"Epoch 220/500 | Train loss: 0.4356 | Train accuracy: 0.8057 | Val loss: 0.5626 | Val accuracy: 0.7547\n",
"Epoch 221/500 | Train loss: 0.4161 | Train accuracy: 0.8139 | Val loss: 0.5636 | Val accuracy: 0.8067\n",
"Epoch 222/500 | Train loss: 0.4577 | Train accuracy: 0.7867 | Val loss: 0.5774 | Val accuracy: 0.7703\n",
"Epoch 223/500 | Train loss: 0.4432 | Train accuracy: 0.7989 | Val loss: 0.5334 | Val accuracy: 0.7755\n",
"Epoch 224/500 | Train loss: 0.4643 | Train accuracy: 0.8003 | Val loss: 0.4456 | Val accuracy: 0.7791\n",
"Epoch 225/500 | Train loss: 0.4423 | Train accuracy: 0.8043 | Val loss: 0.5046 | Val accuracy: 0.7807\n",
"Epoch 226/500 | Train loss: 0.4413 | Train accuracy: 0.8207 | Val loss: 0.4829 | Val accuracy: 0.7843\n",
"Epoch 227/500 | Train loss: 0.4413 | Train accuracy: 0.7867 | Val loss: 0.4708 | Val accuracy: 0.7791\n",
"Epoch 228/500 | Train loss: 0.4266 | Train accuracy: 0.8084 | Val loss: 0.5199 | Val accuracy: 0.7755\n",
"Epoch 229/500 | Train loss: 0.5713 | Train accuracy: 0.7894 | Val loss: 0.4779 | Val accuracy: 0.7719\n",
"Epoch 230/500 | Train loss: 0.4699 | Train accuracy: 0.8071 | Val loss: 0.4883 | Val accuracy: 0.7547\n",
"Epoch 231/500 | Train loss: 0.4548 | Train accuracy: 0.7908 | Val loss: 0.4647 | Val accuracy: 0.7823\n",
"Epoch 232/500 | Train loss: 0.5625 | Train accuracy: 0.7405 | Val loss: 0.4837 | Val accuracy: 0.7911\n",
"Epoch 233/500 | Train loss: 0.4754 | Train accuracy: 0.7948 | Val loss: 0.5012 | Val accuracy: 0.7703\n",
"Epoch 234/500 | Train loss: 0.4534 | Train accuracy: 0.7989 | Val loss: 0.5433 | Val accuracy: 0.7547\n",
"Epoch 235/500 | Train loss: 0.4602 | Train accuracy: 0.8016 | Val loss: 0.5496 | Val accuracy: 0.7738\n",
"Epoch 236/500 | Train loss: 0.4829 | Train accuracy: 0.8111 | Val loss: 0.5353 | Val accuracy: 0.7667\n",
"Epoch 237/500 | Train loss: 0.4577 | Train accuracy: 0.7894 | Val loss: 0.4936 | Val accuracy: 0.7755\n",
"Epoch 238/500 | Train loss: 0.4573 | Train accuracy: 0.8003 | Val loss: 0.4671 | Val accuracy: 0.7719\n",
"Epoch 239/500 | Train loss: 0.4934 | Train accuracy: 0.8043 | Val loss: 0.5439 | Val accuracy: 0.7651\n",
"Epoch 240/500 | Train loss: 0.4905 | Train accuracy: 0.7962 | Val loss: 0.4561 | Val accuracy: 0.7667\n",
"Epoch 241/500 | Train loss: 0.4819 | Train accuracy: 0.7989 | Val loss: 0.5302 | Val accuracy: 0.7876\n",
"Epoch 242/500 | Train loss: 0.4772 | Train accuracy: 0.7989 | Val loss: 0.4810 | Val accuracy: 0.7859\n",
"Epoch 243/500 | Train loss: 0.4719 | Train accuracy: 0.7962 | Val loss: 0.5264 | Val accuracy: 0.7495\n",
"Epoch 244/500 | Train loss: 0.4674 | Train accuracy: 0.8043 | Val loss: 0.4850 | Val accuracy: 0.7651\n",
"Epoch 245/500 | Train loss: 0.4666 | Train accuracy: 0.7962 | Val loss: 0.5136 | Val accuracy: 0.7495\n",
"Epoch 246/500 | Train loss: 0.4899 | Train accuracy: 0.8057 | Val loss: 0.5345 | Val accuracy: 0.7651\n",
"Epoch 247/500 | Train loss: 0.4676 | Train accuracy: 0.7908 | Val loss: 0.4787 | Val accuracy: 0.7807\n",
"Epoch 248/500 | Train loss: 0.4676 | Train accuracy: 0.7921 | Val loss: 0.4870 | Val accuracy: 0.7719\n",
"Epoch 249/500 | Train loss: 0.4403 | Train accuracy: 0.8098 | Val loss: 0.5123 | Val accuracy: 0.7703\n",
"Epoch 250/500 | Train loss: 0.4524 | Train accuracy: 0.8016 | Val loss: 0.5262 | Val accuracy: 0.7615\n",
"Epoch 251/500 | Train loss: 0.4491 | Train accuracy: 0.8098 | Val loss: 0.5101 | Val accuracy: 0.7755\n",
"Epoch 252/500 | Train loss: 0.4625 | Train accuracy: 0.8043 | Val loss: 0.4836 | Val accuracy: 0.7703\n",
"Epoch 253/500 | Train loss: 0.4517 | Train accuracy: 0.8071 | Val loss: 0.5112 | Val accuracy: 0.7791\n",
"Epoch 254/500 | Train loss: 0.4437 | Train accuracy: 0.8030 | Val loss: 0.4861 | Val accuracy: 0.7895\n",
"Epoch 255/500 | Train loss: 0.4504 | Train accuracy: 0.8166 | Val loss: 0.4823 | Val accuracy: 0.7878\n",
"Epoch 256/500 | Train loss: 0.4713 | Train accuracy: 0.7989 | Val loss: 0.4854 | Val accuracy: 0.7843\n",
"Epoch 257/500 | Train loss: 0.4396 | Train accuracy: 0.8152 | Val loss: 0.4597 | Val accuracy: 0.7947\n",
"Epoch 258/500 | Train loss: 0.4597 | Train accuracy: 0.8003 | Val loss: 0.4743 | Val accuracy: 0.7755\n",
"Epoch 259/500 | Train loss: 0.4395 | Train accuracy: 0.7880 | Val loss: 0.4673 | Val accuracy: 0.7703\n",
"Epoch 260/500 | Train loss: 0.4558 | Train accuracy: 0.8057 | Val loss: 0.4697 | Val accuracy: 0.7459\n",
"Epoch 261/500 | Train loss: 0.4351 | Train accuracy: 0.8084 | Val loss: 0.4682 | Val accuracy: 0.7703\n",
"Epoch 262/500 | Train loss: 0.4306 | Train accuracy: 0.8152 | Val loss: 0.4911 | Val accuracy: 0.7511\n",
"Epoch 263/500 | Train loss: 0.4274 | Train accuracy: 0.8179 | Val loss: 0.4718 | Val accuracy: 0.7738\n",
"Epoch 264/500 | Train loss: 0.4461 | Train accuracy: 0.8193 | Val loss: 0.4816 | Val accuracy: 0.7634\n",
"Epoch 265/500 | Train loss: 0.4289 | Train accuracy: 0.8098 | Val loss: 0.4929 | Val accuracy: 0.7686\n",
"Epoch 266/500 | Train loss: 0.4447 | Train accuracy: 0.8152 | Val loss: 0.4869 | Val accuracy: 0.7807\n",
"Epoch 267/500 | Train loss: 0.4300 | Train accuracy: 0.8220 | Val loss: 0.4734 | Val accuracy: 0.7478\n",
"Epoch 268/500 | Train loss: 0.4657 | Train accuracy: 0.8098 | Val loss: 0.5274 | Val accuracy: 0.7791\n",
"Epoch 269/500 | Train loss: 0.5033 | Train accuracy: 0.7649 | Val loss: 0.5099 | Val accuracy: 0.7511\n",
"Epoch 270/500 | Train loss: 0.5286 | Train accuracy: 0.7500 | Val loss: 0.4703 | Val accuracy: 0.7911\n",
"Epoch 271/500 | Train loss: 0.4817 | Train accuracy: 0.7880 | Val loss: 0.4844 | Val accuracy: 0.7599\n",
"Epoch 272/500 | Train loss: 0.5414 | Train accuracy: 0.7378 | Val loss: 0.4879 | Val accuracy: 0.7599\n",
"Epoch 273/500 | Train loss: 0.4901 | Train accuracy: 0.7745 | Val loss: 0.5402 | Val accuracy: 0.7390\n",
"Epoch 274/500 | Train loss: 0.5176 | Train accuracy: 0.7704 | Val loss: 0.4778 | Val accuracy: 0.8051\n",
"Epoch 275/500 | Train loss: 0.4696 | Train accuracy: 0.7799 | Val loss: 0.4699 | Val accuracy: 0.7843\n",
"Epoch 276/500 | Train loss: 0.4664 | Train accuracy: 0.7948 | Val loss: 0.4439 | Val accuracy: 0.7791\n",
"Epoch 277/500 | Train loss: 0.4652 | Train accuracy: 0.7948 | Val loss: 0.4952 | Val accuracy: 0.7771\n",
"Epoch 278/500 | Train loss: 0.4585 | Train accuracy: 0.8057 | Val loss: 0.4845 | Val accuracy: 0.7791\n",
"Epoch 279/500 | Train loss: 0.4894 | Train accuracy: 0.7948 | Val loss: 0.4717 | Val accuracy: 0.7843\n",
"Epoch 280/500 | Train loss: 0.4623 | Train accuracy: 0.7908 | Val loss: 0.4899 | Val accuracy: 0.7651\n",
"Epoch 281/500 | Train loss: 0.4525 | Train accuracy: 0.8084 | Val loss: 0.4584 | Val accuracy: 0.7895\n",
"Epoch 282/500 | Train loss: 0.4504 | Train accuracy: 0.8016 | Val loss: 0.4863 | Val accuracy: 0.7843\n",
"Epoch 283/500 | Train loss: 0.4709 | Train accuracy: 0.8030 | Val loss: 0.5087 | Val accuracy: 0.7878\n",
"Epoch 284/500 | Train loss: 0.4445 | Train accuracy: 0.8071 | Val loss: 0.5332 | Val accuracy: 0.7791\n",
"Epoch 285/500 | Train loss: 0.4391 | Train accuracy: 0.8152 | Val loss: 0.4707 | Val accuracy: 0.7738\n",
"Epoch 286/500 | Train loss: 0.4672 | Train accuracy: 0.8152 | Val loss: 0.5536 | Val accuracy: 0.7703\n",
"Epoch 287/500 | Train loss: 0.4377 | Train accuracy: 0.8016 | Val loss: 0.5672 | Val accuracy: 0.7807\n",
"Epoch 288/500 | Train loss: 0.4043 | Train accuracy: 0.8274 | Val loss: 0.5523 | Val accuracy: 0.7771\n",
"Epoch 289/500 | Train loss: 0.4422 | Train accuracy: 0.8125 | Val loss: 0.5867 | Val accuracy: 0.7807\n",
"Epoch 290/500 | Train loss: 0.4317 | Train accuracy: 0.7935 | Val loss: 0.6116 | Val accuracy: 0.7651\n",
"Epoch 291/500 | Train loss: 0.4891 | Train accuracy: 0.7880 | Val loss: 0.5406 | Val accuracy: 0.7530\n",
"Epoch 292/500 | Train loss: 0.4989 | Train accuracy: 0.7731 | Val loss: 0.5739 | Val accuracy: 0.7495\n",
"Epoch 293/500 | Train loss: 0.4760 | Train accuracy: 0.7745 | Val loss: 0.5763 | Val accuracy: 0.7547\n",
"Epoch 294/500 | Train loss: 0.4674 | Train accuracy: 0.7935 | Val loss: 0.5521 | Val accuracy: 0.7651\n",
"Epoch 295/500 | Train loss: 0.4642 | Train accuracy: 0.7840 | Val loss: 0.4707 | Val accuracy: 0.8067\n",
"Epoch 296/500 | Train loss: 0.4621 | Train accuracy: 0.7962 | Val loss: 0.4720 | Val accuracy: 0.7911\n",
"Epoch 297/500 | Train loss: 0.4336 | Train accuracy: 0.8003 | Val loss: 0.5016 | Val accuracy: 0.7703\n",
"Epoch 298/500 | Train loss: 0.4302 | Train accuracy: 0.8166 | Val loss: 0.4770 | Val accuracy: 0.7963\n",
"Epoch 299/500 | Train loss: 0.4311 | Train accuracy: 0.8179 | Val loss: 0.4865 | Val accuracy: 0.7615\n",
"Epoch 300/500 | Train loss: 0.4651 | Train accuracy: 0.7840 | Val loss: 0.4831 | Val accuracy: 0.7755\n",
"Epoch 301/500 | Train loss: 0.4224 | Train accuracy: 0.8057 | Val loss: 0.5670 | Val accuracy: 0.7703\n",
"Epoch 302/500 | Train loss: 0.4536 | Train accuracy: 0.7921 | Val loss: 0.6604 | Val accuracy: 0.7599\n",
"Epoch 303/500 | Train loss: 0.4647 | Train accuracy: 0.8003 | Val loss: 0.6264 | Val accuracy: 0.7686\n",
"Epoch 304/500 | Train loss: 0.4303 | Train accuracy: 0.8193 | Val loss: 0.5666 | Val accuracy: 0.7703\n",
"Epoch 305/500 | Train loss: 0.4187 | Train accuracy: 0.8098 | Val loss: 0.5162 | Val accuracy: 0.7755\n",
"Epoch 306/500 | Train loss: 0.4387 | Train accuracy: 0.8030 | Val loss: 0.5493 | Val accuracy: 0.7755\n",
"Epoch 307/500 | Train loss: 0.4332 | Train accuracy: 0.7989 | Val loss: 0.5878 | Val accuracy: 0.7703\n",
"Epoch 308/500 | Train loss: 0.4229 | Train accuracy: 0.8166 | Val loss: 0.6281 | Val accuracy: 0.7807\n",
"Epoch 309/500 | Train loss: 0.4580 | Train accuracy: 0.7948 | Val loss: 0.5669 | Val accuracy: 0.7634\n",
"Epoch 310/500 | Train loss: 0.4322 | Train accuracy: 0.8084 | Val loss: 0.5773 | Val accuracy: 0.7651\n",
"Epoch 311/500 | Train loss: 0.4163 | Train accuracy: 0.8098 | Val loss: 0.5888 | Val accuracy: 0.7755\n",
"Epoch 312/500 | Train loss: 0.4485 | Train accuracy: 0.8152 | Val loss: 0.5355 | Val accuracy: 0.7615\n",
"Epoch 313/500 | Train loss: 0.4274 | Train accuracy: 0.8207 | Val loss: 0.5568 | Val accuracy: 0.7755\n",
"Epoch 314/500 | Train loss: 0.4079 | Train accuracy: 0.8234 | Val loss: 0.5580 | Val accuracy: 0.7755\n",
"Epoch 315/500 | Train loss: 0.4303 | Train accuracy: 0.8139 | Val loss: 0.5671 | Val accuracy: 0.7667\n",
"Epoch 316/500 | Train loss: 0.4132 | Train accuracy: 0.8220 | Val loss: 0.5714 | Val accuracy: 0.7599\n",
"Epoch 317/500 | Train loss: 0.4651 | Train accuracy: 0.7867 | Val loss: 0.5289 | Val accuracy: 0.7755\n",
"Epoch 318/500 | Train loss: 0.4209 | Train accuracy: 0.8315 | Val loss: 0.5414 | Val accuracy: 0.7651\n",
"Epoch 319/500 | Train loss: 0.4503 | Train accuracy: 0.8125 | Val loss: 0.5171 | Val accuracy: 0.7755\n",
"Epoch 320/500 | Train loss: 0.4139 | Train accuracy: 0.8261 | Val loss: 0.5496 | Val accuracy: 0.7563\n",
"Epoch 321/500 | Train loss: 0.4569 | Train accuracy: 0.8139 | Val loss: 0.5281 | Val accuracy: 0.7843\n",
"Epoch 322/500 | Train loss: 0.4157 | Train accuracy: 0.8057 | Val loss: 0.6034 | Val accuracy: 0.7755\n",
"Epoch 323/500 | Train loss: 0.4616 | Train accuracy: 0.7976 | Val loss: 0.4984 | Val accuracy: 0.7807\n",
"Epoch 324/500 | Train loss: 0.4575 | Train accuracy: 0.8043 | Val loss: 0.4985 | Val accuracy: 0.7843\n",
"Epoch 325/500 | Train loss: 0.4629 | Train accuracy: 0.7826 | Val loss: 0.5160 | Val accuracy: 0.8015\n",
"Epoch 326/500 | Train loss: 0.4522 | Train accuracy: 0.8139 | Val loss: 0.5208 | Val accuracy: 0.7807\n",
"Epoch 327/500 | Train loss: 0.4594 | Train accuracy: 0.8071 | Val loss: 0.4831 | Val accuracy: 0.7807\n",
"Epoch 328/500 | Train loss: 0.4450 | Train accuracy: 0.8030 | Val loss: 0.4794 | Val accuracy: 0.7495\n",
"Epoch 329/500 | Train loss: 0.4134 | Train accuracy: 0.8220 | Val loss: 0.4877 | Val accuracy: 0.7755\n",
"Epoch 330/500 | Train loss: 0.4410 | Train accuracy: 0.8247 | Val loss: 0.4802 | Val accuracy: 0.7878\n",
"Epoch 331/500 | Train loss: 0.4787 | Train accuracy: 0.8003 | Val loss: 0.4270 | Val accuracy: 0.7895\n",
"Epoch 332/500 | Train loss: 0.4381 | Train accuracy: 0.8071 | Val loss: 0.4374 | Val accuracy: 0.7895\n",
"Epoch 333/500 | Train loss: 0.4357 | Train accuracy: 0.8043 | Val loss: 0.4450 | Val accuracy: 0.7947\n",
"Epoch 334/500 | Train loss: 0.4240 | Train accuracy: 0.8139 | Val loss: 0.4692 | Val accuracy: 0.7755\n",
"Epoch 335/500 | Train loss: 0.4259 | Train accuracy: 0.8220 | Val loss: 0.4511 | Val accuracy: 0.7895\n",
"Epoch 336/500 | Train loss: 0.4050 | Train accuracy: 0.8247 | Val loss: 0.4650 | Val accuracy: 0.7895\n",
"Epoch 337/500 | Train loss: 0.4239 | Train accuracy: 0.8084 | Val loss: 0.4489 | Val accuracy: 0.7807\n",
"Epoch 338/500 | Train loss: 0.4258 | Train accuracy: 0.8288 | Val loss: 0.4377 | Val accuracy: 0.7895\n",
"Epoch 339/500 | Train loss: 0.4404 | Train accuracy: 0.8356 | Val loss: 0.4754 | Val accuracy: 0.7738\n",
"Epoch 340/500 | Train loss: 0.4304 | Train accuracy: 0.8125 | Val loss: 0.4851 | Val accuracy: 0.7843\n",
"Epoch 341/500 | Train loss: 0.4280 | Train accuracy: 0.8071 | Val loss: 0.4841 | Val accuracy: 0.7895\n",
"Epoch 342/500 | Train loss: 0.4203 | Train accuracy: 0.8261 | Val loss: 0.4987 | Val accuracy: 0.7895\n",
"Epoch 343/500 | Train loss: 0.4327 | Train accuracy: 0.8111 | Val loss: 0.4345 | Val accuracy: 0.7738\n",
"Epoch 344/500 | Train loss: 0.4026 | Train accuracy: 0.8193 | Val loss: 0.4386 | Val accuracy: 0.7843\n",
"Epoch 345/500 | Train loss: 0.4336 | Train accuracy: 0.8166 | Val loss: 0.4414 | Val accuracy: 0.7895\n",
"Epoch 346/500 | Train loss: 0.4287 | Train accuracy: 0.8315 | Val loss: 0.4566 | Val accuracy: 0.7843\n",
"Epoch 347/500 | Train loss: 0.4303 | Train accuracy: 0.8098 | Val loss: 0.4578 | Val accuracy: 0.7843\n",
"Epoch 348/500 | Train loss: 0.4262 | Train accuracy: 0.8356 | Val loss: 0.4586 | Val accuracy: 0.7947\n",
"Epoch 349/500 | Train loss: 0.3971 | Train accuracy: 0.8302 | Val loss: 0.4807 | Val accuracy: 0.7947\n",
"Epoch 350/500 | Train loss: 0.4091 | Train accuracy: 0.8193 | Val loss: 0.4364 | Val accuracy: 0.7843\n",
"Epoch 351/500 | Train loss: 0.3864 | Train accuracy: 0.8315 | Val loss: 0.4565 | Val accuracy: 0.7738\n",
"Epoch 352/500 | Train loss: 0.3968 | Train accuracy: 0.8288 | Val loss: 0.4229 | Val accuracy: 0.7947\n",
"Epoch 353/500 | Train loss: 0.4372 | Train accuracy: 0.8179 | Val loss: 0.4481 | Val accuracy: 0.7843\n",
"Epoch 354/500 | Train loss: 0.4267 | Train accuracy: 0.8356 | Val loss: 0.4389 | Val accuracy: 0.8087\n",
"Epoch 355/500 | Train loss: 0.4407 | Train accuracy: 0.8071 | Val loss: 0.4378 | Val accuracy: 0.7895\n",
"Epoch 356/500 | Train loss: 0.4360 | Train accuracy: 0.8342 | Val loss: 0.4646 | Val accuracy: 0.7947\n",
"Epoch 357/500 | Train loss: 0.4185 | Train accuracy: 0.8302 | Val loss: 0.4428 | Val accuracy: 0.7895\n",
"Epoch 358/500 | Train loss: 0.4329 | Train accuracy: 0.8057 | Val loss: 0.4522 | Val accuracy: 0.7791\n",
"Epoch 359/500 | Train loss: 0.4362 | Train accuracy: 0.8261 | Val loss: 0.4572 | Val accuracy: 0.7947\n",
"Epoch 360/500 | Train loss: 0.4316 | Train accuracy: 0.8220 | Val loss: 0.4583 | Val accuracy: 0.7843\n",
"Epoch 361/500 | Train loss: 0.4116 | Train accuracy: 0.8234 | Val loss: 0.4810 | Val accuracy: 0.7895\n",
"Epoch 362/500 | Train loss: 0.4159 | Train accuracy: 0.8111 | Val loss: 0.4583 | Val accuracy: 0.7843\n",
"Epoch 363/500 | Train loss: 0.3990 | Train accuracy: 0.8315 | Val loss: 0.4478 | Val accuracy: 0.7738\n",
"Epoch 364/500 | Train loss: 0.4557 | Train accuracy: 0.7826 | Val loss: 0.4704 | Val accuracy: 0.7791\n",
"Epoch 365/500 | Train loss: 0.4196 | Train accuracy: 0.8125 | Val loss: 0.4608 | Val accuracy: 0.7703\n",
"Epoch 366/500 | Train loss: 0.4335 | Train accuracy: 0.8247 | Val loss: 0.4917 | Val accuracy: 0.7755\n",
"Epoch 367/500 | Train loss: 0.4392 | Train accuracy: 0.8098 | Val loss: 0.4596 | Val accuracy: 0.7826\n",
"Epoch 368/500 | Train loss: 0.4149 | Train accuracy: 0.8166 | Val loss: 0.4835 | Val accuracy: 0.7738\n",
"Epoch 369/500 | Train loss: 0.4386 | Train accuracy: 0.8234 | Val loss: 0.4723 | Val accuracy: 0.7843\n",
"Epoch 370/500 | Train loss: 0.4137 | Train accuracy: 0.8234 | Val loss: 0.4829 | Val accuracy: 0.7947\n",
"Epoch 371/500 | Train loss: 0.4178 | Train accuracy: 0.8261 | Val loss: 0.4524 | Val accuracy: 0.7947\n",
"Epoch 372/500 | Train loss: 0.4047 | Train accuracy: 0.8207 | Val loss: 0.4804 | Val accuracy: 0.7843\n",
"Epoch 373/500 | Train loss: 0.4451 | Train accuracy: 0.8261 | Val loss: 0.4662 | Val accuracy: 0.7547\n",
"Epoch 374/500 | Train loss: 0.4242 | Train accuracy: 0.8220 | Val loss: 0.4474 | Val accuracy: 0.7947\n",
"Epoch 375/500 | Train loss: 0.4190 | Train accuracy: 0.8288 | Val loss: 0.4552 | Val accuracy: 0.7843\n",
"Epoch 376/500 | Train loss: 0.4268 | Train accuracy: 0.8098 | Val loss: 0.4529 | Val accuracy: 0.7791\n",
"Epoch 377/500 | Train loss: 0.4161 | Train accuracy: 0.8247 | Val loss: 0.4419 | Val accuracy: 0.7791\n",
"Epoch 378/500 | Train loss: 0.3986 | Train accuracy: 0.8465 | Val loss: 0.4718 | Val accuracy: 0.7791\n",
"Epoch 379/500 | Train loss: 0.3723 | Train accuracy: 0.8505 | Val loss: 0.4624 | Val accuracy: 0.7843\n",
"Epoch 380/500 | Train loss: 0.4052 | Train accuracy: 0.8247 | Val loss: 0.4661 | Val accuracy: 0.7791\n",
"Epoch 381/500 | Train loss: 0.4147 | Train accuracy: 0.8125 | Val loss: 0.4690 | Val accuracy: 0.7686\n",
"Epoch 382/500 | Train loss: 0.4207 | Train accuracy: 0.8166 | Val loss: 0.5490 | Val accuracy: 0.7547\n",
"Epoch 383/500 | Train loss: 0.4398 | Train accuracy: 0.8016 | Val loss: 0.4829 | Val accuracy: 0.7791\n",
"Epoch 384/500 | Train loss: 0.4031 | Train accuracy: 0.8315 | Val loss: 0.4959 | Val accuracy: 0.7651\n",
"Epoch 385/500 | Train loss: 0.4393 | Train accuracy: 0.8261 | Val loss: 0.4490 | Val accuracy: 0.8087\n",
"Epoch 386/500 | Train loss: 0.4297 | Train accuracy: 0.8207 | Val loss: 0.4578 | Val accuracy: 0.7930\n",
"Epoch 387/500 | Train loss: 0.4328 | Train accuracy: 0.8084 | Val loss: 0.4672 | Val accuracy: 0.8035\n",
"Epoch 388/500 | Train loss: 0.4253 | Train accuracy: 0.8071 | Val loss: 0.4616 | Val accuracy: 0.7791\n",
"Epoch 389/500 | Train loss: 0.4296 | Train accuracy: 0.8166 | Val loss: 0.4237 | Val accuracy: 0.7791\n",
"Epoch 390/500 | Train loss: 0.4256 | Train accuracy: 0.8274 | Val loss: 0.4496 | Val accuracy: 0.7947\n",
"Epoch 391/500 | Train loss: 0.4384 | Train accuracy: 0.8071 | Val loss: 0.4552 | Val accuracy: 0.7791\n",
"Epoch 392/500 | Train loss: 0.4192 | Train accuracy: 0.8220 | Val loss: 0.4515 | Val accuracy: 0.7738\n",
"Epoch 393/500 | Train loss: 0.4325 | Train accuracy: 0.8220 | Val loss: 0.4465 | Val accuracy: 0.7895\n",
"Epoch 394/500 | Train loss: 0.4310 | Train accuracy: 0.7962 | Val loss: 0.4768 | Val accuracy: 0.7947\n",
"Epoch 395/500 | Train loss: 0.4315 | Train accuracy: 0.8016 | Val loss: 0.4952 | Val accuracy: 0.7843\n",
"Epoch 396/500 | Train loss: 0.4188 | Train accuracy: 0.8057 | Val loss: 0.4900 | Val accuracy: 0.7930\n",
"Epoch 397/500 | Train loss: 0.4374 | Train accuracy: 0.8152 | Val loss: 0.4665 | Val accuracy: 0.7686\n",
"Epoch 398/500 | Train loss: 0.4411 | Train accuracy: 0.7976 | Val loss: 0.4486 | Val accuracy: 0.7791\n",
"Epoch 399/500 | Train loss: 0.4402 | Train accuracy: 0.8288 | Val loss: 0.4459 | Val accuracy: 0.7930\n",
"Epoch 400/500 | Train loss: 0.4575 | Train accuracy: 0.7867 | Val loss: 0.4639 | Val accuracy: 0.7651\n",
"Epoch 401/500 | Train loss: 0.4447 | Train accuracy: 0.7935 | Val loss: 0.4775 | Val accuracy: 0.7738\n",
"Epoch 402/500 | Train loss: 0.3992 | Train accuracy: 0.8342 | Val loss: 0.4670 | Val accuracy: 0.7547\n",
"Epoch 403/500 | Train loss: 0.4305 | Train accuracy: 0.8179 | Val loss: 0.4694 | Val accuracy: 0.7738\n",
"Epoch 404/500 | Train loss: 0.4351 | Train accuracy: 0.8030 | Val loss: 0.4580 | Val accuracy: 0.7686\n",
"Epoch 405/500 | Train loss: 0.4329 | Train accuracy: 0.8152 | Val loss: 0.5006 | Val accuracy: 0.7634\n",
"Epoch 406/500 | Train loss: 0.4728 | Train accuracy: 0.8111 | Val loss: 0.4868 | Val accuracy: 0.7599\n",
"Epoch 407/500 | Train loss: 0.4135 | Train accuracy: 0.8193 | Val loss: 0.4857 | Val accuracy: 0.7686\n",
"Epoch 408/500 | Train loss: 0.4391 | Train accuracy: 0.8166 | Val loss: 0.4889 | Val accuracy: 0.7895\n",
"Epoch 409/500 | Train loss: 0.4519 | Train accuracy: 0.8152 | Val loss: 0.5048 | Val accuracy: 0.7843\n",
"Epoch 410/500 | Train loss: 0.4492 | Train accuracy: 0.8084 | Val loss: 0.6255 | Val accuracy: 0.7738\n",
"Epoch 411/500 | Train loss: 0.4397 | Train accuracy: 0.8057 | Val loss: 0.5192 | Val accuracy: 0.7774\n",
"Epoch 412/500 | Train loss: 0.4273 | Train accuracy: 0.8166 | Val loss: 0.4781 | Val accuracy: 0.7843\n",
"Epoch 413/500 | Train loss: 0.4698 | Train accuracy: 0.7962 | Val loss: 0.4314 | Val accuracy: 0.7930\n",
"Epoch 414/500 | Train loss: 0.4449 | Train accuracy: 0.8071 | Val loss: 0.4445 | Val accuracy: 0.7738\n",
"Epoch 415/500 | Train loss: 0.4417 | Train accuracy: 0.8125 | Val loss: 0.4334 | Val accuracy: 0.7947\n",
"Epoch 416/500 | Train loss: 0.4314 | Train accuracy: 0.8030 | Val loss: 0.4684 | Val accuracy: 0.7791\n",
"Epoch 417/500 | Train loss: 0.4250 | Train accuracy: 0.8152 | Val loss: 0.4546 | Val accuracy: 0.7947\n",
"Epoch 418/500 | Train loss: 0.4042 | Train accuracy: 0.8288 | Val loss: 0.4549 | Val accuracy: 0.7791\n",
"Epoch 419/500 | Train loss: 0.4240 | Train accuracy: 0.8315 | Val loss: 0.4810 | Val accuracy: 0.7895\n",
"Epoch 420/500 | Train loss: 0.4085 | Train accuracy: 0.8247 | Val loss: 0.4740 | Val accuracy: 0.7895\n",
"Epoch 421/500 | Train loss: 0.3884 | Train accuracy: 0.8465 | Val loss: 0.4925 | Val accuracy: 0.7911\n",
"Epoch 422/500 | Train loss: 0.4224 | Train accuracy: 0.8383 | Val loss: 0.4923 | Val accuracy: 0.7738\n",
"Epoch 423/500 | Train loss: 0.4446 | Train accuracy: 0.7962 | Val loss: 0.4582 | Val accuracy: 0.7686\n",
"Epoch 424/500 | Train loss: 0.4263 | Train accuracy: 0.8193 | Val loss: 0.4482 | Val accuracy: 0.7791\n",
"Epoch 425/500 | Train loss: 0.4113 | Train accuracy: 0.8329 | Val loss: 0.4283 | Val accuracy: 0.7999\n",
"Epoch 426/500 | Train loss: 0.4409 | Train accuracy: 0.8057 | Val loss: 0.4546 | Val accuracy: 0.7843\n",
"Epoch 427/500 | Train loss: 0.4088 | Train accuracy: 0.8234 | Val loss: 0.4668 | Val accuracy: 0.8139\n",
"Epoch 428/500 | Train loss: 0.4437 | Train accuracy: 0.8166 | Val loss: 0.4606 | Val accuracy: 0.7999\n",
"Epoch 429/500 | Train loss: 0.4259 | Train accuracy: 0.8179 | Val loss: 0.4527 | Val accuracy: 0.7843\n",
"Epoch 430/500 | Train loss: 0.4273 | Train accuracy: 0.8084 | Val loss: 0.4785 | Val accuracy: 0.7791\n",
"Epoch 431/500 | Train loss: 0.4135 | Train accuracy: 0.8166 | Val loss: 0.4575 | Val accuracy: 0.7738\n",
"Epoch 432/500 | Train loss: 0.4088 | Train accuracy: 0.8356 | Val loss: 0.4625 | Val accuracy: 0.7859\n",
"Epoch 433/500 | Train loss: 0.4392 | Train accuracy: 0.8166 | Val loss: 0.4677 | Val accuracy: 0.7895\n",
"Epoch 434/500 | Train loss: 0.4332 | Train accuracy: 0.8125 | Val loss: 0.4608 | Val accuracy: 0.7895\n",
"Epoch 435/500 | Train loss: 0.4109 | Train accuracy: 0.8179 | Val loss: 0.4771 | Val accuracy: 0.7895\n",
"Epoch 436/500 | Train loss: 0.4359 | Train accuracy: 0.8166 | Val loss: 0.4656 | Val accuracy: 0.7738\n",
"Epoch 437/500 | Train loss: 0.4010 | Train accuracy: 0.8220 | Val loss: 0.4567 | Val accuracy: 0.7947\n",
"Epoch 438/500 | Train loss: 0.4273 | Train accuracy: 0.8193 | Val loss: 0.4533 | Val accuracy: 0.7738\n",
"Epoch 439/500 | Train loss: 0.4402 | Train accuracy: 0.8030 | Val loss: 0.4719 | Val accuracy: 0.7582\n",
"Epoch 440/500 | Train loss: 0.6154 | Train accuracy: 0.8193 | Val loss: 0.4931 | Val accuracy: 0.7582\n",
"Epoch 441/500 | Train loss: 0.4949 | Train accuracy: 0.7649 | Val loss: 0.4632 | Val accuracy: 0.7667\n",
"Epoch 442/500 | Train loss: 0.5187 | Train accuracy: 0.7908 | Val loss: 0.5186 | Val accuracy: 0.7495\n",
"Epoch 443/500 | Train loss: 0.4591 | Train accuracy: 0.8166 | Val loss: 0.4479 | Val accuracy: 0.7807\n",
"Epoch 444/500 | Train loss: 0.4390 | Train accuracy: 0.8234 | Val loss: 0.5006 | Val accuracy: 0.7843\n",
"Epoch 445/500 | Train loss: 0.4167 | Train accuracy: 0.8261 | Val loss: 0.5909 | Val accuracy: 0.7791\n",
"Epoch 446/500 | Train loss: 0.4751 | Train accuracy: 0.7867 | Val loss: 0.4762 | Val accuracy: 0.7686\n",
"Epoch 447/500 | Train loss: 0.4556 | Train accuracy: 0.8071 | Val loss: 0.5103 | Val accuracy: 0.7791\n",
"Epoch 448/500 | Train loss: 0.4610 | Train accuracy: 0.7935 | Val loss: 0.4644 | Val accuracy: 0.7791\n",
"Epoch 449/500 | Train loss: 0.4628 | Train accuracy: 0.7948 | Val loss: 0.4571 | Val accuracy: 0.7791\n",
"Epoch 450/500 | Train loss: 0.4573 | Train accuracy: 0.7976 | Val loss: 0.5479 | Val accuracy: 0.7547\n",
"Epoch 451/500 | Train loss: 0.4476 | Train accuracy: 0.7935 | Val loss: 0.5679 | Val accuracy: 0.7495\n",
"Epoch 452/500 | Train loss: 0.4572 | Train accuracy: 0.7962 | Val loss: 0.5122 | Val accuracy: 0.7755\n",
"Epoch 453/500 | Train loss: 0.4591 | Train accuracy: 0.7853 | Val loss: 0.4679 | Val accuracy: 0.7930\n",
"Epoch 454/500 | Train loss: 0.4677 | Train accuracy: 0.7880 | Val loss: 0.4608 | Val accuracy: 0.7947\n",
"Epoch 455/500 | Train loss: 0.4702 | Train accuracy: 0.7989 | Val loss: 0.5357 | Val accuracy: 0.7807\n",
"Epoch 456/500 | Train loss: 0.4837 | Train accuracy: 0.7894 | Val loss: 0.5475 | Val accuracy: 0.7651\n",
"Epoch 457/500 | Train loss: 0.4572 | Train accuracy: 0.7880 | Val loss: 0.5127 | Val accuracy: 0.7738\n",
"Epoch 458/500 | Train loss: 0.4782 | Train accuracy: 0.8003 | Val loss: 0.4855 | Val accuracy: 0.7599\n",
"Epoch 459/500 | Train loss: 0.4700 | Train accuracy: 0.7921 | Val loss: 0.4568 | Val accuracy: 0.7895\n",
"Epoch 460/500 | Train loss: 0.4323 | Train accuracy: 0.8288 | Val loss: 0.4874 | Val accuracy: 0.7651\n",
"Epoch 461/500 | Train loss: 0.4383 | Train accuracy: 0.8016 | Val loss: 0.5055 | Val accuracy: 0.7599\n",
"Epoch 462/500 | Train loss: 0.4479 | Train accuracy: 0.7921 | Val loss: 0.4933 | Val accuracy: 0.7582\n",
"Epoch 463/500 | Train loss: 0.4542 | Train accuracy: 0.8043 | Val loss: 0.4949 | Val accuracy: 0.7686\n",
"Epoch 464/500 | Train loss: 0.4548 | Train accuracy: 0.7948 | Val loss: 0.4572 | Val accuracy: 0.7930\n",
"Epoch 465/500 | Train loss: 0.4372 | Train accuracy: 0.8152 | Val loss: 0.4815 | Val accuracy: 0.7791\n",
"Epoch 466/500 | Train loss: 0.4191 | Train accuracy: 0.8274 | Val loss: 0.4556 | Val accuracy: 0.7947\n",
"Epoch 467/500 | Train loss: 0.4127 | Train accuracy: 0.8261 | Val loss: 0.4588 | Val accuracy: 0.7895\n",
"Epoch 468/500 | Train loss: 0.4612 | Train accuracy: 0.8043 | Val loss: 0.4422 | Val accuracy: 0.8051\n",
"Epoch 469/500 | Train loss: 0.4443 | Train accuracy: 0.7948 | Val loss: 0.4612 | Val accuracy: 0.7826\n",
"Epoch 470/500 | Train loss: 0.4085 | Train accuracy: 0.8247 | Val loss: 0.4991 | Val accuracy: 0.7738\n",
"Epoch 471/500 | Train loss: 0.4400 | Train accuracy: 0.8030 | Val loss: 0.4495 | Val accuracy: 0.7582\n",
"Epoch 472/500 | Train loss: 0.4326 | Train accuracy: 0.8152 | Val loss: 0.4534 | Val accuracy: 0.7755\n",
"Epoch 473/500 | Train loss: 0.4284 | Train accuracy: 0.8125 | Val loss: 0.4692 | Val accuracy: 0.7878\n",
"Epoch 474/500 | Train loss: 0.4111 | Train accuracy: 0.8261 | Val loss: 0.4447 | Val accuracy: 0.8035\n",
"Epoch 475/500 | Train loss: 0.4178 | Train accuracy: 0.8261 | Val loss: 0.4584 | Val accuracy: 0.7791\n",
"Epoch 476/500 | Train loss: 0.4183 | Train accuracy: 0.8193 | Val loss: 0.4278 | Val accuracy: 0.7878\n",
"Epoch 477/500 | Train loss: 0.4422 | Train accuracy: 0.7976 | Val loss: 0.4514 | Val accuracy: 0.7738\n",
"Epoch 478/500 | Train loss: 0.4487 | Train accuracy: 0.7962 | Val loss: 0.4562 | Val accuracy: 0.7947\n",
"Epoch 479/500 | Train loss: 0.4265 | Train accuracy: 0.8207 | Val loss: 0.4670 | Val accuracy: 0.7895\n",
"Epoch 480/500 | Train loss: 0.4228 | Train accuracy: 0.8152 | Val loss: 0.4901 | Val accuracy: 0.7843\n",
"Epoch 481/500 | Train loss: 0.3970 | Train accuracy: 0.8397 | Val loss: 0.5292 | Val accuracy: 0.7843\n",
"Epoch 482/500 | Train loss: 0.4256 | Train accuracy: 0.8234 | Val loss: 0.4600 | Val accuracy: 0.7878\n",
"Epoch 483/500 | Train loss: 0.4565 | Train accuracy: 0.8003 | Val loss: 0.4552 | Val accuracy: 0.7826\n",
"Epoch 484/500 | Train loss: 0.4265 | Train accuracy: 0.8125 | Val loss: 0.4440 | Val accuracy: 0.7895\n",
"Epoch 485/500 | Train loss: 0.4440 | Train accuracy: 0.8043 | Val loss: 0.4802 | Val accuracy: 0.7686\n",
"Epoch 486/500 | Train loss: 0.4717 | Train accuracy: 0.7908 | Val loss: 0.4539 | Val accuracy: 0.7895\n",
"Epoch 487/500 | Train loss: 0.4252 | Train accuracy: 0.8193 | Val loss: 0.4112 | Val accuracy: 0.8139\n",
"Epoch 488/500 | Train loss: 0.4129 | Train accuracy: 0.8329 | Val loss: 0.4631 | Val accuracy: 0.7791\n",
"Epoch 489/500 | Train loss: 0.4610 | Train accuracy: 0.8111 | Val loss: 0.4433 | Val accuracy: 0.7982\n",
"Epoch 490/500 | Train loss: 0.4741 | Train accuracy: 0.8016 | Val loss: 0.4468 | Val accuracy: 0.7774\n",
"Epoch 491/500 | Train loss: 0.4244 | Train accuracy: 0.8030 | Val loss: 0.4276 | Val accuracy: 0.7947\n",
"Epoch 492/500 | Train loss: 0.4566 | Train accuracy: 0.8098 | Val loss: 0.4701 | Val accuracy: 0.7791\n",
"Epoch 493/500 | Train loss: 0.4897 | Train accuracy: 0.8003 | Val loss: 0.5971 | Val accuracy: 0.7686\n",
"Epoch 494/500 | Train loss: 0.5415 | Train accuracy: 0.7867 | Val loss: 0.5015 | Val accuracy: 0.7982\n",
"Epoch 495/500 | Train loss: 0.4562 | Train accuracy: 0.8125 | Val loss: 0.4540 | Val accuracy: 0.7895\n",
"Epoch 496/500 | Train loss: 0.4463 | Train accuracy: 0.8030 | Val loss: 0.4731 | Val accuracy: 0.7582\n",
"Epoch 497/500 | Train loss: 0.4822 | Train accuracy: 0.7840 | Val loss: 0.4405 | Val accuracy: 0.7895\n",
"Epoch 498/500 | Train loss: 0.4213 | Train accuracy: 0.8261 | Val loss: 0.4087 | Val accuracy: 0.8139\n",
"Epoch 499/500 | Train loss: 0.4301 | Train accuracy: 0.8220 | Val loss: 0.4308 | Val accuracy: 0.7895\n",
"Epoch 500/500 | Train loss: 0.4674 | Train accuracy: 0.8057 | Val loss: 0.4558 | Val accuracy: 0.7686\n"
]
}
],
"source": [
"# Train model algorithm\n",
"\n",
"n_epochs = 500\n",
"train_losses = []\n",
"val_losses = []\n",
"train_accuracies = []\n",
"val_accuracies = []\n",
"best_val_accuracy = 0 # Variable to store the best validation accuracy\n",
"best_model_path = 'best_model.pth' # Path to save the best model\n",
"\n",
"for epoch in range(n_epochs):\n",
" model.train()\n",
" train_loss = 0\n",
" train_accuracy = 0\n",
" for i, (X_batch, y_batch) in enumerate(train_loader):\n",
" optimizer.zero_grad()\n",
" y_pred = model(X_batch)\n",
" loss = criterion(y_pred, y_batch)\n",
" loss.backward()\n",
" optimizer.step()\n",
" train_loss += loss.item()\n",
" train_accuracy += accuracy_score(y_batch.numpy(), y_pred.argmax(axis=1).detach().numpy())\n",
" train_loss /= len(train_loader)\n",
" train_accuracy /= len(train_loader)\n",
" train_losses.append(train_loss)\n",
" train_accuracies.append(train_accuracy)\n",
" \n",
" model.eval()\n",
" val_loss = 0\n",
" val_accuracy = 0\n",
" with torch.no_grad():\n",
" for i, (X_batch, y_batch) in enumerate(val_loader):\n",
" y_pred = model(X_batch)\n",
" loss = criterion(y_pred, y_batch)\n",
" val_loss += loss.item()\n",
" val_accuracy += accuracy_score(y_batch.numpy(), y_pred.argmax(axis=1).detach().numpy())\n",
" val_loss /= len(val_loader)\n",
" val_accuracy /= len(val_loader)\n",
" val_losses.append(val_loss)\n",
" val_accuracies.append(val_accuracy) \n",
"\n",
" # Check if the current model has the best validation accuracy\n",
" if val_accuracy > best_val_accuracy:\n",
" best_val_accuracy = val_accuracy\n",
" torch.save(model.state_dict(), best_model_path) # Save the best model\n",
" \n",
" print(f\"Epoch {epoch+1}/{n_epochs} | Train loss: {train_loss:.4f} | Train accuracy: {train_accuracy:.4f} | Val loss: {val_loss:.4f} | Val accuracy: {val_accuracy:.4f}\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "25e1ccd2",
"metadata": {
"execution": {
"iopub.execute_input": "2024-07-20T17:15:00.955220Z",
"iopub.status.busy": "2024-07-20T17:15:00.954805Z",
"iopub.status.idle": "2024-07-20T17:15:01.568623Z",
"shell.execute_reply": "2024-07-20T17:15:01.567348Z"
},
"papermill": {
"duration": 0.648239,
"end_time": "2024-07-20T17:15:01.571704",
"exception": false,
"start_time": "2024-07-20T17:15:00.923465",
"status": "completed"
},
"tags": []