如何在 Tensorflow 中为 BERT 标记器指定输入序列长度?

Posted

技术标签:

【中文标题】如何在 Tensorflow 中为 BERT 标记器指定输入序列长度?【英文标题】:How to specify input sequence length for BERT tokenizer in Tensorflow? 【发布时间】:2021-10-26 09:57:46 【问题描述】:

我正在关注这个example 使用 BERT 进行情绪分类。

text_input = tf.keras.layers.Input(shape=(), dtype=tf.string)
preprocessor = hub.KerasLayer(
    "https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3") # 128 by default
encoder_inputs = preprocessor(text_input)
encoder = hub.KerasLayer(
    "https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4",
    trainable=True)
outputs = encoder(encoder_inputs)
pooled_output = outputs["pooled_output"]      # [batch_size, 768].
sequence_output = outputs["sequence_output"]  # [batch_size, seq_length, 768].
embedding_model = tf.keras.Model(text_input, pooled_output)sentences = tf.constant(["(your text here)"])print(embedding_model(sentences))

从 encoder_inputs 的输出形状来看,默认的序列长度似乎是 128。但是,我不确定如何更改此设置?理想情况下,我想使用更大的序列长度。

有一个从预处理器页面修改序列长度的示例,但我不确定如何将其合并到我上面的功能模型定义中?对此我将不胜感激。

【问题讨论】:

【参考方案1】:

只是在这里关闭文档(尚未对此进行测试),但您可能会这样做:

preprocessor = hub.load(
    "https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3")


text_inputs = [tf.keras.layers.Input(shape=(), dtype=tf.string)]

您似乎没有对上面的数据进行标记 - 见下文

tokenize = hub.KerasLayer(preprocessor.tokenize)
tokenized_inputs = [tokenize(segment) for segment in text_inputs]

接下来选择你的序列长度:

seq_length = 128  # Your choice here.

这里是你传入 seq_length 的地方:

bert_pack_inputs = hub.KerasLayer(
    preprocessor.bert_pack_inputs,
    arguments=dict(seq_length=seq_length))  # Optional argument.

现在通过运行 bert_pack_inputs 对您的输入进行编码(这将替换上面的 preprocessor(text_input)

encoder_inputs = bert_pack_inputs(tokenized_inputs)

然后是你的其余代码:


encoder = hub.KerasLayer(
    "https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4",
    trainable=True)
outputs = encoder(encoder_inputs)
pooled_output = outputs["pooled_output"]      # [batch_size, 768].
sequence_output = outputs["sequence_output"]  # [batch_size, seq_length, 768].
embedding_model = tf.keras.Model(text_input, pooled_output)sentences = tf.constant(["(your text here)"])print(embedding_model(sentences))

【讨论】:

以上是关于如何在 Tensorflow 中为 BERT 标记器指定输入序列长度?的主要内容,如果未能解决你的问题,请参考以下文章

colab上基于tensorflow2.0的BERT中文多分类

使用来自 Tensorflow 的 BERT 模型时出错

c++ tensorflow调用与BERT实战

使用google-bert tensorflow版本跑bert预训练-简记

BERT | 使用TensorFlow无法使用显卡

利用 TensorFlow Hub 中的预处理模型简化 BERT