Gmgge / TrOCR-Seal-Recognition

基于transformer的ocr识别,在公章(印章识别, seal recognition)拓展应用
160 stars 27 forks source link

自定义词表问题,权重初始化问题 #52

Closed wangjiannan98 closed 1 month ago

wangjiannan98 commented 1 month ago

老师,您好,请教一下,在 init_custdata_model.py 代码文件中,有如下权重初始化代码:

##权重初始化
print("loading init weights..................")
for key in pre_model_weigths:
    print("name:", key)
    if pre_model_weigths[key].shape != cust_model_weigths[key].shape:
        wt = pre_model_weigths[key]
        cust_model_weigths[key] = wt[keep_tokens, :]
    else:
        cust_model_weigths[key] = pre_model_weigths[key]

当 pre_model_weigths[key].shape != cust_model_weigths[key].shape时,cust_model_weigths[key] = wt[keep_tokens, :],也就是说当自定义词表的词不在预训练模型的词表中时,是不做更新的是不,那不在预训练词表中的词微调后是不是也就没有效果了。

wangjiannan98 commented 1 month ago

我最近在使用 TrOCR 做手写签名识别,自定义数据集中有些词不在 hand-write(中文手写) 预训练模型中。

wang-zhix commented 1 month ago

这是在用预训练模型的参数来初始化新模型的参数,由于扩充词表了,新模型的参数比之前多,之前没有的参数肯定是没办法初始化到新模型的。这里的代码就是在处理这个问题。 而在训练的时候只会使用新模型,跟预训练模型不再有关系,新模型中的参数肯定都会被优化的。

wangjiannan98 commented 1 month ago

这是在用预训练模型的参数来初始化新模型的参数,由于扩充词表了,新模型的参数比之前多,之前没有的参数肯定是没办法初始化到新模型的。这里的代码就是在处理这个问题。 而在训练的时候只会使用新模型,跟预训练模型不再有关系,新模型中的参数肯定都会被优化的。

懂了,也就是说在 pre_model_weigths = pre_model.state_dict() 的时候,pre_model_weigth 嵌入层已经是一个更新了新词表大小的初始化模型。

十分感谢老师的回答