sentimentanalyzer01 commited on
Commit
49a0eef
·
verified ·
1 Parent(s): 9ce56d0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -12
app.py CHANGED
@@ -413,29 +413,78 @@ class CascadeEmotionClassifier:
413
  }
414
 
415
  # ============================================================
416
- # ЗАГРУЗКА МОДЕЛИ (с загрузкой сохранённой онтологии)
417
  # ============================================================
418
 
419
  def load_model():
420
  print("Загрузка модели...")
421
  model_dir = 'model'
422
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423
  with open(f'{model_dir}/model_info.json', 'r', encoding='utf-8') as f:
424
  model_info = json.load(f)
425
 
 
426
  with open(f'{model_dir}/vocab.json', 'r', encoding='utf-8') as f:
427
  vocab = json.load(f)
428
 
429
- with open(f'{model_dir}/label_encoder.pkl', 'rb') as f:
430
- label_encoder = pickle.load(f)
 
 
 
 
 
 
 
 
 
 
 
 
 
431
 
432
- # Загружаем сохранённую онтологию
433
  print("📂 Загрузка сохранённой онтологии...")
434
- with open(f'{model_dir}/ontology_model.pkl', 'rb') as f:
435
- ontology_model = pickle.load(f)
436
- print("✅ Онтология загружена")
 
 
 
 
 
 
 
 
 
 
437
 
438
  # LSTM
 
439
  lstm_model = EmotionLSTM(
440
  vocab_size=len(vocab),
441
  embed_dim=model_info.get('embed_dim', 300),
@@ -444,21 +493,39 @@ def load_model():
444
  dropout=0.3,
445
  num_layers=2
446
  )
447
- checkpoint = torch.load(f'{model_dir}/lstm_model.pth', map_location=device, weights_only=False)
448
- lstm_model.load_state_dict(checkpoint['model_state_dict'])
 
 
 
 
 
449
 
450
  # BERT
 
451
  bert_model = EmotionBERT(
452
  bert_model_name=model_info['bert_model_name'],
453
  num_classes=model_info['num_classes'],
454
  dropout=0.3
455
  )
456
- bert_model.load_state_dict(torch.load(f'{model_dir}/bert_model.pth', map_location=device, weights_only=False))
 
 
 
 
 
457
 
458
  # Токенизатор
459
- tokenizer = BertTokenizer.from_pretrained(model_dir)
 
 
 
 
 
 
460
 
461
  # Каскад
 
462
  cascade = CascadeEmotionClassifier(
463
  lstm_model=lstm_model,
464
  bert_model=bert_model,
@@ -472,7 +539,7 @@ def load_model():
472
  max_length_bert=model_info.get('max_length_bert', 128)
473
  )
474
 
475
- print("✅ Модель загружена!")
476
  return cascade, model_info
477
 
478
  # ============================================================
 
413
  }
414
 
415
  # ============================================================
416
+ # ЗАГРУЗКА МОДЕЛИ (с совместимым загрузчиком для numpy)
417
  # ============================================================
418
 
419
  def load_model():
420
  print("Загрузка модели...")
421
  model_dir = 'model'
422
 
423
+ # Создаём совместимый unpickler для numpy
424
+ import numpy as np
425
+
426
+ class NumpyCompatUnpickler(pickle.Unpickler):
427
+ def find_class(self, module, name):
428
+ # Перенаправляем numpy.core на numpy
429
+ if module == 'numpy.core':
430
+ module = 'numpy'
431
+ elif module.startswith('numpy.core.'):
432
+ module = 'numpy.' + module.split('.')[-1]
433
+ try:
434
+ return super().find_class(module, name)
435
+ except (ImportError, AttributeError):
436
+ # Если не нашли, пробуем через __import__
437
+ try:
438
+ mod = __import__(module, fromlist=[name])
439
+ return getattr(mod, name)
440
+ except (ImportError, AttributeError):
441
+ # Последняя попытка: ищем в numpy
442
+ if hasattr(np, name):
443
+ return getattr(np, name)
444
+ raise
445
+
446
+ # Загружаем информацию о модели
447
  with open(f'{model_dir}/model_info.json', 'r', encoding='utf-8') as f:
