CHIP-2020 中文医学文本实体关系抽取

2023-10-26

来源:这里

这个项目的本质是-----------医学文本的实体关系联合抽取问题,既要解决命名实体识别,又要解决关系分类问题。使用RoFormerV2模型作为预训练模型,GPLinker作为下游模型,在Embedding层添加FGM对抗训练增加模型性能。

一、数据集

  • CHIP-2020-2中文医学文本实体关系抽取数据集

      数据集包含儿科训练语料和百种常见疾病训练语料,儿科训练语料来源于518种儿科疾病,百种常见疾病训练语料来源于109种常见疾病。
      近7.5万三元组数据,2.8万疾病语句和53种定义好的schema。
    
  • 数据集格式

{
   "spo_list" : [
      {
         "Combined" : true,
         "object" : {
            "@value" : "外照射"
         },
         "object_type" : {
            "@value" : "其他治疗"
         },
         "predicate" : "放射治疗",
         "subject" : "慢性胰腺炎",
         "subject_type" : "疾病"
      },
      {
         "Combined" : true,
         "object" : {
            "@value" : "外照射"
         },
         "object_type" : {
            "@value" : "其他治疗"
         },
         "predicate" : "放射治疗",
         "subject" : "非肿瘤性疼痛",
         "subject_type" : "疾病"
      }
   ],
   "text" : "慢性胰腺炎@### 低剂量放射 自1964年起,有几项病例系列报道称外照射 (5-50Gy) 可以有效改善慢性胰腺炎患者的疼痛症状。慢性胰腺炎@从概念上讲,外照射可以起到抗炎和止痛作用,并且已经开始被用于非肿瘤性疼痛的治疗。"
}
临床实践文本可能不提及主题疾病---每句之前增加主题疾病实体,并以@和原文分割
Combined-----三元组来源上下多个句子,拼接在一起
”text”----记录来源文本
SPO表示法。S-头实体,O-尾实体,P-Predicate,即「关系(Relation)」更专业的叫法。
  • 本代码需要将数据处理成如下的格式:
{
   "spo_list" : [
      {
         "Combined" : true,
         "object" : "外照射",
         "object_type" : "其他治疗",
         "predicate" : "放射治疗",
         "subject" : "慢性胰腺炎",
         "subject_type" : "疾病"
      },
      {
         "Combined" : true,
         "object" : "外照射",
         "object_type" : "其他治疗",
         "predicate" : "放射治疗",
         "subject" : "非肿瘤性疼痛",
         "subject_type" : "疾病"
      }
   ],
   "text" : "慢性胰腺炎@### 低剂量放射 自1964年起,有几项病例系列报道称外照射 (5-50Gy) 可以有效改善慢性胰腺炎患者的疼痛症状。慢性胰腺炎@从概念上讲,外照射可以起到抗炎和止痛作用,并且已经开始被用于非肿瘤性疼痛的治疗。"
}
  • schemas格式(数据库的组织和结构)
    介绍:限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了该领域内有意义的概念类型以及这些类型的属性
    作用:规范结构化数据的表达,一条数据必须满足Schema预先定义好的实体对象及其类型,才被允许更新到知识图谱中
... ...

{"subject_type": "疾病", "predicate": "发病部位", "object_type": "部位"}
{"subject_type": "疾病", "predicate": "转移部位", "object_type": "部位"}
{"subject_type": "疾病", "predicate": "外侵部位", "object_type": "部位"}

... ...

  • dataloader单条格式
{'text': text, 'spo_list': [(s, p, o)]}

schema中的predicate不能重复,如有重复要更改,加以区别,否则就算object_type和subject_type不一致,只要predicate一致,就认为是一个关系。数据里的predicate也要同步更改。

二、项目结构

