python - 在分类模型中初始化 BERT 嵌入
问题描述
我对 TensorFlow 很陌生,并尝试使用 BERT 进行多任务分类(我在项目的另一部分中使用 GloVe 完成了此操作)。我的问题是 TensorFlow 中占位符的概念。我知道它只是一些变量的占位符,会被填充。看到这是我有问题的分类模型的一部分。我将在这里解释确切的问题。
def bert_emb_lookup(input_ids):
# TODO to be implemented;
"""
X is the input IDs, but a placeholder
"""
pass
class BertClassificationModel(object):
def __init__(self, num_class, args):
self.embedding_size = args.embedding_size
self.num_layers = args.num_layers
self.num_hidden = args.num_hidden
self.input_ids = tf.placeholder(tf.int32, [None, args.max_document_len])
self.Y1 = tf.placeholder(tf.int32, [None])
self.Y2 = tf.placeholder(tf.int32, [None])
self.dropout = tf.placeholder(tf.float64, [])
self.input_len = tf.reduce_sum(tf.sign(self.input_ids), 1)
with tf.name_scope("embedding"):
self.input_emb = bert_emb_lookup(self.)
...
从 GloVe 很容易获得词嵌入;我首先加载了手套向量,然后简单地用于tf.nn.embedding_lookup(embeddings, self.input_ids)
获取嵌入。
因此,在 BERT 分类模型中,我试图通过定义一个参数为 的函数来做类似的事情input_ids
,我想在其中将输入 id 与其关联的词汇(字符串)进行匹配。此后,我将使用一个 API(BERT 即服务)在字符串级别/令牌级别为任何给定字符串列表提供 BERT 嵌入。问题是因为self.input_ids
它只是一个占位符,它显示它是一个 NULL 对象。有什么解决方法可以帮助我解决这个问题吗?
谢谢!
解决方案
您不能直接将 bert-as-service 用作张量。所以你有两个选择:
使用 bert-as-service 来查找嵌入。您将句子作为输入并获得一个 numpy 嵌入数组作为输出。然后,您将嵌入的 numpy 数组提供给占位符
self.embeddings = tf.placeholder(tf.float32, [None, 768])
,然后您可以使用self.embeddings
任何您会使用的tf.nn.embedding_lookup(embeddings, self.input_ids)
.在这种情况下,另一个选项可能是矫枉过正,但它可能会给你一些背景信息。在这里,您不使用 bert-as-service 来获取嵌入。相反,您直接使用 bert 模型图。您可以使用https://github.com/google-research/bert/blob/master/run_classifier.py中的 BertModel来创建一个张量,该张量可以在任何您使用的地方再次使用
tf.nn.embedding_lookup(embeddings, self.input_ids)
。
推荐阅读
- swift - 带有自定义拇指图像和文本的滑块
- php - 在结帐时添加 woocommerce 自定义字段致命错误 $checkout->get_value()
- sql-server - 想要在我的日期中获取时间作为 SQL 中 5 的倍数
- c - 在 Struct (C) 中调用不同的函数
- java - Java 不支持枚举上的协变返回类型吗?
- django - 如何使用 django 模型使用 enter 关键字将字符字段逐行保存到数据库中?
- git - 如何打印子模块级别/深度
- delphi - 如何使用文件“映射/共享内存”从我的 Delphi 应用程序中获取 Inno 安装程序“进度状态/日志”
- c# - 如何在 Xamarin Forms 中更改选项卡式页面指示器的颜色
- python - 当字段为 NaN 时,是否有可能在插入字符串时将字段设为空白?