目标
我们尝试使用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