448
  model_info = json.load(f)
449
 
450
+ # Загружаем vocab
451
  with open(f'{model_dir}/vocab.json', 'r', encoding='utf-8') as f:
452
  vocab = json.load(f)
453
 
454
+ # Загружаем label_encoder с совместимостью
455
+ print("📂 Загрузка label_encoder...")
456
+ try:
457
+ with open(f'{model_dir}/label_encoder.pkl', 'rb') as f:
458
+ label_encoder = pickle.load(f)
459
+ print("✅ label_encoder загружен")
460
+ except Exception as e:
461
+ print(f"⚠️ Ошибка: {e}, пробуем совместимый режим...")
462
+ try:
463
+ with open(f'{model_dir}/label_encoder.pkl', 'rb') as f:
464
+ label_encoder = NumpyCompatUnpickler(f).load()
465
+ print("✅ label_encoder загружен в совместимом режиме")
466
+ except Exception as e2:
467
+ print(f"❌ Не удалось загрузить label_encoder: {e2}")
468
+ raise
469
 
470
+ # Загружаем онтологию с совместимостью
471
  print("📂 Загрузка сохранённой онтологии...")
472
+ try:
473
+ with open(f'{model_dir}/ontology_model.pkl', 'rb') as f:
474
+ ontology_model = pickle.load(f)
475
+ print("✅ Онтология загружена")
476
+ except Exception as e:
477
+ print(f"⚠️ Ошибка загрузки онтологии: {e}, пробуем совместимый режим...")
478
+ try:
479
+ with open(f'{model_dir}/ontology_model.pkl', 'rb') as f:
480
+ ontology_model = NumpyCompatUnpickler(f).load()
481
+ print("✅ Онтология загружена в совместимом режиме")
482
+ except Exception as e2:
483
+ print(f"❌ Не удалось загрузить онтологию: {e2}")
484
+ raise
485
 
486
  # LSTM
487
+ print("📂 Загрузка LSTM...")
488
  lstm_model = EmotionLSTM(
489
  vocab_size=len(vocab),
490
  embed_dim=model_info.get('embed_dim', 300),
 
493
  dropout=0.3,
494
  num_layers=2
495
  )
496
+ try:
497
+ checkpoint = torch.load(f'{model_dir}/lstm_model.pth', map_location=device, weights_only=False)
498
+ lstm_model.load_state_dict(checkpoint['model_state_dict'])
499
+ print("✅ LSTM загружена")
500
+ except Exception as e:
501
+ print(f"❌ Ошибка загрузки LSTM: {e}")
502
+ raise
503
 
504
  # BERT
505
+ print("📂 Загрузка BERT...")
506
  bert_model = EmotionBERT(
507
  bert_model_name=model_info['bert_model_name'],
508
  num_classes=model_info['num_classes'],
509
  dropout=0.3
510
  )
511
+ try:
512
+ bert_model.load_state_dict(torch.load(f'{model_dir}/bert_model.pth', map_location=device, weights_only=False))
513
+ print("✅ BERT загружена")
514
+ except Exception as e:
515
+ print(f"❌ Ошибка загрузки BERT: {e}")
516
+ raise
517
 
518
  # Токенизатор
519
+ print("📂 Загрузка токенизатора...")
520
+ try:
521
+ tokenizer = BertTokenizer.from_pretrained(model_dir)
522
+ print("✅ Токенизатор загружен")
523
+ except Exception as e:
524
+ print(f"❌ Ошибка загрузки токенизатора: {e}")
525
+ raise
526
 
527
  # Каскад
528
+ print("📂 Создание каскадного классификатора...")
529
  cascade = CascadeEmotionClassifier(
530
  lstm_model=lstm_model,
531
  bert_model=bert_model,
 
539
  max_length_bert=model_info.get('max_length_bert', 128)
540
  )
541
 
542
+ print("✅ Модель успешно загружена!")
543
  return cascade, model_info
544
 
545
  # ============================================================