unilm 在LayoutLMv2中嵌入维度不匹配错误

ttisahbt  于 5个月前  发布在  其他
关注(0)|答案(5)|浏览(72)

这个错误是因为在计算embeddings时,visual_embeddingsposition_embeddingsspatial_position_embeddings的尺寸不匹配。具体来说,visual_embeddings的形状是[64, 49, 768],而position_embeddingsspatial_position_embeddings的形状都是[8, 49, 768]。为了解决这个问题,你需要确保这三个Tensor的尺寸在非单例维度0上相匹配。

你可以尝试将position_embeddingsspatial_position_embeddings的形状更改为[64, 49, 768],方法是在它们的维度上添加一个大小为1的维度。例如:

position_embeddings = position_embeddings[:, None, :]
spatial_position_embeddings = spatial_position_embeddings[:, None, :]

然后再执行计算embeddings的操作。

vlju58qv

vlju58qv1#

根据我所了解的,如果不使用分布式启动参数运行代码,例如:

python examples/run_funsd.py --model_name_or_path microsoft/layoutlmv2-base-uncased --output_dir tmp/test-ner --do_train --do_predict --max_steps 1000 --warmup_ratio 0.1 --fp16

会出现错误。

ngynwnxp

ngynwnxp2#

看起来图像的shape[0]和bbox的shape[0]不同。你应该检查你的数据集实现。

2wnc66cl

2wnc66cl3#

我正在使用预定义的FUNSD数据集。我不认为那里应该有一个错误(希望如此)。

zour9fqk

zour9fqk4#

当我尝试运行脚本unilm/layoutlmft/examples/examples/run_funsd.py时,我遇到了类似的错误,但是错误信息提到了不同大小的Tensor。看起来训练需要使用所有的GPU。我有两块。
一旦我将--nproc_per_node更改为与GPU数量相匹配的数字:

python -m torch.distributed.launch --nproc_per_node=2 examples/run_funsd.py ....

,错误就不再出现了。

ldfqzlk8

ldfqzlk85#

看起来,当你仅使用一个GPU来训练模型时,你应该选择export CUDA_VISIBLE_DEVICES=0或其他单个GPU ID。

相关问题