python-3.x - 在不使用终端命令的情况下从 BioBERT 中提取固定向量?
问题描述
如果我们想使用预训练的BioBERT模型的权重,我们可以在下载所有必需的 BioBERT 文件后执行以下终端命令。
os.system('python3 extract_features.py \
--input_file=trial.txt \
--vocab_file=vocab.txt \
--bert_config_file=bert_config.json \
--init_checkpoint=biobert_model.ckpt \
--output_file=output.json')
上面的命令实际上是读取包含文本的单个文件,从中读取文本内容,然后将提取的向量写入另一个文件。因此,问题在于,对于包含数千个句子/段落的非常大的数据集,它无法轻松扩展。
有没有一种方法可以随时随地提取这些特征(使用嵌入层),就像在 PyTorch 或 TF1.3 中对 word2vec 向量所做的那样?
注意:TF2.0 不存在 BioBERT 检查点,所以我想除非有人生成与 TF2.0 兼容的检查点文件,否则我认为 TF2.0 无法做到这一点。
我将不胜感激任何提示或帮助。
解决方案
您可以即时获取上下文嵌入,但获取嵌入所花费的总时间将始终相同。有两种选择:1. 将 BioBERT 导入 Transformers 包并在 PyTorch 中使用它(我会这样做)或 2. 使用原始代码库。
1. 将 BioBERT 导入 Transformers 包
使用预训练的 BERT 模型最方便的方法是Transformers包。它主要是为 PyTorch 编写的,但也适用于 TensorFlow。它没有开箱即用的 BioBERT,因此您需要自己将其从 TensorFlow 格式转换。有convert_tf_checkpoint_to_pytorch.py
脚本可以做到这一点。人们对此脚本和 BioBERT 有一些问题(似乎已解决)。
转换模型后,您可以像这样加载它。
import torch
from transformers import *
# Load dataset, tokenizer, model from pretrained model/vocabulary
tokenizer = BertTokenizer.from_pretrained('directory_with_converted_model')
model = BertModel.from_pretrained('directory_with_converted_model')
# Call the model in a standard PyTorch way
embeddings = model([tokenizer.encode("Cool biomedical tetra-hydro-sentence.", add_special_tokens=True)])
2.直接使用BioBERT代码库
您可以使用以下代码随时随地获取嵌入exctract_feautres.py
。在第 346-382 行,他们初始化模型。您可以通过调用来获取嵌入estimator.predict(...)
。
为此,您需要格式化输入格式。首先,您需要格式化字符串(使用第 326-337 行的代码),然后应用并调用convert_examples_to_features
它。
推荐阅读
- javascript - 如何使用电子标签 webview 从浏览器窗口到标签进行通信?
- reactjs - Disabling console log react
- c++ - I'm using _getch() in C++ and i want to know if it can detect the arrow keys instead of the other keys
- python - How should I write the error handling in this situation? I want the program to say that the file does not exist, and then run and ask again for a file
- r - 如何从 R 中的数据框中提取特定范围的小时数
- python - 调整 PyGame 屏幕大小
- prolog - 如何在 Prolog 中使用 DCG 生成长度为 n-1 的所有二进制字符串的语言
- kibana - Opendistro Kibana:在插件中获取用户信息(如角色)
- html - 引导下拉菜单中的链接(a href)不起作用
- c++ - C++ 在执行 windows.h 时跳转到 case 标签错误