拥抱面部变压器ALBERT和TFjs没有动态大小的输入

时间:2020-09-30 11:47:32

标签: tensorflow.js huggingface-transformers

目标

我们尝试使用Tensorflow ALBERT from Huggingface转换器进行TokenClassification,以处理Tensorflow JS中任意长度的文本。 ALBERT的代码未更改,仅经过培训并保存为* .pb文件。

我们尝试过的事情

我们在数据集中使用以下命令训练了TFAlbertForTokenClassification:

!python3 transformers/examples/token-classification/run_tf_ner.py --data_dir transformers-dataset/ \
 --labels labels-hf.txt \
 --model_name_or_path albert-base-v2 \
 --output_dir models/hf \
 --max_seq_length  128 \
 --num_train_epochs 1 \
 --per_device_train_batch_size 32 \
 --save_steps 750 \
 --seed 1 \
 --do_train \
 --do_eval 

Python 下,您可以加载* .pb文件并处理任意长度的标记化文本。

tokenizer = AutoTokenizer.from_pretrained('models/hf')
model = TFAlbertForTokenClassification.from_pretrained('models/hf')
input_text = "That is a test"
sent = tokenizer(input_text)
print(sent)
test = model.predict(sent['input_ids'])

输出看起来像这样:

Output:
{'input_ids': [2, 30, 25, 21, 1289, 3], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}
(array([[[ 0.47850922, -0.32002082, -0.30604097, -0.45886928,
          0.7326187 ]],

       [[-0.47561824, -0.2232911 , -1.1606266 , -0.76804316,
          1.5043088 ]],

       [[-0.08451878,  0.20940554, -0.53571814, -0.50926656,
          1.2012056 ]],

       [[-0.06268388, -0.91142046, -0.8368153 , -0.58241546,
          0.72836596]],

       [[-0.9490294 ,  0.1855019 , -0.34128478,  0.76724774,
         -0.28610477]],

       [[-0.8634669 ,  0.13790444,  0.23986098, -0.12315045,
          1.7485847 ]]], dtype=float32),)

要使用Tensorflow JS,我们用tfjs-converter转换了* .pb文件,该文件使用了model.json和一个权重文件:

!tensorflowjs_converter \
--input_format=tf_saved_model \
--weight_shard_size_bytes 128000000 \
saved_model \
tfjs

问题

在使用 tfjs-converter 转换* .pb文件之后,我们尝试使用相同的输入[2, 30, 25, 21, 1289, 3]运行转换后的tfjs模型:

const tf = require('@tensorflow/tfjs')
const tfn = require('@tensorflow/tfjs-node')
const handler = tfn.io.fileSystem('./model/model.json')

tf.ready()
  .then(() => console.log('tensorflow ready'))
  .catch((e) => console.log(e))

tf.loadGraphModel(handler)
  .then((gModel) => {
    let tensor = tf.tensor2d([[2, 30, 25, 21, 1289, 3]], [1, 6], 'int32')

    const result = gModel.predict(tensor)
    console.log('result', result)
  })
  .catch((e) => console.log(e))

我们遇到了一个错误:

Error: The shape of dict['input_ids'] provided in model.execute(dict) must be [-1,5], but was [1,6]

当我们使用包含5个整数的输入列表(例如let tensor = tf.tensor2d([[2, 30, 25, 1289, 3]], [1, 5], 'int32'))时,它可以正常工作。在 model.json 文件中,我们发现,转换后,图形的输入形状将减小为形状为[-1,5]的固定大小的输入:

model.json
{"inputs": {"input_ids:0": {"name": "input_ids:0", "dtype": "DT_INT32", "tensorShape": {"dim": [{"size": "-1"}, {"size": "5"}]}}}

问题

在转换为Tensorflow JS模型后,我们需要做什么才能在此模型中获得“ input_ids ”的动态大小的输入?

编辑: 我们使用了TF 2.3和TFjs 2.4

0 个答案:

没有答案