./
├── README.md
├── chinese_roformer-v2-char_L-12_H-768_A-12            roformer-v2 12层base版
│		 ├── bert_config.json                           是BERT在训练时可选调整参数
│		 ├── bert_model.ckpt.data-00000-of-00001
│		 ├── bert_model.ckpt.index						负责模型变量载入
│		 ├── bert_model.ckpt.meta						负责模型变量载入
│		 ├── checkpoint
│		 └── vocab.txt
├── chinese_roformer-v2-char_L-6_H-384_A-6              roformer-v2 12层base版
│		 ├── bert_config.json
│		 ├── bert_model.ckpt.data-00000-of-00001
│		 ├── bert_model.ckpt.index
│		 ├── bert_model.ckpt.meta
│		 ├── checkpoint
│		 └── vocab.txt
├── config.py                                           部分超参数配置
├── data
│		 ├── chip2020                           数据集
│		 │		 ├── 53_schemas.json
│		 │		 ├── train_data.json
│		 │		 └── val_data.json
│		 └── pred                               最佳模型预测样本
│		     ├── val_pred_ep38.json
│		     └── val_pred_ep73.json
├── dataloader.py                                       数据编码器
├── evaluate.py                                         模型评估
├── images                                              数据绘图
│		 ├── train_loss.png
│		 ├── train_loss_base.png
│		 ├── val_f1.png
│		 └── val_f1_base.png
├── log                                                 日志
│		 ├── f1.out
│		 ├── nohup.out
│		 ├── nohup_base.out
│		 ├── train_log.csv
│		 └── train_log_base.csv
├── main.py
├── model.py                                            模型文件
├── path.py                                             项目路径
├── plot.py                                             画图工具
├── predict.py                                          预测文件
├── report                                              模型评估报告
│		 ├── f1.csv
│		 ├── predicate_f1.csv
│		 └── predicate_f1_base.csv
├── schemaloader.py                                     schema加载器
├── test.py                                             token转可读字符
├── train.py                                            训练
├── utils                                               bert4keras工具包,可pip下载
│		 ├── __init__.py
│		 ├── adversarial.py
│		 ├── backend.py
│		 ├── layers.py
│		 ├── models.py
│		 ├── optimizers.py
│		 ├── snippets.py
│		 └── tokenizers.py
└── weights                                             保存的权重
    ├── gplinker_roformer_best.h5
    └── gplinker_roformer_v2_best.h5

10 directories, 51 files

模型中L表示的是transformer的层数,H表示输出的维度,A表示mutil-head attention的个数

三、代码解析

train.py

  • 构建模型:
# 构建模型
#extend_with_exponential_moving_average:返回新的优化器类,加入EMA(权重滑动平均)
AdamEMA = extend_with_exponential_moving_average(Adam, name = 'AdamEMA')
optimizer = AdamEMA(lr = 5e-5)
model.compile(loss = globalpointer_crossentropy, optimizer = optimizer)
model.summary()
adversarial_training(model, 'Embedding-Token', 0.5)

Adam:一阶梯度优化算法,提高计算效率,降低内存需求。
optimizer优化器
model.compile():模型编译的时候把优化器跟损失函数传进去,并返回一个张量作为输出结果。
adversarial_training(): 对抗训练
model.summary(): 输出模型各层的参数状况
在这里插入图片描述

  • 每一轮的工作:
    def on_epoch_end(self, epoch, logs = None):
        global count_model_did_not_improve #记录模型没有变好的次数
        #确定模型参数保存位置
        save_best_path = "{}/{}_{}_best.h5".format(weights_path, event_type, MODEL_TYPE)
        #apply_ema_weights():备份原模型权重,然后将平均权重应用到模型上去
        optimizer.apply_ema_weights()
        f1, precision, recall = evaluate(valid_data, epoch)
        f1_list.append(f1)
        recall_list.append(recall)
        precision_list.append(precision)
        if f1 >= self.best_val_f1:
            self.best_val_f1 = f1
            count_model_did_not_improve = 0
            model.save_weights(save_best_path)
        else:
            count_model_did_not_improve += 1
            print("Early stop count " + str(count_model_did_not_improve) + "/" + str(self.patience))
            #当验证集F1超过5轮没有上升时,停止训练。
            if count_model_did_not_improve >= self.patience:
                self.model.stop_training = True
                print("Epoch %05d: early stopping THR" % epoch)

model.py

  • 加载模型,训练结果
