前言:最近在看VQA相关内容,正好发现了LayoutLM这个repo,有开源代码,有pretrained model,就想着白嫖一波
LayoutLM repo地址:https://github.com/microsoft/unilm/tree/master/layoutlm
ubuntu下面,可以按照下面的方法安装lfs
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
git lfs install
安装好之后,就可以按照下面的方法去下载pretrained model了,huggingface的链接,官网repo中也有
下载pretrained model的方法
git clone https://huggingface.co/microsoft/layoutlm-base-uncased/tree/main
这种方法,目前基于torch-transformer用的还挺普遍的。
python set.py bdist_wheel
pip install dist/***.whl
seqeval
tensorboardX
transformers
这里因为文档分类的数据集太大了,30+G,暂时又无法访问,所以先在Sequence Labeling Task
作了实验和流程验证。
17M
左右),但是时间也比较久进入example文件夹
bash preprocess.sh
然后按照官网的文档训练即可。
python3.7 run_seq_labeling.py --data_dir data \
--model_type layoutlm \
--model_name_or_path ./layoutlm-base-uncased/ \
--do_lower_case \
--max_seq_length 512 \
--do_train \
--num_train_epochs 100.0 \
--logging_steps 10 \
--save_steps 2 \
--output_dir ./output \
--overwrite_output_dir \
--labels data/labels.txt \
--per_gpu_train_batch_size 16 \
--per_gpu_eval_batch_size 16 \
--evaluate_during_training \
--fp16
output/train.log
会记录实时日志,也会打印出recall, precision ,f1 等信息,如下。
precision recall f1-score support
QUESTION 0.29 0.56 0.38 9
HEADER 0.50 1.00 0.67 1
ANSWER 0.04 0.20 0.06 5
micro avg 0.15 0.47 0.23 15
macro avg 0.22 0.47 0.30 15
07/04/2021 09:33:51 - INFO - __main__ - ***** Eval results *****
07/04/2021 09:33:51 - INFO - __main__ - f1 = 0.22950819672131148
07/04/2021 09:33:51 - INFO - __main__ - loss = 2.8498342037200928
07/04/2021 09:33:51 - INFO - __main__ - precision = 0.15217391304347827
07/04/2021 09:33:51 - INFO - __main__ - recall = 0.4666666666666667
[Errno 2] No such file or directory: 'data/dev.txt
解决办法,创建dev文件,我是把test*.txt都软链到到dev*.txt了。
cd data
ln -s test_box.txt dev_box.txt
ln -s test_image.txt dev_image.txt
ln -s test.txt dev.txt
cd ..
提交的话,需要自己处理数据格式,可以参考这个链接:https://github.com/microsoft/unilm/issues/125
StopIteration: Caught StopIteration in replica 0 on device 0.
可以参考下面的链接:https://www.pythonf.cn/read/153689,修改下源码,将next(self.parameters()).dtype
修改为torch.float32
(如果使用fp32训练)或者torch.float16
(如果使用fp16训练)。
V2的文档相对更少一些,而且需要额外的依赖。安装之前,一定要手动更新下pip,不然很多包安装都有问题,具体命令如下
pip install --upgrade pip
pip install datasets
之后就按照官网上的训练脚本运行就行,这里发现layoutlmft文件夹中的代码做了优化,pretrain和dataset都可以自动下载了,所以用起来相对比较无脑