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 模型训练但测试没有结果 的相关文章

  • UnimplementedError:图形执行错误:在张量流上运行 nn

    我一直遇到这个错误 我不知道为什么 特别是因为我完全遵循某人的代码并且该人在运行此错误时没有错误 img shape 128 128 3 load pretrained model base model tf keras applicati
  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • 用 tf.data 替换基于队列的输入管道

    我正在阅读 Ganegedara 的 NLP with Tensorflow 输入pipieline的介绍有以下例子 import tensorflow as tf import numpy as np import os Defining
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • 即使使用 .loc[row_indexer,col_indexer] = value 时也会设置 WithCopyWarning

    这是我的代码中得到的行之一SettingWithCopyWarning value1 Total Population value1 Total Population replace to replace value 4 然后我将其更改为
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 如果字段值在外部列表中,Django 会注释布尔值

    想象一下我有这个 Django 模型 class Letter models Model name models CharField max length 1 unique True 还有这个列表 vowels a e i o u 我想查询
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • Python Kivy - 在本机网络浏览器中打开 url 的应用程序

    我尝试制作一个简单的应用程序 在单击 Screen One 上的按钮后 在 Kivy 中打开一个网页 我使用了这个主题 Python 在应用程序中直接显示网络浏览器 iframe https stackoverflow com questi
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • 如何在与应用程序初始化文件不同的文件中迭代 api 路由

    我有一个 apiroutes py 文件 其中定义了许多路由 例如 api route api read methods GET api route api write methods POST 其中 api 是导入 from import
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • 如何在sphinx中启用数学?

    我在用sphinx http sphinx pocoo org index html与pngmath http sphinx pocoo org ext math html module sphinx ext pngmath扩展来记录我的代
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如

随机推荐

  • 运行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 然而 我在对任务模型进行微调时遇到了一些问题 因为我使