TFCamemBERT 模型训练但测试没有结果

2023-12-26

目前我正在使用 Camembert 进行医学领域的命名实体识别,精确地使用以下模型:TF卡芒贝尔 https://huggingface.co/jplu/tf-camembert-base.

然而,我在对任务模型进行微调时遇到了一些问题,因为我使用的私有数据集在 Hugging Face 上不可用。

数据分为文本文件和注释文件。该文本文件包含例如:

Le cas présenté concerne un homme âgé de 61 ans (71 kg, 172 cm, soit un indice de masse corporelle de 23,9 kg/m²) admissible à une transplantation pulmonaire en raison d’une insuffisance respiratoire chronique terminale sur emphysème post-tabagique, sous oxygénothérapie continue (1 L/min) et ventilation non invasive nocturne. Il présente, comme principaux antécédents, une dyslipidémie, une hypertension artérielle et un tabagisme sevré estimé à 21 paquets-années (facteurs de risque cardiovasculaires). Le bilan préopératoire a révélé une hypertension artérielle pulmonaire essentiellement postcapillaire conduisant à l’ajout du périndopril (2 mg par jour) et du furosémide (40 mg par jour). La mise en évidence d’un Elispot (enzyme-linked immunospot) positif pour la tuberculose a motivé l’introduction d’un traitement prophylactique par l’association rifampicine-isoniazide (600-300 mg par jour) pour une durée de trois mois.
Deux mois après le bilan préopératoire, le patient a bénéficié d’une transplantation mono-pulmonaire gauche sans dysfonction primaire du greffon5,6. Le donneur et le receveur présentaient tous deux un statut sérologique positif pour cytomegalovirus (CMV) et Epstein Barr Virus (EBV). Une sérologie positive de la toxoplasmose a été mise en évidence uniquement chez le receveur. Le traitement immunosuppresseur d’induction associait la méthylprednisolone (500 mg à jour 0 et 375 mg à jour +1 post-transplantation) et le basiliximab, anticorps monoclonal dirigé contre l’interleukine-2 (20 mg à jour 0 et jour +4 posttransplantation). À partir de jour +2 post-transplantation, l’immunosuppression a été maintenue par une trithérapie par voie orale comprenant le tacrolimus à une posologie initiale de 5 mg par jour, le mofétil mycophénolate (MMF) 2000 mg par jour et la prednisone 20 mg par jour. Les traitements associés sont présentés dans le tableau I.
L’évolution est marquée par la survenue, au jour +5 posttransplantation, d’une dégradation respiratoire sur œdème pulmonaire gauche de reperfusion, avec possible participation cardiogénique. Le rejet aigu de grade III, évoqué par la présence d’infiltrats lymphocytaires aux biopsies transbronchiques, a été confirmé par l’anatomopathologie.

虽然注释文件如下所示:

T1 genre 28 33 homme
T2 age 41 47 61 ans
A1 genre T1 masculin
T3 origine 127 326 une transplantation pulmonaire en raison d’une insuffisance respiratoire chronique terminale sur emphysème post-tabagique, sous oxygénothérapie continue (1 L/min) et ventilation non invasive nocturne
T4 issue 1962 2104 une dégradation respiratoire sur œdème pulmonaire gauche de reperfusion, avec possible participation cardiogénique. Le rejet aigu de grade III
A2 issue T4 détérioration

关于先入为主的更多细节the data https://drive.google.com/file/d/1Odq6eTexLg9ZXCjbWbnZiWMGAqg9Ut45/view?usp=sharing可以在这个找到notebook https://colab.research.google.com/drive/1oqCRFFvzSjDBpfCk5nS2KjBvzCr34Rqz?usp=sharing.

问题是,一旦我完成训练,我尝试在测试数据上运行模型,但它根本不起作用。我无法弄清楚问题出在哪里,因为训练数据和测试数据具有相同的格式。

from datasets import load_metric
import numpy as np

metric = load_metric("seqeval")

