File size: 87,339 Bytes
26290c2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "100\n",
      "200\n",
      "300\n",
      "400\n",
      "500\n",
      "600\n",
      "700\n",
      "800\n",
      "900\n",
      "1000\n",
      "1100\n",
      "1200\n",
      "1300\n",
      "1400\n",
      "1500\n",
      "1600\n",
      "1700\n",
      "1800\n",
      "1900\n",
      "2000\n",
      "2100\n",
      "2200\n",
      "2300\n",
      "2400\n",
      "2500\n",
      "2600\n",
      "2700\n",
      "2800\n",
      "2900\n",
      "3000\n",
      "3100\n",
      "3200\n",
      "3300\n",
      "3400\n",
      "3500\n",
      "3600\n",
      "3700\n",
      "3800\n",
      "3900\n",
      "4000\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[83], line 47\u001b[0m\n\u001b[1;32m     44\u001b[0m     \u001b[38;5;28mprint\u001b[39m(i)\n\u001b[1;32m     45\u001b[0m t\u001b[38;5;241m=\u001b[39mdf\u001b[38;5;241m.\u001b[39miloc[i][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mX\u001b[39m\u001b[38;5;124m'\u001b[39m]\n\u001b[0;32m---> 47\u001b[0m t \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mtokenizer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreturn_tensors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mpt\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43mtruncation\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpadding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mtolist()[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m     48\u001b[0m x\u001b[38;5;241m.\u001b[39mappend(t)\n\u001b[1;32m     49\u001b[0m y\u001b[38;5;241m.\u001b[39mappend(df\u001b[38;5;241m.\u001b[39miloc[i][\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mY\u001b[39m\u001b[38;5;124m'\u001b[39m])\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:1564\u001b[0m, in \u001b[0;36mBertForSequenceClassification.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m   1556\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m   1557\u001b[0m \u001b[38;5;124;03mlabels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):\u001b[39;00m\n\u001b[1;32m   1558\u001b[0m \u001b[38;5;124;03m    Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,\u001b[39;00m\n\u001b[1;32m   1559\u001b[0m \u001b[38;5;124;03m    config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If\u001b[39;00m\n\u001b[1;32m   1560\u001b[0m \u001b[38;5;124;03m    `config.num_labels > 1` a classification loss is computed (Cross-Entropy).\u001b[39;00m\n\u001b[1;32m   1561\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m   1562\u001b[0m return_dict \u001b[38;5;241m=\u001b[39m return_dict \u001b[38;5;28;01mif\u001b[39;00m return_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39muse_return_dict\n\u001b[0;32m-> 1564\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbert\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1565\u001b[0m \u001b[43m    \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1566\u001b[0m \u001b[43m    \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1567\u001b[0m \u001b[43m    \u001b[49m\u001b[43mtoken_type_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoken_type_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1568\u001b[0m \u001b[43m    \u001b[49m\u001b[43mposition_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1569\u001b[0m \u001b[43m    \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1570\u001b[0m \u001b[43m    \u001b[49m\u001b[43minputs_embeds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs_embeds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1571\u001b[0m \u001b[43m    \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1572\u001b[0m \u001b[43m    \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1573\u001b[0m \u001b[43m    \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1574\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1576\u001b[0m pooled_output \u001b[38;5;241m=\u001b[39m outputs[\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m   1578\u001b[0m pooled_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout(pooled_output)\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:1013\u001b[0m, in \u001b[0;36mBertModel.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, encoder_hidden_states, encoder_attention_mask, past_key_values, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m   1004\u001b[0m head_mask \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_head_mask(head_mask, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mnum_hidden_layers)\n\u001b[1;32m   1006\u001b[0m embedding_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39membeddings(\n\u001b[1;32m   1007\u001b[0m     input_ids\u001b[38;5;241m=\u001b[39minput_ids,\n\u001b[1;32m   1008\u001b[0m     position_ids\u001b[38;5;241m=\u001b[39mposition_ids,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m   1011\u001b[0m     past_key_values_length\u001b[38;5;241m=\u001b[39mpast_key_values_length,\n\u001b[1;32m   1012\u001b[0m )\n\u001b[0;32m-> 1013\u001b[0m encoder_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m   1014\u001b[0m \u001b[43m    \u001b[49m\u001b[43membedding_output\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1015\u001b[0m \u001b[43m    \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextended_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1016\u001b[0m \u001b[43m    \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1017\u001b[0m \u001b[43m    \u001b[49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1018\u001b[0m \u001b[43m    \u001b[49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_extended_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1019\u001b[0m \u001b[43m    \u001b[49m\u001b[43mpast_key_values\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_values\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1020\u001b[0m \u001b[43m    \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1021\u001b[0m \u001b[43m    \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1022\u001b[0m \u001b[43m    \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1023\u001b[0m \u001b[43m    \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m   1024\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1025\u001b[0m sequence_output \u001b[38;5;241m=\u001b[39m encoder_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m   1026\u001b[0m pooled_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpooler(sequence_output) \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpooler \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:607\u001b[0m, in \u001b[0;36mBertEncoder.forward\u001b[0;34m(self, hidden_states, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, past_key_values, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m    596\u001b[0m     layer_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_gradient_checkpointing_func(\n\u001b[1;32m    597\u001b[0m         layer_module\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__call__\u001b[39m,\n\u001b[1;32m    598\u001b[0m         hidden_states,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    604\u001b[0m         output_attentions,\n\u001b[1;32m    605\u001b[0m     )\n\u001b[1;32m    606\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 607\u001b[0m     layer_outputs \u001b[38;5;241m=\u001b[39m \u001b[43mlayer_module\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    608\u001b[0m \u001b[43m        \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    609\u001b[0m \u001b[43m        \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    610\u001b[0m \u001b[43m        \u001b[49m\u001b[43mlayer_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    611\u001b[0m \u001b[43m        \u001b[49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    612\u001b[0m \u001b[43m        \u001b[49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    613\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    614\u001b[0m \u001b[43m        \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    615\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    617\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m layer_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m    618\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_cache:\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:497\u001b[0m, in \u001b[0;36mBertLayer.forward\u001b[0;34m(self, hidden_states, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, past_key_value, output_attentions)\u001b[0m\n\u001b[1;32m    485\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\n\u001b[1;32m    486\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    487\u001b[0m     hidden_states: torch\u001b[38;5;241m.\u001b[39mTensor,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    494\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[torch\u001b[38;5;241m.\u001b[39mTensor]:\n\u001b[1;32m    495\u001b[0m     \u001b[38;5;66;03m# decoder uni-directional self-attention cached key/values tuple is at positions 1,2\u001b[39;00m\n\u001b[1;32m    496\u001b[0m     self_attn_past_key_value \u001b[38;5;241m=\u001b[39m past_key_value[:\u001b[38;5;241m2\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m past_key_value \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 497\u001b[0m     self_attention_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattention\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    498\u001b[0m \u001b[43m        \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    499\u001b[0m \u001b[43m        \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    500\u001b[0m \u001b[43m        \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    501\u001b[0m \u001b[43m        \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    502\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mself_attn_past_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    503\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    504\u001b[0m     attention_output \u001b[38;5;241m=\u001b[39m self_attention_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m    506\u001b[0m     \u001b[38;5;66;03m# if decoder, the last output is tuple of self-attn cache\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:427\u001b[0m, in \u001b[0;36mBertAttention.forward\u001b[0;34m(self, hidden_states, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, past_key_value, output_attentions)\u001b[0m\n\u001b[1;32m    417\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\n\u001b[1;32m    418\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    419\u001b[0m     hidden_states: torch\u001b[38;5;241m.\u001b[39mTensor,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    425\u001b[0m     output_attentions: Optional[\u001b[38;5;28mbool\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m    426\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[torch\u001b[38;5;241m.\u001b[39mTensor]:\n\u001b[0;32m--> 427\u001b[0m     self_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mself\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    428\u001b[0m \u001b[43m        \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    429\u001b[0m \u001b[43m        \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    430\u001b[0m \u001b[43m        \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    431\u001b[0m \u001b[43m        \u001b[49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    432\u001b[0m \u001b[43m        \u001b[49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    433\u001b[0m \u001b[43m        \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    434\u001b[0m \u001b[43m        \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    435\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    436\u001b[0m     attention_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moutput(self_outputs[\u001b[38;5;241m0\u001b[39m], hidden_states)\n\u001b[1;32m    437\u001b[0m     outputs \u001b[38;5;241m=\u001b[39m (attention_output,) \u001b[38;5;241m+\u001b[39m self_outputs[\u001b[38;5;241m1\u001b[39m:]  \u001b[38;5;66;03m# add attentions if we output them\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1511\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1509\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compiled_call_impl(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)  \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m   1510\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1511\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_impl\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/modules/module.py:1520\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1515\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m   1516\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m   1517\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m   1518\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m   1519\u001b[0m         \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1520\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1522\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m   1523\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/transformers/models/bert/modeling_bert.py:355\u001b[0m, in \u001b[0;36mBertSelfAttention.forward\u001b[0;34m(self, hidden_states, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask, past_key_value, output_attentions)\u001b[0m\n\u001b[1;32m    352\u001b[0m     attention_scores \u001b[38;5;241m=\u001b[39m attention_scores \u001b[38;5;241m+\u001b[39m attention_mask\n\u001b[1;32m    354\u001b[0m \u001b[38;5;66;03m# Normalize the attention scores to probabilities.\u001b[39;00m\n\u001b[0;32m--> 355\u001b[0m attention_probs \u001b[38;5;241m=\u001b[39m \u001b[43mnn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfunctional\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mattention_scores\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdim\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m    357\u001b[0m \u001b[38;5;66;03m# This is actually dropping out entire tokens to attend to, which might\u001b[39;00m\n\u001b[1;32m    358\u001b[0m \u001b[38;5;66;03m# seem a bit unusual, but is taken from the original Transformer paper.\u001b[39;00m\n\u001b[1;32m    359\u001b[0m attention_probs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout(attention_probs)\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/torch/nn/functional.py:1858\u001b[0m, in \u001b[0;36msoftmax\u001b[0;34m(input, dim, _stacklevel, dtype)\u001b[0m\n\u001b[1;32m   1856\u001b[0m     dim \u001b[38;5;241m=\u001b[39m _get_softmax_dim(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msoftmax\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39mdim(), _stacklevel)\n\u001b[1;32m   1857\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m dtype \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1858\u001b[0m     ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43minput\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msoftmax\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdim\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1859\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m   1860\u001b[0m     ret \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m.\u001b[39msoftmax(dim, dtype\u001b[38;5;241m=\u001b[39mdtype)\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import json\n",
    "import catboost\n",
    "from sklearn.calibration import LabelEncoder\n",
    "from sklearn.model_selection import train_test_split\n",
    "import torch\n",
    "from transformers import AutoTokenizer, AutoModel\n",
    "import torch.nn as nn\n",
    "\n",
    "\n",
    "if not 'data' in globals():\n",
    "    with open('kinopoisk.jsonl', 'r') as json_file:\n",
    "        data = []\n",
    "        for line in json_file:\n",
    "            data.append(json.loads(line))\n",
    "\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "\n",
    "\n",
    "\n",
    "df = pd.DataFrame(data)\n",
    "df['X'] = df['content']\n",
    "encode={\"Good\":2,\"Bad\":0,\"Neutral\":1}\n",
    "df['Y'] = df['grade3'].map(encode)\n",
    "\n",
    "\n",
    "import torch\n",
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "from catboost import CatBoostClassifier\n",
    "import torch.nn as nn\n",
    "\n",
    "model_checkpoint = 'cointegrated/rubert-tiny-toxicity'\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)\n",
    "model = AutoModelForSequenceClassification.from_pretrained(model_checkpoint)\n",
    "model.classifier=nn.Dropout(0)\n",
    "model.dropout = nn.Dropout(0)\n",
    "\n",
    "x,y=[],[]\n",
    "# if 'train_X' not in globals():\n",
    "for i in range(len(df)):\n",
    "    if i%100==0:\n",
    "        print(i)\n",
    "    t=df.iloc[i]['X']\n",
    "\n",
    "    t = model(**tokenizer(t, return_tensors='pt',truncation=True, padding=True))[0].tolist()[0]\n",
    "    x.append(t)\n",
    "    y.append(df.iloc[i]['Y'])\n",
    "        \n",
    "x = np.array(x)\n",
    "y = np.array(y)\n",
    "\n",
    "\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)\n",
    "\n",
    "from sklearn.utils.class_weight import compute_class_weight\n",
    "classes = np.unique(y)\n",
    "weights = compute_class_weight(class_weight='balanced', classes=classes, y=y)\n",
    "catboost = CatBoostClassifier( eval_metric='Accuracy',class_weights=weights)\n",
    "catboost.fit(X_train , y_train, verbose=False,plot =True,eval_set=( X_test, y_test))\n",
    "\n",
    "catboost.save_model('filmreview.cbm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "ename": "CatBoostError",
     "evalue": "/src/catboost/catboost/libs/model/model_import_interface.h:19: Model file doesn't exist: catboost_model.cbm",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mCatBoostError\u001b[0m                             Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[81], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m catboost_model \u001b[38;5;241m=\u001b[39m catboost\u001b[38;5;241m.\u001b[39mCatBoostClassifier(random_seed\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m,eval_metric\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAccuracy\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m \u001b[43mcatboost_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_model\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcatboost_model.cbm\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/catboost/core.py:3424\u001b[0m, in \u001b[0;36mCatBoost.load_model\u001b[0;34m(self, fname, format, stream, blob)\u001b[0m\n\u001b[1;32m   3421\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m CatBoostError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mExactly one of fname/stream/blob arguments mustn\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt be None\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m   3423\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 3424\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_load_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m   3425\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m stream \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m   3426\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_load_from_stream(stream)\n",
      "File \u001b[0;32m~/anaconda3/envs/cv/lib/python3.12/site-packages/catboost/core.py:1899\u001b[0m, in \u001b[0;36m_CatBoostBase._load_model\u001b[0;34m(self, model_file, format)\u001b[0m\n\u001b[1;32m   1897\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m CatBoostError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid fname type=\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m: must be str() or pathlib.Path().\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mtype\u001b[39m(model_file)))\n\u001b[1;32m   1898\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_init_params \u001b[38;5;241m=\u001b[39m {}\n\u001b[0;32m-> 1899\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_object\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_load_model\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel_file\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mformat\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m   1900\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_set_trained_model_attributes()\n\u001b[1;32m   1901\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, value \u001b[38;5;129;01min\u001b[39;00m iteritems(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_params()):\n",
      "File \u001b[0;32m_catboost.pyx:5202\u001b[0m, in \u001b[0;36m_catboost._CatBoost._load_model\u001b[0;34m()\u001b[0m\n",
      "File \u001b[0;32m_catboost.pyx:5205\u001b[0m, in \u001b[0;36m_catboost._CatBoost._load_model\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mCatBoostError\u001b[0m: /src/catboost/catboost/libs/model/model_import_interface.h:19: Model file doesn't exist: catboost_model.cbm"
     ]
    }
   ],
   "source": [
    "catboost_model = catboost.CatBoostClassifier(random_seed=42,eval_metric='Accuracy')\n",
    "catboost_model.load_model(\"catboost_kino.cbm\")\n",
    "tokenizer = AutoTokenizer.from_pretrained(\"cointegrated/rubert-tiny2\")\n",
    "model = AutoModel.from_pretrained(\"cointegrated/rubert-tiny2\")\n",
    "def embed_bert_cls(text, model, tokenizer):\n",
    "    t = tokenizer(text, padding=True, truncation=True, return_tensors='pt')\n",
    "    with torch.no_grad():\n",
    "        model_output = model(**{k: v.to(model.device) for k, v in t.items()})\n",
    "    embeddings = model_output.last_hidden_state[:, 0, :]\n",
    "    embeddings = torch.nn.functional.normalize(embeddings)\n",
    "    return embeddings[0].cpu().numpy()\n",
    "\n",
    "\n",
    "def predict(text):\n",
    "    embeddings = embed_bert_cls(text, model, tokenizer)\n",
    "    return catboost_model.predict_proba(embeddings.reshape(1, -1))[0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.int64"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataiter = iter(train_loader)\n",
    "sample_x, sample_y = next(dataiter)\n",
    "sample_y.dtype  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([2, 2, 2, 1, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2,\n",
       "        2, 2, 2, 2, 2, 2, 2, 2])"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from ast import mod\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "df = pd.read_csv('toxic.csv')\n",
    "\n",
    "x,y=[],[]\n",
    "\n",
    "if 'train_X' not in globals():\n",
    "    for i in range(len(df)):\n",
    "        if i%100==0:\n",
    "            print(i)\n",
    "        t=df.iloc[i]['comment']\n",
    "\n",
    "        t = model(**tokenizer(t, return_tensors='pt',truncation=True, padding=True))[0].tolist()[0]\n",
    "        x.append(t)\n",
    "        y.append(df.iloc[i]['toxic'])\n",
    "x = np.array(x)\n",
    "y = np.array(y)\n",
    "\n",
    "train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=42)\n",
    "from sklearn.utils.class_weight import compute_class_weight\n",
    "classes = np.unique(y)\n",
    "weights = compute_class_weight(class_weight='balanced', classes=classes, y=y)\n",
    "\n",
    "\n",
    "catboost = CatBoostClassifier( eval_metric='Accuracy',class_weights=weights)\n",
    "catboost.fit(train_X, train_y, verbose=False,plot =True,eval_set=(test_X, test_y))\n",
    "\n",
    "#save\n",
    "torch.save(catboost.state_dict(), 'model.pt')\n",
    "\n",
    "\n",
    "import torch\n",
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "from catboost import CatBoostClassifier\n",
    "import torch.nn as nn\n",
    "catboost_model = catboost.CatBoostClassifier(random_seed=42,eval_metric='Accuracy')\n",
    "catboost_model.load_model(\"catboost_model.cbm\")\n",
    "model_checkpoint = 'cointegrated/rubert-tiny-toxicity'\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)\n",
    "model = AutoModelForSequenceClassification.from_pretrained(model_checkpoint)\n",
    "model.classifier=nn.Dropout(0)\n",
    "model.dropout = nn.Dropout(0)\n",
    "\n",
    "def predict(text):\n",
    "    t=tokenizer(text, return_tensors='pt',truncation=True, padding=True)\n",
    "    t = model(**t)[0].tolist()[0]\n",
    "    return t\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.float32"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model(sample_x).dtype  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.0038, -0.0042, -0.1281]], grad_fn=<AddmmBackward0>)"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model(t['input_ids'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "36c96d4a680b45329f6f5536ad04e38f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer_config.json:   0%|          | 0.00/377 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b20871e0bbeb4f249f96f8b678933712",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "vocab.txt:   0%|          | 0.00/241k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4fb9a55a45e04386aa1cfacc53b84bd6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "tokenizer.json:   0%|          | 0.00/468k [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "37920dd7d41f4f19804848fcf1431b06",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "special_tokens_map.json:   0%|          | 0.00/112 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1200fc72cc22450d960480fa65e15234",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "config.json:   0%|          | 0.00/957 [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7231e2ea8f6f469992d3d47d37e61c9a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "model.safetensors:   0%|          | 0.00/47.2M [00:00<?, ?B/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ast import mod\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "df = pd.read_csv('toxic.csv')\n",
    "\n",
    "x,y=[],[]\n",
    "\n",
    "if 'train_X' not in globals():\n",
    "    for i in range(len(df)):\n",
    "        if i%100==0:\n",
    "            print(i)\n",
    "        t=df.iloc[i]['comment']\n",
    "\n",
    "        t = model(**tokenizer(t, return_tensors='pt',truncation=True, padding=True))[0].tolist()[0]\n",
    "        x.append(t)\n",
    "        y.append(df.iloc[i]['toxic'])\n",
    "x = np.array(x)\n",
    "y = np.array(y)\n",
    "\n",
    "train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=42)\n",
    "from sklearn.utils.class_weight import compute_class_weight\n",
    "classes = np.unique(y)\n",
    "weights = compute_class_weight(class_weight='balanced', classes=classes, y=y)\n",
    "catboost = CatBoostClassifier( eval_metric='Accuracy',class_weights=weights)\n",
    "catboost.fit(train_X, train_y, verbose=False,plot =True,eval_set=(test_X, test_y))\n",
    "\n",
    "#save\n",
    "torch.save(catboost.state_dict(), 'model.pt')\n",
    "\n",
    "\n",
    "import torch\n",
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "from catboost import CatBoostClassifier\n",
    "import torch.nn as nn\n",
    "catboost_model = catboost.CatBoostClassifier(random_seed=42,eval_metric='Accuracy')\n",
    "catboost_model.load_model(\"catboost_model.cbm\")\n",
    "model_checkpoint = 'cointegrated/rubert-tiny-toxicity'\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)\n",
    "model = AutoModelForSequenceClassification.from_pretrained(model_checkpoint)\n",
    "model.classifier=nn.Dropout(0)\n",
    "model.dropout = nn.Dropout(0)\n",
    "\n",
    "def predict(text):\n",
    "    t=tokenizer(text, return_tensors='pt',truncation=True, padding=True)\n",
    "    t = model(**t)[0].tolist()[0]\n",
    "    return t\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "catboost.save_model('dont_be_toxic.cbm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.04576194, 0.95423806])"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from transformers import AutoTokenizer, AutoModelForSequenceClassification\n",
    "from catboost import CatBoostClassifier\n",
    "import torch.nn as nn\n",
    "\n",
    "catboost_model = CatBoostClassifier(random_seed=42,eval_metric='Accuracy')\n",
    "catboost_model.load_model(\"../anti_toxic/dont_be_toxic.cbm\")\n",
    "model_checkpoint = 'cointegrated/rubert-tiny-toxicity'\n",
    "tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)\n",
    "model = AutoModelForSequenceClassification.from_pretrained(model_checkpoint)\n",
    "model.classifier=nn.Dropout(0)\n",
    "model.dropout = nn.Dropout(0)\n",
    "\n",
    "def predict(text):\n",
    "    t=tokenizer(text, return_tensors='pt',truncation=True, padding=True)\n",
    "    t = model(**t)[0].tolist()[0]\n",
    "    return catboost_model.predict_proba(t)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "ename": "IndexError",
     "evalue": "invalid index to scalar variable.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[43], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mpredict\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mмяу\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
      "Cell \u001b[0;32mIn[42], line 17\u001b[0m, in \u001b[0;36mpredict\u001b[0;34m(text)\u001b[0m\n\u001b[1;32m     15\u001b[0m t\u001b[38;5;241m=\u001b[39mtokenizer(text, return_tensors\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpt\u001b[39m\u001b[38;5;124m'\u001b[39m,truncation\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, padding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m     16\u001b[0m t \u001b[38;5;241m=\u001b[39m model(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mt)[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mtolist()[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m---> 17\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcatboost_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpredict_proba\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\n",
      "\u001b[0;31mIndexError\u001b[0m: invalid index to scalar variable."
     ]
    }
   ],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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dU2fPl2PP/64vLy8NGjQIC1fvlw+Pj5at26d6tatq7Jly6pPnz66ePGiYmJiVL16dfn6+mr48OHKzc21jLVixQo1b95c5cuXV2BgoPr166e0tDSbPT/gjAIDAy2Ht7e3TCaT5bO/v7/mzp2r22+/XW5ubmrcuLE2bNggSTKbzQoNDVVYWJiu7VB35swZ3X777Zo8ebKkgqe2t23bpvbt26ts2bLy9fVVWFhYsf7HK4D8SCRxU5QqVUqvvvqqFi1apN9//z3f+eTkZPXt21fh4eHas2ePpkyZokmTJmn58uVW/WbPnq1GjRrp+++/16RJkyRJFy9e1MKFC/XBBx9ow4YN2rx5sx588EF9+eWX+vLLL7VixQotWbJEH3/8sWWcnJwcTZ8+XT/88INiY2N15MgRDRgwwJZfAYC/WLBggebMmaPZs2dr9+7dCgsL0wMPPKADBw7IZDIpJiZGSUlJWrhwoSRpyJAhuu222yyJ5N+lpKSoY8eOCg4OVmJiorZu3aru3btb/QckABswAzYWERFh7tGjh9lsNptbtmxpfvLJJ81ms9m8Zs0a87X/C/br18983333WV03duxYc3BwsOVztWrVzD179rTqs2zZMrMk88GDBy1tgwcPNpctW9Z84cIFS1tYWJh58ODB140xKSnJLMlyzddff22WZD579mzRHxhAPsuWLTN7e3tbPgcFBZlfeeUVqz533323+ZlnnrF8Xr16tdnd3d08YcIEs6enp/mXX36xnPv7n9FHHnnE3KpVK5s+A4D8qEjippo5c6ZiYmK0b98+q/Z9+/apVatWVm2tWrXSgQMHrCoKzZs3zzdm2bJlVatWLcvngIAAVa9eXeXKlbNq++vUdXJysrp3766qVauqfPnyateunSTp2LFj/+4BAdxQenq6jh8/XuCf+b/+s+Ghhx7Sgw8+qBkzZmj27NmqU6fOdce8VpEEcHORSOKmatu2rcLCwjRx4kRD13t6euZrK1OmjNVnk8lUYFteXp4kKTMzU2FhYfLy8tLKlSuVlJSkNWvWSOIFHsCRXLx4UcnJySpVqpQOHDjwj309PDxuUlQA/opEEjfdjBkztHbtWiUmJlra6tevr23btln127Ztm+644w6VKlWqWO//888/688//9SMGTPUpk0b1atXjxdtgJvIy8tLQUFBBf6ZDw4OtnweM2aMXFxctH79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",
      "text/plain": [
       "<Figure size 800x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Weighted F1-score: 0.8761177534326371\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      Normal       0.88      0.93      0.91      1847\n",
      "       Toxic       0.86      0.78      0.82      1036\n",
      "\n",
      "    accuracy                           0.88      2883\n",
      "   macro avg       0.87      0.86      0.86      2883\n",
      "weighted avg       0.88      0.88      0.88      2883\n",
      "\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import torch\n",
    "\n",
    "\n",
    "\n",
    "def ultrareport(all_preds, all_targets,classes):\n",
    "    import matplotlib.pyplot as plt\n",
    "    import seaborn as sns\n",
    "    from sklearn.metrics import confusion_matrix, classification_report, f1_score\n",
    "\n",
    "    def plot_confusion_matrix(y_true, y_pred, classes):\n",
    "        cm = confusion_matrix(y_true, y_pred)\n",
    "        plt.figure(figsize=(8, 6))\n",
    "        sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\", xticklabels=classes, yticklabels=classes)\n",
    "        plt.xlabel('Predicted')\n",
    "        plt.ylabel('Actual')\n",
    "        plt.title('Confusion Matrix')\n",
    "        plt.show()\n",
    "\n",
    "\n",
    "    plot_confusion_matrix(all_targets, all_preds, classes)\n",
    "\n",
    "    f1 = f1_score(all_targets, all_preds, average='weighted')\n",
    "    report = classification_report(all_targets, all_preds, target_names=classes)\n",
    "    print(\"Weighted F1-score:\", f1)\n",
    "    print(\"Classification Report:\")\n",
    "    print(report)\n",
    "\n",
    "classes = [\"Normal\", \"Toxic\"]\n",
    "all_preds, all_targets = test_y, catboost.predict(test_X)\n",
    "ultrareport(all_preds, all_targets,classes)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.        , 0.55555556])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    14412.000000\n",
       "mean         0.334860\n",
       "std          0.471958\n",
       "min          0.000000\n",
       "25%          0.000000\n",
       "50%          0.000000\n",
       "75%          1.000000\n",
       "max          1.000000\n",
       "Name: toxic, dtype: float64"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['toxic'].describe()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "cv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}