def get_model():
    # 加载预训练模型
    base = build_transformer_model(
        config_path = config_path,
        checkpoint_path = checkpoint_path,
        model = MODEL_TYPE,
        return_keras_model = False
    )
    
    # 预测结果
    #SetLearningRate:层的一个包装,用来设置当前层的学习率
    entity_output = SetLearningRate(GlobalPointer(heads = 2, head_size = 64, kernel_initializer = "he_normal"),
                                    10, True)(base.model.output)
    head_output = SetLearningRate(GlobalPointer(
        heads = len(predicate2id), head_size = 64, RoPE = False, tril_mask = False, kernel_initializer = "he_normal"
    ), 10, True)(base.model.output)
    tail_output = SetLearningRate(GlobalPointer(
        heads = len(predicate2id), head_size = 64, RoPE = False, tril_mask = False, kernel_initializer = "he_normal"
    ), 10, True)(base.model.output)
    outputs = [entity_output, head_output, tail_output]
    
    #input输入层,output输出层
    model = keras.models.Model(base.model.inputs, outputs)
    return model

1.调用bert4keras中的build_transformer_model来选择使用的模型

checkpoint_path = checkpoint_path
checkpoint_path = BASE_CKPT_NAME
BASE_CKPT_NAME = proj_path + “/chinese_roformer-v2-char_L-12_H-768_A-12/bert_model.ckpt”

TensorFlow模型会保存在后缀为.ckpt的文件中。
保存后在save这个文件夹中实际会出现3个文件,因为TensorFlow会将计算图的结构和图上参数取值分开保存。
model.ckpt.meta文件保存了TensorFlow计算图的结构,可以理解为神经网络的网络结构model.ckpt文件保存了TensorFlow程序中每一个变量的取值
checkpoint文件保存了一个目录下所有的模型文件列表(也可以看作权重)

  • 设置当前层的学习率
class SetLearningRate:
    """层的一个包装,用来设置当前层的学习率
    """
    
    def __init__(self, layer, lamb, is_ada = False):
        self.layer = layer
        self.lamb = lamb  # 学习率比例
        self.is_ada = is_ada  # 是否自适应学习率优化器
    
    def __call__(self, inputs):
        with K.name_scope(self.layer.name):
            if not self.layer.built:
                input_shape = K.int_shape(inputs)
                self.layer.build(input_shape)
                self.layer.built = True
                if self.layer._initial_weights is not None:
                    self.layer.set_weights(self.layer._initial_weights)
        for key in ['kernel', 'bias', 'embeddings', 'depthwise_kernel', 'pointwise_kernel', 'recurrent_kernel', 'gamma',
                    'beta']:
            if hasattr(self.layer, key):
                weight = getattr(self.layer, key)
                if self.is_ada:
                    lamb = self.lamb  # 自适应学习率优化器直接保持lamb比例
                else:
                    lamb = self.lamb ** 0.5  # SGD(包括动量加速),lamb要开平方
                K.set_value(weight, K.eval(weight) / lamb)  # 更改初始化
                setattr(self.layer, key, weight * lamb)  # 按比例替换
        return self.layer(inputs)

四、运行时的报错:

  1. AttributeError: module ‘keras.engine.base_layer’ has no attribute ‘Node’

  2. 版本问题
    在这里插入图片描述

  3. KeyError: ‘roformer’
    解决
    因为bert4keras模块的版本不对应------pip install bert4keras==0.11.1
    源代码中的utils文件夹其实就是bert4keras库,但是没有更新到最新的,所以导致找不到roformer

  4. tensorflow.python.framework.errors_impl.NotFoundError: Key bert/embeddings/LayerNorm/beta not found in checkpoint
    bert4keras版本出错

  5. 如何用gpu去跑数据
    安装tensorflow-gpu并且注意与cuda的版本问题

  6. tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found.
    找到两个root错误

     cuda+cuDNN+TensorFlow版本不一致导致
     显存分配问题,更改为动态分配内存就可以解决。
     ensorflow或者numpy版本引起-----tensorflow是1.14.0版本。应该使用pip uninstall numpy卸载所有的numpy,再安装1.16.4即可
     (以上方法都没用)
     后来发现漏了上一行报错tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32,256,55,55]”
     ResourceExhaustedError:资源耗尽错误
     减少批处理Batch 的大小32---->16
    
  7. FileNotFoundError: [Errno 2] Unable to create file (unable to open file: name = ‘/root/autodl-tmp/chip2020_relation_extraction-gplinker/weights/gplinker_roformer_v2_best.h5’, errno = 2, error message = ‘No such file or directory’, flags = 13, o_flags = 242)

    报错的中文解释是:没有这样的文件和目录
    也就是说写的不应该是文件,而是文件的路径或者说是目录,否则系统根本找不到所指的东西。

    问题解决
    明确写好文件对应的位置
    (其实后来发现是,给的源文件中少了weights的文件夹,添加后)

  8. AttributeError: ‘str’ object has no attribute ‘decode’
    解决
    一般是因为str的类型本身不是bytes,所以不能解码
    问题原因:可能是h5py模块的版本过高,导致无法加载h5文件------------pip install h5py==2.10.0
    有时候有环境配置里很复杂,
    用pip install ‘h5py<3.0.0’ -i https://pypi.tuna.tsinghua.edu.cn/simple好一点

  9. Linux实时将所有输出重定向到文件

     nohup unbuffer command > file.out 2>&1 &
     unbuffer命令需要额外安装expect-devel,用来实时刷新。
     nohup命令用来忽略所有挂断(SIGHUP)信号,让你的程序即使在用户注销后依然继续运行。
     command是任何一段你想要执行的shell命令。
     > file.out 代表将command运行结果重定向到当前目录下的file.out文件中(如果要每次运行的结果追加到file.out后面,可以用>>而不是>)。
     2 >&1表示将标准错误输出cerr的所有输出也都重定向到标准输出cout中,这样file.out中就会记录command命令运行过程中所有标准输出。
     最后一个&表示后台运行该command。 
    