def evaluate(model, dataset, ner_labels):
  all_predictions = []
  all_labels = []
  for batch in dataset:
    logits = model.predict(batch)["logits"]
    labels = batch["labels"]
    predictions = np.argmax(logits, axis = -1)
    for prediction, label in zip(predictions, labels):
      for predicted_idx, label_idx in zip(prediction, label):
        if label_idx == -100:
          continue
        all_predictions.append(ner_labels[predicted_idx])
        all_labels.append(ner_labels[label_idx])
  return metric.compute(predictions=[all_predictions], references=[all_labels])

results = evaluate(model, test_dataset, ner_labels=list(model.config.id2label.values()))
results
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-40-d7e10156347b> in <module>()
     31   return metric.compute(predictions=[all_predictions], references=[all_labels])
     32 
---> 33 results = evaluate(model, test_dataset, ner_labels=list(model.config.id2label.values()))

2 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in autograph_handler(*args, **kwargs)
   1127           except Exception as e:  # pylint:disable=broad-except
   1128             if hasattr(e, "ag_error_metadata"):
-> 1129               raise e.ag_error_metadata.to_exception(e)
   1130             else:
   1131               raise

ValueError: in user code:

    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1621, in predict_function  *
        return step_function(self, iterator)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1611, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1604, in run_step  **
        outputs = model.predict_step(data)
    File "/usr/local/lib/python3.7/dist-packages/keras/engine/training.py", line 1572, in predict_step
        return self(x, training=False)
    File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None

    ValueError: Exception encountered when calling layer "tf_camembert_for_token_classification" (type TFCamembertForTokenClassification).
    
    in user code:
    
        File "/usr/local/lib/python3.7/dist-packages/transformers/models/roberta/modeling_tf_roberta.py", line 1681, in call  *
            outputs = self.roberta(
        File "/usr/local/lib/python3.7/dist-packages/keras/utils/traceback_utils.py", line 67, in error_handler  **
            raise e.with_traceback(filtered_tb) from None
    
        ValueError: Exception encountered when calling layer "roberta" (type TFRobertaMainLayer).
        
        in user code:
        
            File "/usr/local/lib/python3.7/dist-packages/transformers/models/roberta/modeling_tf_roberta.py", line 660, in call  *
                batch_size, seq_length = input_shape
        
            ValueError: not enough values to unpack (expected 2, got 1)
        
        
        Call arguments received:
          • input_ids=tf.Tensor(shape=(32,), dtype=int32)
          • attention_mask=tf.Tensor(shape=(32,), dtype=int32)
          • token_type_ids=None
          • position_ids=None
          • head_mask=None
          • inputs_embeds=None
          • encoder_hidden_states=None
          • encoder_attention_mask=None
          • past_key_values=None
          • use_cache=None
          • output_attentions=False
          • output_hidden_states=False
          • return_dict=True
          • training=False
          • kwargs=<class 'inspect._empty'>
    
    
    Call arguments received:
      • input_ids={'input_ids': 'tf.Tensor(shape=(32,), dtype=int32)', 'attention_mask': 'tf.Tensor(shape=(32,), dtype=int32)', 'labels': 'tf.Tensor(shape=(32,), dtype=int32)'}
      • attention_mask=None
      • token_type_ids=None
      • position_ids=None
      • head_mask=None
      • inputs_embeds=None
      • output_attentions=None
      • output_hidden_states=None
      • return_dict=None
      • labels=None
      • training=False
      • kwargs=<class 'inspect._empty'>

当测试起作用时,model.predict()正常接受数据批次,但尽管训练阶段的内部损失在减少,结果却全部为0。

{'age': {'f1': 0.0, 'number': 145, 'precision': 0.0, 'recall': 0.0},
 'anatomie': {'f1': 0.0, 'number': 952, 'precision': 0.0, 'recall': 0.0},
 'date': {'f1': 0.0, 'number': 15, 'precision': 0.0, 'recall': 0.0},
 'dose': {'f1': 0.0, 'number': 27, 'precision': 0.0, 'recall': 0.0},
 'duree': {'f1': 0.0, 'number': 2, 'precision': 0.0, 'recall': 0.0},
 'examen': {'f1': 0.0, 'number': 553, 'precision': 0.0, 'recall': 0.0},
 'frequence': {'f1': 0.0, 'number': 8, 'precision': 0.0, 'recall': 0.0},
 'genre': {'f1': 0.0, 'number': 146, 'precision': 0.0, 'recall': 0.0},
 'mode': {'f1': 0.0, 'number': 79, 'precision': 0.0, 'recall': 0.0},
 'moment': {'f1': 0.0, 'number': 23, 'precision': 0.0, 'recall': 0.0},
 'origine': {'f1': 0.0, 'number': 11, 'precision': 0.0, 'recall': 0.0},
 'overall_accuracy': 0.9089205003328545,
 'overall_f1': 0.0,
 'overall_precision': 0.0,
 'overall_recall': 0.0,
 'pathologie': {'f1': 0.0, 'number': 162, 'precision': 0.0, 'recall': 0.0},
 'sosy': {'f1': 0.0, 'number': 439, 'precision': 0.0, 'recall': 0.0},
 'substance': {'f1': 0.0, 'number': 633, 'precision': 0.0, 'recall': 0.0},
 'traitement': {'f1': 0.0, 'number': 205, 'precision': 0.0, 'recall': 0.0},
 'valeur': {'f1': 0.0, 'number': 192, 'precision': 0.0, 'recall': 0.0}}

有解决这个梯度问题的线索吗?提前致谢!


我首先会在单个句子上验证模型在训练后是否给出合理的预测,如下所示:

from transformers import BertTokenizer, TFBertForTokenClassification
import numpy as np

tokenizer = BertTokenizer.from_pretrained("jplu/tf-camembert-base")
model = TFBertForTokenClassification.from_pretrained("path_to_your_model_weights_and_config_json")

inputs = tokenizer("Hello, my dog is cute", return_tensors="tf")
input_ids = inputs["input_ids"]

outputs = model(inputs)
logits = outputs.logits

predictions = np.argmax(logits, axis=-1).squeeze()
predicted_labels = [model.config.id2label[id] for id in predictions if id != -100]
print(predicted_labels)

这里我假设你已经设置了id2label模型配置的属性。

您还可以打印标记和预测:

import tensorflow as tf

for id, label in zip(tf.squeeze(input_ids), predicted_labels):
  print(tokenizer.decode([id]), label)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TFCamemBERT 模型训练但测试没有结果 的相关文章

随机推荐

  • 运行TFS构建服务(NT AUTHORITY\NETWORK SERVICE)的帐户需要在发布管理服务器中添加为系统用户

    当我尝试从我的构建中触发发布时 我收到上述错误 构建可以自行运行 发布也可以自行运行 但我无法触发发布 我的问题是发布管理中没有系统用户这样的东西 存在一个服务用户 将上述用户设置为服务用户 它还被设置为发布管理器 它还位于 TFS 中的
  • 具有类型安全实现的 Java 泛型接口

    我正在寻找从通用框架调用特定接口的良好替代方案 我用代码来举例说明 看看问题部分 包含示例代码主要是为了彻底性 并将示例应用到实际场景中 Example 假设我们想要基于组件列表构建报告 假设我们有两种特定的组件类型 public inte
  • 使用 RxJS Observable 传输 JSON

    我正在尝试了解有关 RxJ 的一些事情 我想要做的是使用一些 JSON 数据 并在数据传入时立即开始在 DOM 上呈现该数据 我已经设置了流请求 响应和显示 它的输出一切都很好 但它是一次性完成的 而不是随着时间的推移 我想开始在页面上显示
  • 设置-webkit-transform并使用JS进行转换

    我正在尝试使用 jQuery 更改元素的 transform css 属性 myBlock css webkit transform rotate angle deg myBlock css moz transform rotate ang
  • 如何手动指定 X-Cloud-Trace-Context 标头值并关联和跟踪单独的 Cloud Run 请求中的日志?

    我正在使用 Cloud Run 和 Cloud Tasks 对 Webhook 进行一些异步处理 当我收到对 Cloud Run 服务的请求时 我会在 Cloud Tasks 队列中对任务进行排队 并立即从服务返回响应 然后 云任务将再次触
  • 为什么 django 不使用带有日期模板标记的 SHORT_DATE_FORMAT?

    当我为日期模板标记指定 SHORT DATE FORMAT 时 我很难理解为什么 django 不在模板中使用我的 SHORT DATE FORMAT 我的设置是 TIME ZONE Australia Melbourne SHORT DA
  • Go 中从 C 调用的整数除法

    我可以通过这个程序在 go 中执行整数除法 package main import fmt func main a 10 b 5 fmt Println a b 然后我用 go 编写了一个程序 其中包含 和 的函数 我用 C 编写了一个程序
  • 错误:非法重新分配导入

    我正在尝试将模块导入到打字稿文件中 然后与 Rollup js 捆绑在一起 但我收到一条错误消息 导致 Rollup 无法完成 进口 import as mapboxgl from mapbox gl mapboxgl as any acc
  • 如何扩展 JSX.IntrinsicElements['div']? TS2499

    我怎么可以通过创建一个新类型JSX IntrinsicElements div X但我不能延长它 我不明白错误消息 我不是简单地添加了一个 可选类型 吗 这两种不同的方式扩展类型有什么区别 对我有用的是预先定义类型 type SpanPro
  • Facebook 嵌入视频的 OpenGraph 遇到的困难

    我在实施通过研究找到的解决方案时遇到了一些困难here https stackoverflow com a 17811187 1467082 实际接受的答案没有帮助 已被投给玻利维亚 Problem Facebook 似乎无法识别我添加到标
  • 如何通过我的应用程序向服务器发送反馈信息?

    在我的应用程序中将使用反馈表 我必须将反馈信息发送到服务器 请帮助我如何在 Windows Phone 中将信息发送到服务器 您可以使用 EmailTask var emailTask new EmailComposeTask To ema
  • 计算字符串中所有字符的函数 - C++

    我想用C 写一个函数 计算字符串中的所有字符 我有一个名为 input 的字符串 程序的用户可以在其中输入一个句子 我将重要的字母存储在字符串字母表中 如下所示 string alphabet ABCDEFGHIJKLMNOPQRSTUVW
  • Xcode 8 无法启动:加载插件失败

    我的 Xcode 8 有一个大问题 无法启动 我总是收到以下错误 加载插件失败 该插件或其必备插件之一可能丢失或 已损坏 可能需要重新安装 我查看日志 发现问题出在 Python 所以我尝试更新 Python 重新安装 但没有什么问题 T
  • 可以通过 ISNUMERIC 函数过滤 Spark 数据帧吗?

    我有一个DataFrame对于 SQL 中的表 我想过滤这个DataFrame某一列的值是否为数字 val df sqlContext sql select from myTable val filter df filter ISNUMER
  • C++ - 如何从同一类的静态函数访问类的私有成员?

    我拥有的 所以我有一个带有私有成员和静态函数的类 该函数必须确实是静态的 我无法更改它 我想要的是 我需要从静态函数访问私有成员 有任何想法吗 请检查以下代码 class Base private int m member public B
  • 如何在 SQL 中将 Float 转换为 Varchar

    我正在做这个 declare num float 7708369000 select num as float convert varchar num as varchar 它给了我这个 float varchar 7708369000 7
  • 如何按 DESC 或 ASC 对 varchar 数字列进行排序?

    我写的 ORDER BY column ASC 但我的专栏是VARCHAR它有点像错误的1 10 2 代替1 2 10 我怎样才能做到像这样排序1 2 10 order by cast column as float Notes 假设您的列
  • 使用带有判别器的 C# MongoDB LINQ

    我有一个 MongoDB 集合 包含三个不同类 A B C 的文档 它们都继承自公共类 D 使用官方 C 驱动程序 我插入了所有三种类型 A B C 的文档 并且它们都通过 t 鉴别器正确显示 并且在我的代码中注册了它们的类映射 如果我发出
  • 序列信息缺失

    我正在使用 Spring Boot 应用程序 使用 com ibm db2 jcc DB2Driver 驱动程序和 Spring Data JPA 连接到 AS400 数据库 我使用 org hibernate dialect DB2Dia
  • TFCamemBERT 模型训练但测试没有结果

    目前我正在使用 Camembert 进行医学领域的命名实体识别 精确地使用以下模型 TF卡芒贝尔 https huggingface co jplu tf camembert base 然而 我在对任务模型进行微调时遇到了一些问题 因为我使