1

我正在尝试为 NER 微调 BERT。我从这里下载了一个检查点(https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip

我已经使用以下代码加载了会话和图表:

model = "./cased_L-12_H-768_A-12/bert_model"
new_saver = tf.train.import_meta_graph(model + ".ckpt.meta")
new_saver.restore(sess, model + '.ckpt')
graph = tf.get_default_graph()

现在,我试图从该图中获取输入占位符,以创建我自己的 feed_dict 并定义我自己的损失函数。我使用以下代码检查图表:

op = sess.graph.get_operations()
[m.values() for m in op]

下面列出了我找到的唯一占位符:

[(<tf.Tensor 'Placeholder:0' shape=(1, 128) dtype=int32>,),
 (<tf.Tensor 'Placeholder_1:0' shape=(1, 128) dtype=int32>,),
 (<tf.Tensor 'Placeholder_2:0' shape=(1, 128) dtype=int32>,),

这些占位符对我来说看起来不正确,原因如下:

  1. 我希望它们的大小为 (None,512),因为此 BERT 模型接受的序列长度最大为 512,并且不应该预先确定 batch_size。根据我在这里看到的这个大小,这个 BERT 模型一次接受 1 个序列,最大大小为 128。这是为什么呢?

  2. 我相信我们必须提供一组序列、它们的长度和相应的标签。在这三个占位符中,哪个是哪个?

4

1 回答 1

0

BERT 模型在下游任务中的典型使用需要重建图并从预训练模型加载权重/偏差值,如示例脚本中所做的那样run_classifier.py

可以通过自己定义占位符并在构建图形时将它们提供给模型(作为 BertModel 构造函数的输入)以旧方式运行模型。

请注意,is_training它在 BertModel 中定义为布尔变量,而不是张量,如果您还想向其中提供占位符,则需要进行一些小的代码更改。

于 2019-10-08T12:11:17.040 回答