10.File “/root/miniconda3/envs/simbert/lib/python3.7/site-packages/tensorflow/python/client/session.py”, line 1458, in call
run_metadata_ptr)
tensorflow.python.framework.errors_impl.InternalError: 2 root error(s) found.
(0) Internal: Blas xGEMMBatched launch failed : a.shape=[12,234,64], b.shape=[12,64,234], m=234, n=234, k=64, batch_size=12
[[{{node Transformer-0-MultiHeadSelfAttention_1/einsum/MatMul}}]]
[[global_pointer_5_1/truediv/_1251]]
(1) Internal: Blas xGEMMBatched launch failed : a.shape=[12,234,64], b.shape=[12,64,234], m=234, n=234, k=64, batch_size=12
[[{{node Transformer-0-MultiHeadSelfAttention_1/einsum/MatMul}}]]
解决
很玄学,相同代码之前没问题,后来训练了一次mt5后出现问题,以为是内存爆炸,然后使用A500GPU还是不行,(A500不行怀疑是算力不匹配),然后换回最开始的代码在2080ti上跑行了

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

CHIP-2020 中文医学文本实体关系抽取 的相关文章

  • Python 中的 Flask 错误:“无法导入 webapp”

    我正在尝试运行 Flask 但是 每当我输入 flask run 时 都会出现错误 Could not import webapp 作为参考 我正在使用 Visual Studio Code 并运行以下代码 from flask impor
  • 了解 Beautiful Soup 中的 Find() 函数

    我知道我想做的事情很简单 但这让我感到悲伤 我想使用 BeautifulSoup 从 HTML 中提取数据 为此 我需要正确使用 find 功能 这是我正在使用的 HTML div class audit div class profile
  • lxml 中的通配符命名空间

    如何使用 xpath 忽略 xml 命名空间进行查询 我正在使用 python lxml 库 我尝试了以下解决方案this https stackoverflow com questions 13463871 xpath selecting
  • 有没有办法使用 Mayavi 填充陀螺仪表面的一侧?

    我正在使用 Mayavi 绘制陀螺仪的等值面 我的问题是我需要通过填充两个生成区域的一侧来获得更坚固的结构 在下面的图片中 您可以看到我生成的等值面的外观以及填充一侧后的外观 我生成的等值面 它应该是什么样子 等值面可以通过以下方程生成 U
  • 如何在Python中每次运行脚本时增加变量?

    我有一个 Python 脚本 我想在每次运行时增加一个全局变量 这可能吗 使用外部文件很容易做到这一点 您可以创建一个函数来为您执行此操作 这样您就可以根据需要将多个文件用于多个变量 尽管在这种情况下您可能想要研究某种序列化并将所有内容存储
  • winpdb 不适用于 python 3.3

    我无法让 rpdb2 与 python 3 3 一起运行 但根据多个来源 这应该是可能的 rpdb2 d myscript py A password should be set to secure debugger client serv
  • pandas 用 nan 值切割了一系列

    我想将 pandas cut 函数应用于包含 NaN 的序列 期望的行为是它对非 NaN 元素进行存储并为 NaN 元素返回 NaN import pandas as pd numbers with nan pd Series 3 1 2
  • Python:合并嵌套列表

    初学者在这里 我有 2 个要合并的嵌套列表 list1 a b c d e f g h list2 p q r s t u v w 我正在寻找的输出是 list3 a p q b c r s d e t f g h u v w 这可以在没有
  • Pythonic方式逐行读取文件?

    以下两种方法中逐行读取文件的 Pythonic 方法是什么 with open file r as f for line in f print line or with open file r as f for line in f read
  • chrome_options.binary_location() TypeError: 'str' 对象不可调用

    我希望每个人都好 我是 python 新手 我尝试运行这段代码 但我不明白问题是什么以及如何解决这个问题 我的代码是 from selenium import webdriver from time import sleep url raw
  • 在heroku实例上安装PIL

    我创建了一个python flask托管在heroku上的应用程序 我很有趣PILpython 中的图像库 我无法安装PIL在heroku实例中 我尝试过以下几种方法 方法一 Added PIL 1 1 7 in requirements
  • Keras 中的 Tensorflow 自定义损失函数 - 张量循环

    我正在尝试在 Keras 中编写自定义损失函数 如下所示 Keras 中的自定义损失函数 https stackoverflow com questions 43818584 custom loss function in keras 我的
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 对seaborn图中的分类x轴进行排序

    我正在尝试使用 seaborn 散点图绘制数据框中前 30 的值 如下所示 同一图的可重现代码 import seaborn as sns df sns load dataset iris function to return top 30
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • Python:从字符串访问变量[重复]

    这个问题在这里已经有答案了 这可能是非常基本和简单的事情 我可能只是在谷歌上搜索错误的术语 但希望这里有人可以帮助我 我仍然是编程的初学者 这从这个问题中可能是显而易见的 我正在寻找一种从字符串访问变量的方法 像这样 A1 B1 C1 my
  • PyCharm 可以列出项目中的所有 Python 错误吗?

    我在虚拟环境中使用 python 2 7 和 PyCharm 2 7 2013 年 2 月 7 日的新版本 每当我打开其中有明确错误的Python文件 相当于其他语言中的编译错误 例如使用未声明的变量 调用不存在的函数 时 它会在文件的装订
  • 返回 OSError 异常类的子类实例的逻辑在哪里?

    我一直在寻找一些对某些人来说可能相对愚蠢的东西 但对我来说非常有趣 输入和输出错误已合并为OSError在 Python 3 3 中 异常类层次结构发生了变化 关于内置类的一个有趣的特性OSError是这样 它在传递时返回它的子类errno
  • 当前异常上下文掩盖了先前的错误

    以下是我在 Doug Hellman 网站上名为 masking exceptions catch py 的文件中找到的示例 我暂时无法找到链接 throws 中引发的异常将被丢弃 而 cleanup 中引发的异常将被报告 道格在他的文章中
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant

随机推荐

  • 下载、安装IntelliJ IDEA

    文章目录 一 下载IntelliJ IDEA 二 安装IntelliJ IDEA 三 配置主题与插件 1 设置界面主题 2 配置缺省插件 3 配置特色插件 四 设置IntelliJ IDEA 1 设置编译器用鼠标滚鼠来缩放字号 2 设置编辑
  • uml交互图

    交互图用来描述系统中的对象是如何进行相互作用的 即一组对象是如何进行消息传递的 当交互图建模时 通常既包括对象 每个对象都扮演某一特定的角色 又包括消息 每个消息都代表对象之间的通信活动 并导致一定的动作发生 关键字 对象 顺序 消息 顺序
  • 7.13字节跳动模拟面试

    GDB调试常见命令 进入GDB 取消联系 插入端点 gdb help 查看命令帮助 具体命令查询在gdb中输入help 命令 简写h gdb run 重新开始运行文件 run text 加载文本文件 run bin 加载二进制文件 简写r
  • 【TODO】2023年秋招笔试未竞

    2023年秋招笔试没做完的题 腾讯20230326笔试三道 米哈游20230813笔试第三题 网易雷火0820第2 3 4题 第三题 深信服0912B卷3 4题 第三题 背包装满最小数量 第四题 腾讯0915重考最后一道 字节0917秋招第
  • 5.xaml RadioButton按钮

    1 运行图 2 运行源码 a Xaml源码
  • 基于面部视觉的疲劳检测-哈欠

    基于视觉的疲劳检测可以认为大致分为三个部分 点头 哈欠 眨眼 分别为姿态 嘴部特征 眼部特征 本文主要介绍哈欠的测定方法 首先研究了陈博士 基于可拓学与面部视觉 一文 他提出一种基于特征点曲线拟合的嘴唇内轮廓检测方法 先对嘴巴进行粗定位 然
  • Removable singularity

    In complex analysis a removable singularity of a holomorphic function is a point at which the function is undefined but
  • darknet 网络构建过程

    整个网络的构建从load network cfgfile weightfile clear 函数开始 从cfg文件中读取网络配置文件 分配好内存 加载预训练好的权重 network load network char cfg char we
  • Spring工作原理

    Spring工作原理 Spring框架是由于软件开发的复杂性而创建的 Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 然而 Spring的用途不仅仅限于服务器端的开发 从简单性 可测试性和松耦合性角度而言 绝大
  • Sass -- 变量、计算、导入

    变量 在Sass中 支持使用变量 变量以 开头 变量使用 Sass不存在变量提升 变量必须先定义再使用 如果需要将变量在字符串中使用 需将变量写在 中 计算 在Sass中 允许数值运算 导入 Sass 类似 CSS 支持 import 指令
  • linux开放端口命令

    linux系统中控制端口的开启与关闭可以由命令来执行 下面由学习啦小编为大家整理了linux下开放端口命令的相关知识 希望对大家有所帮助 linux开放端口命令1 打开指定端口 sbin iptables I INPUT p tcp dpo
  • PyQt5 主窗口操作多个子窗口实现

    实现思路 1 pyqt5 designer 生成ui py 修改文件 2 ui py 主py 直接操作 3 main py 操作 ui 继承类py ui py 优选方案3 示例 from main win import Ui MainWin
  • 客户端session与服务端session

    转自 https www cnblogs com qhyhao p 3565681 html 会话 Session 跟踪是Web程序中常用的技术 用来跟踪用户的整个会话 常用的会话跟踪技术是Cookie与Session Cookie通过在客
  • 移动互联网应用程序必要个人信息范围

    常见类型App的必要个人信息范围 必要个人信息 是指保障APP基本功能服务正常运行所必需的个人信息 缺少该信息APP即无法实现基本功能服务 具体是指消费侧用户个人信息 不包括服务供给侧用户个人信息 地图导航类 基本功能服务为 定位和导航 必
  • Unity3D Linear01Depth & LinearEyeDepth d3d

    Unity3D Linear01Depth LinearEyeDepth 函数深度解析 原创 2015年07月11日 20 25 42 5609 UnityCG cginc中原函数如下 Z buffer to linear 0 1 dept
  • Java学习(110)Java输入输出流——文件输入流FileInputStream

    Java输入输出流 文件输入流FileInputStream FileInputStream概述 1 FileInputStream作用 2 FileInputStream的常用方法简介 FileInputStream案例 前置条件 rea
  • matlab程序打包成软件(exe可执行文件)

    文章目录 下载matlab runtime 打包 分享安装 下载matlab runtime 略 打包 分享安装 打包生成的文件夹如下 包含runtime的exe文件 安装后即可在没有matlab环境下运行
  • 使用免费的Spire.Pdf.dll打印无水印的PDF文件

    文章目录 前言 一 如何获取免费的无水印的Spire Pdf dll 二 使用步骤 1 引入库 2 打印 总结 前言 最近想利用c 打印PDF文件 在网上找了各种办法 发现最简单的就是使用第三方的动态链接库Spire Pdf dll了 但是
  • Spring的第一个入门程序(学习总结)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 提示 以下是本篇文章正文内容 下面案例可供参考 一 Spring框架的概述 1 1 1 Spring是什么 Spring是分层的 Java SE EE应用full stack
  • CHIP-2020 中文医学文本实体关系抽取

    来源 这里 这个项目的本质是 医学文本的实体关系联合抽取问题 既要解决命名实体识别 又要解决关系分类问题 使用RoFormerV2模型作为预训练模型 GPLinker作为下游模型 在Embedding层添加FGM对抗训练增加模型性能 一 数