File size: 149,231 Bytes
93109de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SCjmX4zTCkRK"
   },
   "source": [
    "## Setup\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.org/simple, https://pip.repos.neuron.amazonaws.com\n",
      "Collecting pydot\n",
      "  Downloading pydot-1.4.2-py2.py3-none-any.whl (21 kB)\n",
      "Requirement already satisfied: pyparsing>=2.1.4 in /home/ec2-user/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages (from pydot) (3.0.9)\n",
      "Installing collected packages: pydot\n",
      "Successfully installed pydot-1.4.2\n"
     ]
    }
   ],
   "source": [
    "!pip install pydot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "q-YbjCkzw0yU",
    "outputId": "2e75e5ba-bedf-43f2-d2c3-270fd0070ca6",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
      "mkl-fft 1.3.6 requires mkl, which is not installed.\u001b[0m\u001b[31m\n",
      "\u001b[0m"
     ]
    }
   ],
   "source": [
    "# A dependency of the preprocessing for BERT inputs\n",
    "!pip install -q -U \"tensorflow-text==2.12.*\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5w_XlxN1IsRJ"
   },
   "source": [
    "You will use the AdamW optimizer from [tensorflow/models](https://github.com/tensorflow/models)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "b-P1ZOA0FkVJ",
    "tags": []
   },
   "outputs": [],
   "source": [
    "!pip install -q tf-models-official==2.12.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "_XgTpm9ZxoN9",
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/ec2-user/anaconda3/envs/tensorflow2_p310/lib/python3.10/site-packages/tensorflow_addons/utils/tfa_eol_msg.py:23: UserWarning: \n",
      "\n",
      "TensorFlow Addons (TFA) has ended development and introduction of new features.\n",
      "TFA has entered a minimal maintenance and release mode until a planned end of life in May 2024.\n",
      "Please modify downstream libraries to take dependencies from other repositories in our TensorFlow community (e.g. Keras, Keras-CV, and Keras-NLP). \n",
      "\n",
      "For more information see: https://github.com/tensorflow/addons/issues/2807 \n",
      "\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import shutil\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import tensorflow as tf\n",
    "import tensorflow_hub as hub\n",
    "import tensorflow_text as text\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from official.nlp import optimization  # to create AdamW optimizer\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "\n",
    "tf.get_logger().setLevel('ERROR')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "6IwI_2bcIeX8",
    "outputId": "8e2c3829-138d-4d11-ce33-38bde48b9865",
    "tags": []
   },
   "outputs": [],
   "source": [
    "# Load the CSV file using pandas\n",
    "ds = pd.read_csv('./all_sentiment_datasets.csv')\n",
    "ds = ds.sample(frac=1).reset_index(drop=True)\n",
    "\n",
    "labels_columns = \"sentiment\"\n",
    "# Extract the features (inputs) and labels (outputs)\n",
    "features = ds[\"sentence\"]\n",
    "labels = ds[labels_columns]\n",
    "class_names = np.unique(labels)\n",
    "labels_tags = ['negative', 'positive']\n",
    "# Split the data into training and testing sets\n",
    "subset_range =  int(len(features) * 0.01)\n",
    "features = features[:subset_range]\n",
    "labels = labels[:subset_range]\n",
    "split_range =  int(len(features) * 0.8)\n",
    "train_ds, test_ds = features[:split_range], features[split_range:]\n",
    "train_labels, test_labels = labels[:split_range], labels[split_range:] "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HGm10A5HRGXp"
   },
   "source": [
    "Let's take a look at a few reviews."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "JuxDkcvVIoev",
    "outputId": "19095674-83bd-4057-d890-681abc549fb0",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Review: Nina was on my lap, but just decided to jump off \n",
      "Label : 0 (negative)\n",
      "Review: good morning orapatto yeah monday and stary june ne\n",
      "Label : 1 (positive)\n",
      "Review: says I broke aryanna's strawberry keychain! (lmao) ayaw kasi ipakita yung vid sa cp nia  http://plurk.com/p/xosdp\n",
      "Label : 1 (positive)\n"
     ]
    }
   ],
   "source": [
    "for i in range(3):\n",
    "  print(f'Review: {train_ds[i]}')\n",
    "  label = train_labels[i]\n",
    "  print(f'Label : {label} ({labels_tags[label]})')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dX8FtlpGJRE6"
   },
   "source": [
    "## Loading models from TensorFlow Hub\n",
    "\n",
    "Here you can choose which BERT model you will load from TensorFlow Hub and fine-tune. There are multiple BERT models available.\n",
    "\n",
    "  - [BERT-Base](https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/3), [Uncased](https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/3) and [seven more models](https://tfhub.dev/google/collections/bert/1) with trained weights released by the original BERT authors.\n",
    "  - [Small BERTs](https://tfhub.dev/google/collections/bert/1) have the same general architecture but fewer and/or smaller Transformer blocks, which lets you explore tradeoffs between speed, size and quality.\n",
    "  - [ALBERT](https://tfhub.dev/google/collections/albert/1): four different sizes of \"A Lite BERT\" that reduces model size (but not computation time) by sharing parameters between layers.\n",
    "  - [BERT Experts](https://tfhub.dev/google/collections/experts/bert/1): eight models that all have the BERT-base architecture but offer a choice between different pre-training domains, to align more closely with the target task.\n",
    "  - [Electra](https://tfhub.dev/google/collections/electra/1) has the same architecture as BERT (in three different sizes), but gets pre-trained as a discriminator in a set-up that resembles a Generative Adversarial Network (GAN).\n",
    "  - BERT with Talking-Heads Attention and Gated GELU [[base](https://tfhub.dev/tensorflow/talkheads_ggelu_bert_en_base/1), [large](https://tfhub.dev/tensorflow/talkheads_ggelu_bert_en_large/1)] has two improvements to the core of the Transformer architecture.\n",
    "\n",
    "The model documentation on TensorFlow Hub has more details and references to the\n",
    "research literature. Follow the links above, or click on the [`tfhub.dev`](http://tfhub.dev) URL\n",
    "printed after the next cell execution.\n",
    "\n",
    "The suggestion is to start with a Small BERT (with fewer parameters) since they are faster to fine-tune. If you like a small model but with higher accuracy, ALBERT might be your next option. If you want even better accuracy, choose\n",
    "one of the classic BERT sizes or their recent refinements like Electra, Talking Heads, or a BERT Expert.\n",
    "\n",
    "Aside from the models available below, there are [multiple versions](https://tfhub.dev/google/collections/transformer_encoders_text/1) of the models that are larger and can yield even better accuracy, but they are too big to be fine-tuned on a single GPU. You will be able to do that on the [Solve GLUE tasks using BERT on a TPU colab](https://www.tensorflow.org/text/tutorials/bert_glue).\n",
    "\n",
    "You'll see in the code below that switching the tfhub.dev URL is enough to try any of these models, because all the differences between them are encapsulated in the SavedModels from TF Hub."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "cellView": "form",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "y8_ctG55-uTX",
    "outputId": "b9a73071-d37a-4bc0-f632-11f430ee4796",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BERT model selected           : https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-128_A-2/1\n",
      "Preprocess model auto-selected: https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3\n"
     ]
    }
   ],
   "source": [
    "#@title Choose a BERT model to fine-tune\n",
    "\n",
    "bert_model_name = 'small_bert/bert_en_uncased_L-2_H-128_A-2'  #@param [\"bert_en_uncased_L-12_H-768_A-12\", \"bert_en_cased_L-12_H-768_A-12\", \"bert_multi_cased_L-12_H-768_A-12\", \"small_bert/bert_en_uncased_L-2_H-128_A-2\", \"small_bert/bert_en_uncased_L-2_H-256_A-4\", \"small_bert/bert_en_uncased_L-2_H-512_A-8\", \"small_bert/bert_en_uncased_L-2_H-768_A-12\", \"small_bert/bert_en_uncased_L-4_H-128_A-2\", \"small_bert/bert_en_uncased_L-4_H-256_A-4\", \"small_bert/bert_en_uncased_L-4_H-512_A-8\", \"small_bert/bert_en_uncased_L-4_H-768_A-12\", \"small_bert/bert_en_uncased_L-6_H-128_A-2\", \"small_bert/bert_en_uncased_L-6_H-256_A-4\", \"small_bert/bert_en_uncased_L-6_H-512_A-8\", \"small_bert/bert_en_uncased_L-6_H-768_A-12\", \"small_bert/bert_en_uncased_L-8_H-128_A-2\", \"small_bert/bert_en_uncased_L-8_H-256_A-4\", \"small_bert/bert_en_uncased_L-8_H-512_A-8\", \"small_bert/bert_en_uncased_L-8_H-768_A-12\", \"small_bert/bert_en_uncased_L-10_H-128_A-2\", \"small_bert/bert_en_uncased_L-10_H-256_A-4\", \"small_bert/bert_en_uncased_L-10_H-512_A-8\", \"small_bert/bert_en_uncased_L-10_H-768_A-12\", \"small_bert/bert_en_uncased_L-12_H-128_A-2\", \"small_bert/bert_en_uncased_L-12_H-256_A-4\", \"small_bert/bert_en_uncased_L-12_H-512_A-8\", \"small_bert/bert_en_uncased_L-12_H-768_A-12\", \"albert_en_base\", \"electra_small\", \"electra_base\", \"experts_pubmed\", \"experts_wiki_books\", \"talking-heads_base\"]\n",
    "\n",
    "map_name_to_handle = {\n",
    "    'bert_en_uncased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/3',\n",
    "    'bert_en_cased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_cased_L-12_H-768_A-12/3',\n",
    "    'bert_multi_cased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_multi_cased_L-12_H-768_A-12/3',\n",
    "    'small_bert/bert_en_uncased_L-2_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-2_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-2_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-2_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-768_A-12/1',\n",
    "    'small_bert/bert_en_uncased_L-4_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-4_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-4_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-4_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-4_H-768_A-12/1',\n",
    "    'small_bert/bert_en_uncased_L-6_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-6_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-6_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-6_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-6_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-6_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-6_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-6_H-768_A-12/1',\n",
    "    'small_bert/bert_en_uncased_L-8_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-8_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-8_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-8_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-8_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-8_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-8_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-8_H-768_A-12/1',\n",
    "    'small_bert/bert_en_uncased_L-10_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-10_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-10_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-10_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-10_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-10_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-10_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-10_H-768_A-12/1',\n",
    "    'small_bert/bert_en_uncased_L-12_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-12_H-128_A-2/1',\n",
    "    'small_bert/bert_en_uncased_L-12_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-12_H-256_A-4/1',\n",
    "    'small_bert/bert_en_uncased_L-12_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-12_H-512_A-8/1',\n",
    "    'small_bert/bert_en_uncased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-12_H-768_A-12/1',\n",
    "    'albert_en_base':\n",
    "        'https://tfhub.dev/tensorflow/albert_en_base/2',\n",
    "    'electra_small':\n",
    "        'https://tfhub.dev/google/electra_small/2',\n",
    "    'electra_base':\n",
    "        'https://tfhub.dev/google/electra_base/2',\n",
    "    'experts_pubmed':\n",
    "        'https://tfhub.dev/google/experts/bert/pubmed/2',\n",
    "    'experts_wiki_books':\n",
    "        'https://tfhub.dev/google/experts/bert/wiki_books/2',\n",
    "    'talking-heads_base':\n",
    "        'https://tfhub.dev/tensorflow/talkheads_ggelu_bert_en_base/1',\n",
    "}\n",
    "\n",
    "map_model_to_preprocess = {\n",
    "    'bert_en_uncased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'bert_en_cased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_cased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-2_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-2_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-2_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-2_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-4_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-4_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-4_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-4_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-6_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-6_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-6_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-6_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-8_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-8_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-8_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-8_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-10_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-10_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-10_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-10_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-12_H-128_A-2':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-12_H-256_A-4':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-12_H-512_A-8':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'small_bert/bert_en_uncased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'bert_multi_cased_L-12_H-768_A-12':\n",
    "        'https://tfhub.dev/tensorflow/bert_multi_cased_preprocess/3',\n",
    "    'albert_en_base':\n",
    "        'https://tfhub.dev/tensorflow/albert_en_preprocess/3',\n",
    "    'electra_small':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'electra_base':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'experts_pubmed':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'experts_wiki_books':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "    'talking-heads_base':\n",
    "        'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3',\n",
    "}\n",
    "\n",
    "tfhub_handle_encoder = map_name_to_handle[bert_model_name]\n",
    "tfhub_handle_preprocess = map_model_to_preprocess[bert_model_name]\n",
    "\n",
    "print(f'BERT model selected           : {tfhub_handle_encoder}')\n",
    "print(f'Preprocess model auto-selected: {tfhub_handle_preprocess}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "pDNKfAXbDnJH"
   },
   "source": [
    "## Define your model\n",
    "\n",
    "You will create a very simple fine-tuned model, with the preprocessing model, the selected BERT model, one Dense and a Dropout layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "aksj743St9ga",
    "tags": []
   },
   "outputs": [],
   "source": [
    "def build_classifier_model():\n",
    "    text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')\n",
    "    preprocessing_layer = hub.KerasLayer(tfhub_handle_preprocess, name='preprocessing')\n",
    "    encoder_inputs = preprocessing_layer(text_input)\n",
    "    encoder = hub.KerasLayer(tfhub_handle_encoder, trainable=True, name='BERT_encoder')\n",
    "    outputs = encoder(encoder_inputs)\n",
    "    net = outputs['pooled_output']\n",
    "    net = tf.keras.layers.Dropout(0.1)(net)\n",
    "    net = tf.keras.layers.Dense(1, activation=None, name='classifier')(net)\n",
    "    return tf.keras.Model(text_input, net)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([[0.54489636]], shape=(1, 1), dtype=float32)\n"
     ]
    }
   ],
   "source": [
    "text_test = ['this is such an amazing movie!']\n",
    "classifier_model = build_classifier_model()\n",
    "bert_raw_result = classifier_model(tf.constant(text_test))\n",
    "print(tf.sigmoid(bert_raw_result))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZTUzNV2JE2G3"
   },
   "source": [
    "Let's take a look at the model's structure."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 466
    },
    "id": "0EmzyHZXKIpm",
    "outputId": "cba41030-b465-43fd-8f95-ddb1f3fb53b7",
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.keras.utils.plot_model(classifier_model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WbUWoZMwc302"
   },
   "source": [
    "## Model training\n",
    "\n",
    "You now have all the pieces to train a model, including the preprocessing module, BERT encoder, data, and classifier."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WpJ3xcwDT56v"
   },
   "source": [
    "### Loss function\n",
    "\n",
    "Since this is a binary classification problem and the model outputs a probability (a single-unit layer), you'll use `losses.BinaryCrossentropy` loss function.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "id": "OWPOZE-L3AgE",
    "tags": []
   },
   "outputs": [],
   "source": [
    "loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n",
    "metrics = tf.metrics.BinaryAccuracy()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "77psrpfzbxtp"
   },
   "source": [
    "### Optimizer\n",
    "\n",
    "For fine-tuning, let's use the same optimizer that BERT was originally trained with: the \"Adaptive Moments\" (Adam). This optimizer minimizes the prediction loss and does regularization by weight decay (not using moments), which is also known as [AdamW](https://arxiv.org/abs/1711.05101).\n",
    "\n",
    "For the learning rate (`init_lr`), you will use the same schedule as BERT pre-training: linear decay of a notional initial learning rate, prefixed with a linear warm-up phase over the first 10% of training steps (`num_warmup_steps`). In line with the BERT paper, the initial learning rate is smaller for fine-tuning (best of 5e-5, 3e-5, 2e-5)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "id": "P9eP2y9dbw32",
    "tags": []
   },
   "outputs": [],
   "source": [
    "epochs = 3\n",
    "steps_per_epoch = len(train_ds)\n",
    "num_train_steps = steps_per_epoch * epochs\n",
    "num_warmup_steps = int(0.1*num_train_steps)\n",
    "\n",
    "init_lr = 3e-5\n",
    "optimizer = optimization.create_optimizer(init_lr=init_lr,\n",
    "                                          num_train_steps=num_train_steps,\n",
    "                                          num_warmup_steps=num_warmup_steps,\n",
    "                                          optimizer_type='adamw')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SqlarlpC_v0g"
   },
   "source": [
    "### Loading the BERT model and training\n",
    "\n",
    "Using the `classifier_model` you created earlier, you can compile the model with the loss, metric and optimizer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "id": "-7GPDhR98jsD",
    "tags": []
   },
   "outputs": [],
   "source": [
    "classifier_model.compile(optimizer=optimizer,\n",
    "                         loss=loss,\n",
    "                         metrics=metrics)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "CpBuV5j2cS_b"
   },
   "source": [
    "Note: training time will vary depending on the complexity of the BERT model you have selected."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "HtfDFAnN_Neu",
    "outputId": "ea39065c-7352-42c8-a0a3-3cdf121318eb",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model with https://tfhub.dev/tensorflow/small_bert/bert_en_uncased_L-2_H-128_A-2/1\n",
      "Epoch 1/3\n",
      "634/634 [==============================] - 91s 134ms/step - loss: 0.8099 - binary_accuracy: 0.4870 - val_loss: 0.7098 - val_binary_accuracy: 0.5036\n",
      "Epoch 2/3\n",
      "634/634 [==============================] - 69s 110ms/step - loss: 0.7061 - binary_accuracy: 0.5291 - val_loss: 0.6565 - val_binary_accuracy: 0.5714\n",
      "Epoch 3/3\n",
      "634/634 [==============================] - 70s 110ms/step - loss: 0.6726 - binary_accuracy: 0.5699 - val_loss: 0.6226 - val_binary_accuracy: 0.6247\n"
     ]
    }
   ],
   "source": [
    "print(f'Training model with {tfhub_handle_encoder}')\n",
    "history = classifier_model.fit(x=train_ds,\n",
    "                               y=train_labels,\n",
    "                               validation_split=0.2,\n",
    "                               epochs=epochs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uBthMlTSV8kn"
   },
   "source": [
    "### Evaluate the model\n",
    "\n",
    "Let's see how the model performs. Two values will be returned. Loss (a number which represents the error, lower values are better), and accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {
    "id": "slqB-urBV9sP",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "198/198 [==============================] - 16s 79ms/step - loss: 0.4533 - binary_accuracy: 0.7897\n",
      "Loss: 0.453285276889801\n",
      "Accuracy: 0.7897395491600037\n"
     ]
    }
   ],
   "source": [
    "loss, accuracy = classifier_model.evaluate(test_ds, test_labels)\n",
    "print(f'Loss: {loss}')\n",
    "print(f'Accuracy: {accuracy}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uttWpgmSfzq9"
   },
   "source": [
    "### Plot the accuracy and loss over time\n",
    "\n",
    "Based on the `History` object returned by `model.fit()`. You can plot the training and validation loss for comparison, as well as the training and validation accuracy:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "id": "fiythcODf0xo",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['loss', 'binary_accuracy', 'val_loss', 'val_binary_accuracy'])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fd405c4c040>"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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njzRe55SqZTS09OlTZs2ScbGxtKzZ880z40cOVLnvt7e3tLIkSM1jz/88ENJoVBIISEhWsd17txZ57PJSv0zcf/+fQmA9Pvvv2ue++KLLyQA0r1793TOa9eundSuXTvN4zVr1uj9vBctWiQBkPbt26fZB0BycXGR4uPjNfuio6MlIyMjaeHChXrbqab+HLP+XLRo0UJydnaWEhISNPsyMjKkunXrSh4eHprPsW7dulKfPn1yvPaTJ08kANKyZctybQMRUXHjsEAiIplVqFABHTp00Nl/9+5dDBkyBK6urjA2NoapqSnatWsHALh+/Xqe123YsCG8vLw0jy0sLFCjRg3cv38/z3MVCgV69eqlta9+/fpa5x45cgS2trY6xTQGDx6c5/XV1qxZA39/f1hYWMDExASmpqY4cOCA3tfXs2dPGBsba7UHgKZNoaGhiIyMxJAhQ7SGSXp7eyMgICDPtpiYmGDYsGHYvn074uLiAABKpRKbN29G79694ejoqDn2woULePXVV+Ho6Kj5bEaMGAGlUombN2/m+/UDwKFDh1CnTh00aNBAa/+QIUN0jo2JicGECRPg6empeb+8vb0B5O9nQp+DBw/C2toaAwYM0NqvHrp44MABrf3t27eHra2t5rGLiwucnZ3z9XOV1YsXL3D69GkMGDAANjY2mv3GxsYYPnw4Hjx4gNDQUABAs2bNsGfPHkyfPh2HDx9GcnKy1rUqVqyIqlWr4osvvsDSpUtx4cIFvcM7iYiKG8MVEZHM1MO2skpMTESbNm1w+vRpLFiwAIcPH8bZs2exfft2AND55VKfrGFAzdzcPF/nWllZwcLCQufclJQUzeOnT5/CxcVF51x9+/RZunQp/ve//6F58+YICgrCqVOncPbsWXTr1k1vG7O/HnNzcwCZ74V6iJirq6vOufr26TNmzBikpKRg69atAIC///4bUVFRGD16tOaY8PBwtGnTBg8fPsTy5ctx7NgxnD17FitXrtRqT349ffo0X21WqVTo0qULtm/fjmnTpuHAgQM4c+aMZt5ZQe+b/f7Z5+05OzvDxMREa+gdULifq6yeP38OSZL0/vy7u7tr2gYAK1aswIcffoidO3eiffv2qFixIvr06YNbt24BEH8MOHDgALp27YrFixfD398flSpVwrvvvqt37hoRUXHhnCsiIpnpW6Pq4MGDiIyMxOHD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RGVF//79cerUKYSFhcHU1FTu5hCRAeOwQCKickLdu+Ln54f09HQcPHgQK1aswLBhwxisiLJJTU3F+fPncebMGezYsQNLly5lsCKiPDFcERGVE1ZWVvjqq68QFhaG1NRUeHl54cMPP8THH38sd9OIDE5UVBQCAgJgZ2eH8ePHY+LEiXI3iYhKAQ4LJCIiIiIiKgIsaEFERERERFQEGK6IiIiIiIiKAMMVERERERFREWBBCz1UKhUiIyNha2urtTo9ERERERGVL5IkISEhAe7u7jAyyr1viuFKj8jISHh6esrdDCIiIiIiMhARERF5Ll3CcKWHra0tAPEG2tnZydwaIiIiIiKSS3x8PDw9PTUZITcMV3qohwLa2dkxXBERERERUb6mC7GgBRERERERURFguCIiIiIiIioCDFdERERERERFgOGKiIiIiIioCDBcERERERERFQFWCyQiIiIiInmkpwORkcD9+2ILD8/8GhEBhIQApqZytzLfGK6IiIiIiKh4JCbqD07qrw8fAipVzuc/fAj4+JRYcwuL4YqIiIiIiApOpQJiYnIOTvfvA8+f530dMzPA0xPw9ga8vLS/OjsX/+soQgxXRERERESkKzVVDM3LKThFRIhj8uLgoD84qb+6uABGZaMUBMMVEREREVF5I0lAbGzOwen+fSA6Ou/rGBkB7u66gUn9vZcXYGdX7C/HUDBcERERERGVNUolEBWVc3AKDwcSEvK+jqWlbmDK+rVy5VJVcKK4yR6uVq1ahS+++AJRUVGoU6cOli1bhjZt2uR4/E8//YTFixfj1q1bsLe3R7du3fDll1/C0dFRc0xQUBBmzZqFO3fuoGrVqvj000/Rt2/fkng5RERERETFLylJBKTsgUn99cEDICMj7+tUqpTzcD0vL8DJCVAoiv/1lBGyhqtt27Zh0qRJWLVqFVq1aoVvv/0W3bt3x7Vr1+Dl5aVz/PHjxzFixAh89dVX6NWrFx4+fIgJEyZg3Lhx2LFjBwDg5MmTGDhwIObPn4++fftix44deP3113H8+HE0b968pF8iEREREVHBSBLw5EnOwen+ffF8XkxMAA8P/cHJ21sUkbCyKv7XU44oJEmS5Lp58+bN4e/vj9WrV2v21apVC3369MHChQt1jv/yyy+xevVq3LlzR7Pv66+/xuLFixEREQEAGDhwIOLj47Fnzx7NMd26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TBk+//xzihUrxvbt2+nfvz9eXl507twZgNDQUEaMGMGUKVNo06YN586ds79namoqbdq04fz58yxcuJCKFSty8OBBHB0d7+SjvbcMSefcuXMGYJw7d87qUNL5738No25dwwDDcHQ0jJAQw0hNtTqq2/j7b8N44QXDsNnMwIsWNYw5cwwjJcXqyERERCQHu3TpknHw4EHj0qVL/xxMTDR/37DikZiY6XuYN2+e4e7ubh8fP37cAIyQkJDbvrZt27bGSy+9ZB83bdrUGDp0qH3s7e1tdO/e3T5OTU01SpQoYYSGhqZ5r7179xqGYRjfffedARjr16+3v2bVqlUGYP+MGzRoYAwaNChNHI0aNTJq166d0Vs2DMMwBg4caHTs2NE+LlWqlDFmzJgbnrtmzRrDwcHBiIqKytR7ZMYNf5b+JzO5gWaucpCNG836qjNnoFgxWLoUmjWzOqpbMAwzyKFDIS7OPNarl9lxo3hxa2MTERGR3MnFxZxBsuq9s4i/v3+acUpKClOmTCEiIoJTp06RlJREUlISrreZKatVq5b939eWH8bHx2f4NV5eXgDEx8dTrlw5oqKiGDhwYJrzH3roITZu3HjLa3700Ud8+umnnDhxgkuXLpGcnGxfShgfH09MTAwtblLfEhkZSZkyZahSpcot3yM7UHKVAxgGzJwJI0dCair4+cEXX0C5clZHdgvHj8PAgfDtt+a4ShX46CNo3tzauERERCR3s9mybGmela5PmqZPn87MmTMJCQmhZs2auLq6MmzYMJKTk295nesbYdhsNlJTUzP8mmudDf/9muu7HRq3qTX7/PPPGT58ONOnTycgIAA3NzfeeecdfvjhByB9A4/r3e757EQNLbK5ixfNmqqXXjITq549ze2fsm1ideUKTJkCvr5mYpU/P4wfb9ZZKbESERERuSNbt26lffv2dO/endq1a1OhQgWOHDly3+OoWrUqu3btSnNsz549t3zN1q1bCQwMZODAgdStW5dKlSpx9OhR+/Nubm6UL1+eDRs23PD1tWrV4vfff+fw4cN3fwP3mGausrmgILOpXr585uzVoEHZeP+q7dvNhhU//2yOmzeH0FCoWtXauERERERyuEqVKrF8+XK2b99OkSJFmDFjBnFxcTx4nxuDDRkyhOeeew5/f38CAwOJiIhg//79VKhQ4aavqVSpEp999hlr1qzB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wDu6VxERyb6UXImISI7n6uqabpne7dhsNgAMw7D/+0bnODs7Z+h6DzzwQLrXpqamAtCmTRtOnDjBqlWrWL9+PS1atGDQoEFMmzYtUzGLiEj2pporERHJ9Xbu3JluXK1aNQCqV69OZGQkFy5csD+/bds2HBwcqFKlCm5ubpQvX54NGzbcVQzFixe3L2EMCQlh9uzZd3U9ERHJfjRzJSIiOV5SUhJxcXFpjuXLl8/eNGLp0qX4+/vz8MMPs2jRInbt2sWcOXMA6NatG2+88Qa9evVi/Pjx/PnnnwwZMoQePXpQsmRJAMaPH8+AAQMoUaIEbdq04fz582zbto0hQ4ZkKL7XX38dPz8/fH19SUpK4uuvv+bBBx/Mwk9ARESyAyVXIiKS43377bd4eXmlOVa1alV+/fVXwOzkFx4ezsCBA/H09GTRokVUr14dABcXF9asWcPQoUOpX78+Li4udOzYkRkzZtiv1atXLy5fvszMmTN5+eWXKVasGJ06dcpwfPnz52f06NH897//xdnZmcaNGxMeHp4Fdy4iItmJugWKiEiuZrPZWLFiBR06dLA6FBERyeVUcyUiIiIiIpIFlFyJiIiIiIhkAdVciYhIrqbV7yIicr9o5kpERERERCQLKLkSERERERHJAkquREREREREsoCSKxERERERkSyg5EpERERERCQLKLkSERERERHJAkquREREREREsoCSKxERERERkSzw//U17mHuMdyUAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "history_dict = history.history\n",
    "print(history_dict.keys())\n",
    "\n",
    "acc = history_dict['binary_accuracy']\n",
    "val_acc = history_dict['val_binary_accuracy']\n",
    "loss = history_dict['loss']\n",
    "val_loss = history_dict['val_loss']\n",
    "\n",
    "epochs = range(1, len(acc) + 1)\n",
    "fig = plt.figure(figsize=(10, 6))\n",
    "fig.tight_layout()\n",
    "\n",
    "plt.subplot(2, 1, 1)\n",
    "# r is for \"solid red line\"\n",
    "plt.plot(epochs, loss, 'r', label='Training loss')\n",
    "# b is for \"solid blue line\"\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "# plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(epochs, acc, 'r', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WzJZCo-cf-Jf"
   },
   "source": [
    "In this plot, the red lines represent the training loss and accuracy, and the blue lines are the validation loss and accuracy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "### Confusion Matrix, precision and recall"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "198/198 [==============================] - 15s 75ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAHFCAYAAADCA+LKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIA0lEQVR4nO3deXgUVdr38V8TQrMYGpLQWSAgICAQZJUQlH0NmygKGI0gGFS2iYBidBDUZwjggsomIosCAo4somJGENkkYY/KMggYtseEzdCQACFAvX/40o9tAp1gFw3x+5mrrss+dfepUz2XcnOfc6oshmEYAgAA8KIi3h4AAAAACQkAAPA6EhIAAOB1JCQAAMDrSEgAAIDXkZAAAACvIyEBAABeR0ICAAC8joQEAAB4HQkJCrUff/xRTz75pCpXrqzixYvrjjvuUIMGDTRhwgT99ttvpl57x44datGihWw2mywWi9555x2PX8NisWjMmDEe79edOXPmyGKxyGKxaM2aNbnOG4ahu+66SxaLRS1btryha0ydOlVz5swp0HfWrFlzzTEBuLUV9fYAALPMmDFDAwcOVI0aNfT888+rVq1aysnJ0datW/X+++8rKSlJS5cuNe36/fr1U1ZWlhYuXKiyZcvqzjvv9Pg1kpKSVKFCBY/3m19+fn6aOXNmrqRj7dq1OnDggPz8/G6476lTpyowMFB9+/bN93caNGigpKQk1apV64avC8A7SEhQKCUlJenZZ59Vu3bttGzZMlmtVue5du3aafjw4UpMTDR1DDt37lRsbKyioqJMu0aTJk1M6zs/evXqpfnz52vKlCkqXbq0s33mzJmKjIzUmTNnbso4cnJyZLFYVLp0aa//JgBuDFM2KJTGjh0ri8WiDz74wCUZuapYsWLq1q2b8/OVK1c0YcIE3X333bJarbLb7XriiSd09OhRl++1bNlS4eHh2rJli5o1a6aSJUuqSpUqGjdunK5cuSLp/6YzLl26pGnTpjmnNiRpzJgxzn/+o6vfOXjwoLNt9erVatmypQICAlSiRAlVrFhRPXr00Llz55wxeU3Z7Ny5Uw888IDKli2r4sWLq169evroo49cYq5ObSxYsEAvv/yyQkNDVbp0abVt21Z79+7N348s6dFHH5UkLViwwNnmcDi0ePFi9evXL8/vvPrqq4qIiJC/v79Kly6tBg0aaObMmfrjez7vvPNO7dq1S2vXrnX+flcrTFfHPnfuXA0fPlzly5eX1WrV/v37c03ZnDx5UmFhYWratKlycnKc/e/evVulSpVSTExMvu8VgLlISFDoXL58WatXr1bDhg0VFhaWr+88++yzGjlypNq1a6fly5fr9ddfV2Jiopo2baqTJ0+6xKanp+uxxx7T448/ruXLlysqKkrx8fGaN2+eJKlz585KSkqSJD388MNKSkpyfs6vgwcPqnPnzipWrJhmzZqlxMREjRs3TqVKldLFixev+b29e/eqadOm2rVrl9577z0tWbJEtWrVUt++fTVhwoRc8S+99JIOHTqkDz/8UB988IH27dunrl276vLly/kaZ+nSpfXwww9r1qxZzrYFCxaoSJEi6tWr1zXv7emnn9ann36qJUuW6KGHHtKQIUP0+uuvO2OWLl2qKlWqqH79+s7f78/Ta/Hx8Tp8+LDef/99ffHFF7Lb7bmuFRgYqIULF2rLli0aOXKkJOncuXN65JFHVLFiRb3//vv5uk8AN4EBFDLp6emGJKN37975it+zZ48hyRg4cKBL+6ZNmwxJxksvveRsa9GihSHJ2LRpk0tsrVq1jA4dOri0STIGDRrk0jZ69Ggjr3/tZs+ebUgyUlNTDcMwjM8++8yQZKSkpFx37JKM0aNHOz/37t3bsFqtxuHDh13ioqKijJIlSxqnT582DMMwvvvuO0OS0alTJ5e4Tz/91JBkJCUlXfe6V8e7ZcsWZ187d+40DMMw7r33XqNv376GYRhG7dq1jRYtWlyzn8uXLxs5OTnGa6+9ZgQEBBhXrlxxnrvWd69er3nz5tc8991337m0jx8/3pBkLF261OjTp49RokQJ48cff7zuPQK4uaiQ4G/vu+++k6RciycbN26smjVr6ttvv3VpDw4OVuPGjV3a7rnnHh06dMhjY6pXr56KFSumAQMG6KOPPtIvv/ySr++tXr1abdq0yVUZ6tu3r86dO5erUvPHaSvp9/uQVKB7adGihapWrapZs2bpp59+0pYtW645XXN1jG3btpXNZpOPj498fX31yiuv6NSpUzp+/Hi+r9ujR498xz7//PPq3LmzHn30UX300UeaNGmS6tSpk+/vAzAfCQkKncDAQJUsWVKpqan5ij916pQkKSQkJNe50NBQ5/mrAgICcsVZrVadP3/+Bkabt6pVq2rVqlWy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mlz9lClT5oauX6JEiQJ/58qVK5J+n7aJiIhwOXd1askwjBsaDwBIJCTATVeqVCnddddd+Ypt0KCB0tPTVbRoUd155515xtSsWVPJycl64oknnG3JycnX7LNatWoqUaKEvv32Wz311FO5zl9dM3L58mVnW1BQkMqXL69ffvlFjz32WJ791qpVS3PnztX58+edSc/1xgEAf8SUDXALa9u2rSIjI9W9e3f95z//0cGDB7Vx40b985//1NatWyVJ//jHPzRr1izNmjVLP//8s0aPHq1du3Zds8/ixYtr5MiReuGFF/Txxx/rwIEDSk5O1syZMyVJdrtdJUqUUGJioo4dOyaHwyHp94etJSQk6N1339XPP/+sn376SbNnz9bbb78tSYqOjlaRIkXUv39/7d69WytWrNCbb75p8i8EoLAgIQFuYRaLRStWrFDz5s3Vr18/Va9eXb1799bBgwcVFBQkSerVq5deeeUVjRw5Ug0bNtShQ4f07LPPXrffUaNGafjw4XrllVdUs2ZN9erVS8ePH5ckFS1aVO+9956mT5+u0NBQPfDAA5Kkp556Sh9++KHmzJmjOnXqqEWLFpozZ45zm/Add9yhL774Qrt371b9+vX18ssva/z48Sb+OgAKE4vBxC8AAPAyKiQAAMDrSEgAAIDXkZAAAACvIyEBAABeR0ICAAC8joQEAAB4HQkJAADwOhISAADgdSQkAADA60hIAACA15GQAAAAryMhAQAAXvf/AJNfy2c8F+r6AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Precision: 0.7963800904977375\n",
      "Recall: 0.7827191867852605\n"
     ]
    }
   ],
   "source": [
    "predictions = classifier_model.predict(test_ds)\n",
    "\n",
    "# Convert predictions to binary values (0 or 1)\n",
    "binary_predictions = np.round(tf.sigmoid(predictions)).astype(int)\n",
    "# Calculate the confusion matrix\n",
    "confusion_matrix = tf.math.confusion_matrix(test_labels, binary_predictions)\n",
    "import seaborn as sns\n",
    "\n",
    "# Print the confusion matrix\n",
    "sns.heatmap(confusion_matrix, annot=True, fmt='d', cmap='Blues')\n",
    "\n",
    "# Add labels and title\n",
    "plt.xlabel('Predicted')\n",
    "plt.ylabel('True')\n",
    "plt.title('Confusion Matrix')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()\n",
    "tp = confusion_matrix[1, 1].numpy().item()\n",
    "fp = confusion_matrix[0, 1].numpy().item()\n",
    "fn = confusion_matrix[1, 0].numpy().item()\n",
    "\n",
    "# Calculate precision and recall\n",
    "precision = tp / (tp + fp)\n",
    "recall = tp / (tp + fn)\n",
    "\n",
    "# Print precision and recall\n",
    "print(\"Precision:\", precision)\n",
    "print(\"Recall:\", recall)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Rtn7jewb6dg4"
   },
   "source": [
    "## Export for inference\n",
    "\n",
    "Now you just save your fine-tuned model for later use."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "id": "ShcvqJAgVera",
    "tags": []
   },
   "outputs": [],
   "source": [
    "model_name = 'bert_model.h5'\n",
    "saved_model_path = './{}'.format(model_name.replace('/', '_'))\n",
    "\n",
    "classifier_model.save(saved_model_path, include_optimizer=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "PbI25bS1vD7s"
   },
   "source": [
    "Let's reload the model, so you can try it side by side with the model that is still in memory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "id": "gUEWVskZjEF0",
    "tags": []
   },
   "outputs": [],
   "source": [
    "reloaded_model = tf.keras.models.load_model(saved_model_path, custom_objects={'KerasLayer':hub.KerasLayer})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "oyTappHTvNCz"
   },
   "source": [
    "Here you can test your model on any sentence you want, just add to the examples variable below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "id": "VBWzH6exlCPS",
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Results from the saved model:\n",
      "input: I like the movie at first but then it was shit : score: 0.120340\n",
      "input: The product is quite good      : score: 0.982096\n",
      "input: I have mixed feelings but i thing it is pretty well overall : score: 0.690494\n",
      "input: At the beggining it felt good but from the 30 minute ahead i hated it : score: 0.121016\n",
      "input: Such a bag of crap             : score: 0.196286\n",
      "input: This is useless                : score: 0.026577\n",
      "\n",
      "Results from the model in memory:\n",
      "input: I like the movie at first but then it was shit : score: 0.120340\n",
      "input: The product is quite good      : score: 0.982096\n",
      "input: I have mixed feelings but i thing it is pretty well overall : score: 0.690494\n",
      "input: At the beggining it felt good but from the 30 minute ahead i hated it : score: 0.121016\n",
      "input: Such a bag of crap             : score: 0.196286\n",
      "input: This is useless                : score: 0.026577\n",
      "\n"
     ]
    }
   ],
   "source": [
    "def print_my_examples(inputs, results):\n",
    "  result_for_printing = \\\n",
    "    [f'input: {inputs[i]:<30} : score: {results[i][0]:.6f}'\n",
    "                         for i in range(len(inputs))]\n",
    "  print(*result_for_printing, sep='\\n')\n",
    "  print()\n",
    "\n",
    "\n",
    "\n",
    "examples = [\n",
    "   \"I like the movie at first but then it was shit\",\n",
    "    \"The product is quite good\",\n",
    "    \"I have mixed feelings but i thing it is pretty well overall\",\n",
    "    \"At the beggining it felt good but from the 30 minute ahead i hated it\",\n",
    "    \"Such a bag of crap\",\n",
    "    \"This is useless\"\n",
    "]\n",
    "\n",
    "reloaded_results = tf.sigmoid(reloaded_model(tf.constant(examples)))\n",
    "original_results = tf.sigmoid(classifier_model(tf.constant(examples)))\n",
    "\n",
    "print('Results from the saved model:')\n",
    "print_my_examples(examples, reloaded_results)\n",
    "print('Results from the model in memory:')\n",
    "print_my_examples(examples, original_results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "name": "classify_text_with_bert.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "conda_tensorflow2_p310",
   "language": "python",
   "name": "conda_tensorflow2_p310"
  },
  "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.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}