预训练权重的限制
基于对
microsoft/trocr-base-printed预训练模型文件夹中的各个文件的理解,思考以下问题:
1、你觉得哪些文件在TrOCR的训练中起到作用,并简短说明是什么作用。
2、哪些文件经过TrOCR的训练调参后发生改变(也就是说通过训练得到的,而不是人物设计的)。
3、一些对于TrOCR模型的训练和推理都没有作用的文件,是在哪里起作用,是识别完文字的下一个阶段用到?
4、训练不改变内容,在仅仅用于文字识别TrOCR任务的训练推理时,不起作用的文件是否就可以删除?
5、预训练权重是这些,那微调后的权重文件夹内容也是这些吗?
1、在TrOCR训练中起作用的文件及作用
config.json:定义模型整体架构(编码器/解码器层数、维度等),是训练时模型结构的“蓝图”,决定网络参数的初始化和计算逻辑。preprocessor_config.json:规定图像预处理规则(缩放、归一化等),确保训练数据的输入格式与模型要求一致。tokenizer_config.json、vocab.json、merges.txt、special_tokens_map.json:共同定义文本分词逻辑(词表、子词合并规则、特殊标记),将训练文本转换为模型可理解的Token ID。model.safetensors:存储初始预训练权重,训练中会基于新数据更新这些权重参数。generation_config.json:控制训练时文本生成的策略(如起始/结束标记、生成长度限制),影响模型的拟合方向。
2、训练调参后发生改变的文件(训练得到,非人工设计)
仅 model.safetensors。
该文件存储模型的所有权重参数(编码器/解码器的注意力权重、层归一化参数等),训练过程中通过反向传播不断更新这些参数,是唯一由训练直接生成的文件。其他文件(如配置文件、分词文件)均为人工设计的“规则/结构定义”,训练中不会被修改。
3、对训练和推理无直接作用的文件及作用场景
README.md:是模型的说明文档,用于指导用户理解模型用途、使用方法、引用信息等,不参与训练/推理计算,仅在用户学习和使用模型时提供参考。.gitattributes:是Git版本控制的配置文件,用于指定大文件(如model.safetensors)由Git LFS管理,确保仓库高效存储和协作,与模型的训练/推理功能无关,仅作用于代码仓库的版本管理环节。
这些文件与“文字识别后的下阶段”无关,主要服务于模型的分发、管理和用户指导。
4、训练不改变内容且对识别任务无直接作用的文件是否可删除?
不建议删除。
README.md是快速上手模型的关键参考,删除后用户难以了解模型用法和限制;.gitattributes缺失会导致Git无法正确处理大文件(如model.safetensors可能被当作普通文件存储,导致仓库膨胀),影响后续版本管理和协作。
仅在极端极简部署场景(如嵌入式设备),且明确无需版本管理和用户指导时,可考虑删除,但需谨慎。
5、预训练权重与微调后权重的文件夹内容是否相同?
基本相同,核心文件结构一致。
微调仅更新 model.safetensors(权重参数),可能会调整 generation_config.json(若微调时修改了生成策略),但其他文件(config.json、分词文件、预处理配置等)均保持不变——因为微调是在预训练模型的结构基础上调整权重,不会改变模型的架构、数据处理规则等“底层设计”。
模型前向传播
查看模型结构和词表长度
现在我print出了加载预训练权重模型结构:
from transformers import VisionEncoderDecoderModel
PRETRAINED_MODEL_PATH = r"C:\Users\Virgil\Desktop\TrOCR\trocr-base-printed"
model = VisionEncoderDecoderModel.from_pretrained(PRETRAINED_MODEL_PATH)
print("模型结构")
print(model)
print("------------------------------------------")
model.config.vocab_size = model.config.decoder.vocab_size
print("词表长度:")
print(model.config.vocab_size)
VisionEncoderDecoderModel(
(encoder): ViTModel(
(embeddings): ViTEmbeddings(
(patch_embeddings): ViTPatchEmbeddings(
(projection): Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16))
)
(dropout): Dropout(p=0.0, inplace=False)
)
(encoder): ViTEncoder(
(layer): ModuleList(
(0-11): 12 x ViTLayer(
(attention): ViTAttention(
(attention): ViTSelfAttention(
(query): Linear(in_features=768, out_features=768, bias=False)
(key): Linear(in_features=768, out_features=768, bias=False)
(value): Linear(in_features=768, out_features=768, bias=False)
)
(output): ViTSelfOutput(
(dense): Linear(in_features=768, out_features=768, bias=True)
(dropout): Dropout(p=0.0, inplace=False)
)
)
(intermediate): ViTIntermediate(
(dense): Linear(in_features=768, out_features=3072, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): ViTOutput(
(dense): Linear(in_features=3072, out_features=768, bias=True)
(dropout): Dropout(p=0.0, inplace=False)
)
(layernorm_before): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(layernorm_after): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
)
)
)
(layernorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(pooler): ViTPooler(
(dense): Linear(in_features=768, out_features=768, bias=True)
(activation): Tanh()
)
)
(decoder): TrOCRForCausalLM(
(model): TrOCRDecoderWrapper(
(decoder): TrOCRDecoder(
(embed_tokens): TrOCRScaledWordEmbedding(50265, 1024, padding_idx=1)
(embed_positions): TrOCRLearnedPositionalEmbedding(514, 1024)
(layernorm_embedding): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(layers): ModuleList(
(0-11): 12 x TrOCRDecoderLayer(
(self_attn): TrOCRAttention(
(k_proj): Linear(in_features=1024, out_features=1024, bias=True)
(v_proj): Linear(in_features=1024, out_features=1024, bias=True)
(q_proj): Linear(in_features=1024, out_features=1024, bias=True)
(out_proj): Linear(in_features=1024, out_features=1024, bias=True)
)
(activation_fn): GELUActivation()
(self_attn_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(encoder_attn): TrOCRAttention(
(k_proj): Linear(in_features=768, out_features=1024, bias=True)
(v_proj): Linear(in_features=768, out_features=1024, bias=True)
(q_proj): Linear(in_features=1024, out_features=1024, bias=True)
(out_proj): Linear(in_features=1024, out_features=1024, bias=True)
)
(encoder_attn_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(fc1): Linear(in_features=1024, out_features=4096, bias=True)
(fc2): Linear(in_features=4096, out_features=1024, bias=True)
(final_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
)
)
)
)
(output_projection): Linear(in_features=1024, out_features=50265, bias=False)
)
)
打印出的词表长度:50265
前向传播与输出logits讲解
每一轮训练
# 前向传播(获取解码器输出logits)
outputs = model(pixel_values=pixel_values, labels=labels)
logits = outputs.logits
# 形状: (batch_size, max_length, vocab_size)
在TrOCR训练的每一轮前向传播中,model(pixel_values=pixel_values, labels=labels) 是核心计算过程,结合模型结构可拆解为以下步骤,最终得到的 logits 是模型预测的核心输出:
1. model()的输入解析
pixel_values:预处理后的图像张量,形状通常为(batch_size, 3, 384, 384)(批量大小、RGB通道、图像尺寸)。由preprocessor_config.json定义的规则处理(缩放、归一化等),确保与编码

最低0.47元/天 解锁文章
6648

被折叠的 条评论
为什么被折叠?



