我对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与关联的vocab(字符串)进行匹配。此后,我将使用一个API(作为服务的BERT)在字符串级/令牌级提供任何给定字符串列表的BERT嵌入。问题在于,由于self.input_ids
只是一个占位符,因此它显示为NULL对象。有什么解决方法可以帮助我吗?
谢谢!
答案 0 :(得分:0)
您不能直接将bert-as-service用作张量。因此,您有两种选择:
使用bert-as-service查找嵌入。您将这些句子作为输入,并获得一小撮嵌入数组作为输出。然后,您将嵌入的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)
的地方。