【TrOCR】根据任务特性设计词表vocab.json

预训练权重的限制

基于对microsoft/trocr-base-printed预训练模型文件夹中的各个文件的理解,思考以下问题:
1、你觉得哪些文件在TrOCR的训练中起到作用,并简短说明是什么作用。
2、哪些文件经过TrOCR的训练调参后发生改变(也就是说通过训练得到的,而不是人物设计的)。
3、一些对于TrOCR模型的训练和推理都没有作用的文件,是在哪里起作用,是识别完文字的下一个阶段用到?
4、训练不改变内容,在仅仅用于文字识别TrOCR任务的训练推理时,不起作用的文件是否就可以删除?
5、预训练权重是这些,那微调后的权重文件夹内容也是这些吗?

1、在TrOCR训练中起作用的文件及作用

  • config.json:定义模型整体架构(编码器/解码器层数、维度等),是训练时模型结构的“蓝图”,决定网络参数的初始化和计算逻辑。
  • preprocessor_config.json:规定图像预处理规则(缩放、归一化等),确保训练数据的输入格式与模型要求一致。
  • tokenizer_config.jsonvocab.jsonmerges.txtspecial_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 定义的规则处理(缩放、归一化等),确保与编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值