尧图精选

Transformers-Tutorials 中的 Perceiver IO 实战指南:用单一架构统一文本、图像、光流与多模态数据的推理与微调

🕒 发布时间:2026/10/2 13:46:15 📁 来源:尧图网络
示例工程【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials点击查看免费下载导读Perceiver 与 Perceiver IO 是 DeepMind 在 2021 年提出的通用感知架构它用一组与输入无关的 latent 变量替代直接对输入做自注意力从而把自注意力的计算复杂度从输入的二次方变为与输入规模无关的常数。本文以 Transformers-Tutorials 仓库的 Perceiver 目录 为骨架完整讲解如何在 HuggingFace TransformersPyTorch 实现中加载 DeepMind 官方开源的语言、视觉、光流与多模态 checkpoint并通过 5 个可运行 notebook 掌握掩码语言建模、图像分类含三种预处理变体、图像/文本分类微调、光流预测以及视频多模态自动编码。读完本文你将理解 Perceiver 系列各模型差异的本质preprocessor / decoder / postprocessor并能直接上手运行仓库中的全部演示。一、为什么是 Perceiver从自注意力的二次复杂度谈起标准 Transformer 的自注意力机制需要在输入序列内部的每对元素之间计算相关性其时间与内存复杂度均为输入长度的平方 O(n²)。当输入是长文本、高分辨率图像或视频时这种开销会迅速变得不可接受——这正是 BERT 只能处理 512 个 subword、ViT 需要把图像切成 patch 的根本原因之一。Perceiver 的核心设计非常优雅不把自注意力施加在输入上而是施加在一组数量不大且与具体输入无关的 latent 变量上。正如 Perceiver/README.md 所描述的输入只用于与 latent 做cross-attention交叉注意力把输入信息“注入”latentlatent 之间再做自注意力由于 latent 数量固定且远小于输入规模输入的文本、图像、音频、视频等无论多长、多大都不会影响自注意力操作的内存与算力需求。从仓库中 notebook 打印的模型结构可以看到这种设计的落地形态以PerceiverForImageClassificationLearned为例见 Fine_tune_the_Perceiver_for_image_classification.ipynbPerceiverImagePreprocessor把像素输入转换为 latent 可消费的表示PerceiverEncoder由PerceiverLayer组成每一层同时包含一次 cross-attentionlatent 查询输入与 latent 间的自注意力PerceiverSelfAttention内部layernorm1作用于 latent如 1024 维、layernorm2作用于输入如 512 维query 由 latent 投影而来、key/value 由输入投影而来——这正是“latent 查询输入”的实现证据。二、从 Perceiver 到 Perceiver IO从任意输入到任意输出Perceiver 解决了“任意输入”的问题但最初只能输出固定形式如类别标签。Perceiver IO 把同样的思路扩展到输出侧不直接让解码器消费全部输入信息而是用一组通常很小的输出 query 与 latent 做 cross-attention从而让模型可以处理任意结构、任意规模的输出。因此不同任务的 Perceiver 模型之间的差异几乎全部集中在三个组件上Perceiver/README.md 明确指出了这一点组件职责不同任务的差异点Preprocessor输入预处理器把原始输入文本字节、像素、音轨转换成输入嵌入并可能叠加位置编码或卷积下采样文本用 byte embedding 位置 embedding图像用 1x1 卷积 位置编码或 Fourier 位置编码、ConvMaxPoolDecoder解码器用输出 query 与 encoder 的 latent 做 cross-attention产生目标维度的输出分类用PerceiverClassificationDecoderMLM 用 embedding 解码器光流/多模态用对应结构化解码器Postprocessor输出后处理器可选把解码输出整理成任务所需形式光流缩放、多模态分块输出等DeepMind 将 Perceiver 系列最初用 JAX/Haiku 编写全部开源本仓库作者将这些模型逐一移植为PyTorch 实现并在 HuggingFace Transformers 中提供了开箱即用的类与预训练权重。论文中展示的多模态成果包括掩码语言建模、图像分类、光流预测、多模态自动编码、游戏等README 特别指出“任何你能用 BERT/ViT/Wav2Vec2/DETR 完成的任务问答、命名实体识别、目标检测、音频分类等Perceiver 同样可以完成”。三、仓库中的 5 个 Perceiver notebook 全景Perceiver/README.md 列出的 5 个 notebook 覆盖了“开箱推理”与“自定义微调”两大场景均基于 DeepMind 官方 Colab 改写并补充了社区实用内容Notebook任务核心类预训练 checkpointPerceiver_for_masked_language_modeling_and_image_classification.ipynb掩码语言建模 图像分类三种预处理变体PerceiverForMaskedLM、PerceiverForImageClassificationLearned、PerceiverForImageClassificationFourier、PerceiverForImageClassificationConvProcessingdeepmind/language-perceiver、deepmind/vision-perceiver-*Fine_tune_the_Perceiver_for_image_classification.ipynbCIFAR-10 图像分类微调原生 PyTorchPerceiverForImageClassificationLearneddeepmind/vision-perceiver-learnedFine_tune_Perceiver_for_text_classification.ipynbIMDB 文本情感分类微调原生 PyTorchPerceiverForSequenceClassificationdeepmind/language-perceiverPerceiver_for_Optical_Flow.ipynbSintel 双帧光流预测 Gradio 交互演示PerceiverForOpticalFlowdeepmind/optical-flow-perceiverPerceiver_for_Multimodal_Autoencoding.ipynbUCF101 视频图像音频标签多模态自动编码PerceiverForMultimodalAutoencodingdeepmind/multimodal-perceiver根目录 README.md 的 Perceiver IO 小节对应 README.md#L90-L95同样收录了这 5 个入口。下文逐一深入。四、环境准备安装 Transformers 与 Datasets所有 notebook 的第一步都是安装依赖。推理场景只需 Transformers!pip install -q githttps://github.com/huggingface/transformers.git微调场景还需 Datasets 库Fine_tune_the_Perceiver_for_image_classification.ipynb!pip install -q transformers datasets光流 notebook 额外建议使用 GPU作者在 notebook 开头注明“advised to run this notebook on GPU, for faster inference”并可选用gradio构建交互界面、opencv-pythoncv2做 HSV 光流可视化。多模态 notebook 还需要ffmpeg用于从视频抽取音频与imageio、scipy.io.wavfile等工具。五、用 Perceiver 做掩码语言建模直接消费原始字节Perceiver_for_masked_language_modeling_and_image_classification.ipynb 的第一个实验展示了文本上的推理。与 BERT 不同PerceiverForMaskedLM不依赖 WordPiece 等 subword 分词而是直接以原始 UTF-8 字节作为输入作者将最大序列长度设为2048 字节是为了与 BERT 的 512 个 subword 做公平对比。from transformers import PerceiverTokenizer, PerceiverForMaskedLM import torch tokenizer PerceiverTokenizer.from_pretrained(deepmind/language-perceiver) model PerceiverForMaskedLM.from_pretrained(deepmind/language-perceiver) device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) text This is an incomplete sentence where some words are missing. # 将文本编码为字节 ID并填充到 max_length2048 encoding tokenizer(text, paddingmax_length, return_tensorspt) # 把目标 span 的字节 ID 替换为 mask token ID encoding.input_ids[0, 52:61] tokenizer.mask_token_id inputs, input_mask encoding.input_ids.to(device), encoding.attention_mask.to(device)几个关键细节分词即字节映射notebook 注释明确写道“tokenize只是把文本转成字节 ID 序列”因此tokenizer.decode可直接还原输入可看到[CLS]、[SEP]、[MASK]、[PAD]等特殊 token 混入字节流Mask span 技巧作者指出若被 mask 的文本段以空格开头模型的补全效果会明显更好示例中 mask 的是 missing.即从空格开始的 9 个字节位置词汇表大小 262模型输出 logits 形状为(batch_size, seq_len, vocab_size)即(1, 2048, 262)其中 262 256字节 6保留特殊 token。对应地文本预处理器在结构上就是一个Embedding(262, 768) 位置Embedding(2048, 768)可从文本微调 notebook 打印的PerceiverTextPreprocessor结构确认。前向传播后取logits[0, 51:61]中argmax并解码即可得到被 mask 的 span。notebook 保存的真实运行结果是成功补全出 missing.。六、用 Perceiver 做图像分类三种预处理变体的对比同一个 notebook 的第二部分把同样的架构切换到图像。Perceiver 作者为图像分类发布了3 个仅预处理方式不同的变体均使用PerceiverFeatureExtractor把图片处理为224×224center crop resize 逐通道归一化变体类名预处理方式预训练 checkpointPerceiverForImageClassificationLearned给像素值叠加可学习的绝对位置嵌入deepmind/vision-perceiver-learnedPerceiverForImageClassificationFourier叠加固定的 Fourier 2D 位置嵌入deepmind/vision-perceiver-fourierPerceiverForImageClassificationConvProcessing先做Conv2D maxpool下采样再送入 cross-attentiondeepmind/vision-perceiver-conv推理代码三者几乎一致以 Learned 变体为例from transformers import PerceiverFeatureExtractor, PerceiverForImageClassificationLearned from PIL import Image import requests image Image.open(requests.get(url, streamTrue).raw) feature_extractor PerceiverFeatureExtractor.from_pretrained(deepmind/vision-perceiver-learned) model PerceiverForImageClassificationLearned.from_pretrained(deepmind/vision-perceiver-learned) model.to(device) encoding feature_extractor(image, return_tensorspt) inputs, input_mask encoding.pixel_values.to(device), None outputs model(inputs, input_mask) logits outputs.logits print(Predicted class:, model.config.id2label[logits.argmax(-1).item()])模型在 ImageNet-1k1000 类上预训练故 logits 形状为(batch_size, num_labels) (1, 1000)。三个变体对示例图像一只猫的预测结果一致tabby, tabby cat。结构上Learned 变体的PerceiverImagePreprocessor包含convnet_1x1: Conv2d(3, 256, kernel_size(1, 1))、PerceiverTrainablePositionEncoding与positions_projection: Linear(256, 256)——这就是“可学习位置嵌入叠加到像素特征”的源码实现。七、微调实战一CIFAR-10 图像分类Fine_tune_the_Perceiver_for_image_classification.ipynb 演示了完整的“数据加载 → 特征提取 → 换头微调 → 评估”流程。为便于演示只取 CIFAR-10 的小样本train[:500]、test[:200]再按 10% 切出验证集。7.1 用set_transform做内存友好的按需预处理HuggingFace Datasets 的图像列是 PIL 对象而 Apache Arrow 后端不认识 PyTorch Tensor。作者推荐用Dataset.set_transform在取样本时才实时预处理避免把全部预处理结果驻留内存from transformers import PerceiverFeatureExtractor import numpy as np feature_extractor PerceiverFeatureExtractor() def preprocess_images(examples): examples[pixel_values] feature_extractor(examples[img], return_tensorspt).pixel_values return examples train_ds.set_transform(preprocess_images) val_ds.set_transform(preprocess_images) test_ds.set_transform(preprocess_images)特征提取器把 PIL 图像转成(3, 224, 224)的归一化张量。注意notebook 也提醒该特征提取器“相当基础”只做 center crop resize 归一化若要更好效果应叠加 torchvision / albumentations 等数据增强作者在仓库的 VisionTransformer 微调 notebook 中给出过示例。7.2 构建 DataLoader 并验证形状from torch.utils.data import DataLoader import torch def collate_fn(examples): pixel_values torch.stack([example[pixel_values] for example in examples]) labels torch.tensor([example[label] for example in examples]) return {pixel_values: pixel_values, labels: labels} train_batch_size eval_batch_size 2 train_dataloader DataLoader(train_ds, shuffleTrue, collate_fncollate_fn, batch_sizetrain_batch_size) val_dataloader DataLoader(val_ds, collate_fncollate_fn, batch_sizeeval_batch_size) test_dataloader DataLoader(test_ds, collate_fncollate_fn, batch_sizeeval_batch_size) batch next(iter(train_dataloader)) assert batch[pixel_values].shape (train_batch_size, 3, 224, 224) assert batch[labels].shape (train_batch_size,)7.3 用ignore_mismatched_sizesTrue替换分类头微调的核心是只替换解码器的最后一层投影ImageNet 预训练头是 1000 个输出神经元而 CIFAR-10 只需要 10 个。由于解码器使用与预训练相同的可学习输出 querycross-attention 输出保持一致仅最终投影层被随机初始化from transformers import PerceiverForImageClassificationLearned id2label {idx: label for idx, label in enumerate(train_ds.features[label].names)} label2id {label: idx for idx, label in id2label.items()} model PerceiverForImageClassificationLearned.from_pretrained( deepmind/vision-perceiver-learned, num_labels10, id2labelid2label, label2idlabel2id, ignore_mismatched_sizesTrue, # 允许头部维度不一致1000 → 10 ) model.to(device)运行时会输出权重形状不匹配的提示确认只有perceiver.decoder.decoder.final_layer.weight/bias被重新初始化[1000, 1024] → [10, 1024]其余权重全部继承自 checkpoint。同时 notebook 指出三个视觉变体中用 Conv 预处理的那一个PerceiverForImageClassificationConvProcessing通常取得最好效果此处用 Learned 变体仅为示例。7.4 原生 PyTorch 训练循环与评估使用AdamWlr5e-5训练 2 个 epoch每一步打印 loss 与 batch 内准确率from transformers import AdamW from tqdm.notebook import tqdm from sklearn.metrics import accuracy_score optimizer AdamW(model.parameters(), lr5e-5) model.train() for epoch in range(2): for batch in tqdm(train_dataloader): inputs batch[pixel_values].to(device) labels batch[labels].to(device) optimizer.zero_grad() outputs model(inputsinputs, labelslabels) loss outputs.loss loss.backward() optimizer.step() predictions outputs.logits.argmax(-1).cpu().detach().numpy() accuracy accuracy_score(y_truebatch[labels].numpy(), y_predpredictions) print(fLoss: {loss.item()}, Accuracy: {accuracy})从保存的运行输出可见 loss 从 ~2.6 一路下降到 0.01 以下多数 step 达到 batch 内 100% 准确率。评估阶段用 Datasets 的load_metric(accuracy)逐 batch 累计后compute()作者记录的验证集准确率约为74%不同随机种子下跑出过 78%、66%并强调要获得更好结果需在完整数据集上训练——这符合小样本演示的预期也提醒读者不要把小样本数字当作模型上限。八、微调实战二IMDB 文本分类Fine_tune_Perceiver_for_text_classification.ipynb 把同一个架构用于 IMDB 情感二分类评论是正面还是负面数据仅取train[:10]train[-10:]、test[:5]test[-5:]。8.1 数据准备字节级 tokenizer 2048 长度填充from transformers import PerceiverTokenizer from datasets import load_dataset tokenizer PerceiverTokenizer.from_pretrained(deepmind/language-perceiver) train_ds train_ds.map(lambda examples: tokenizer(examples[text], paddingmax_length, truncationTrue), batchedTrue) test_ds test_ds.map(lambda examples: tokenizer(examples[text], paddingmax_length, truncationTrue), batchedTrue) train_ds.set_format(typetorch, columns[input_ids, attention_mask, label])由于是字节级模型tokenizer 需把每条影评填充/截断到 2048 字节长度decode后能看到句子末尾是一长串padtoken。验证 DataLoader 批次形状为input_ids: (4, 2048)、attention_mask: (4, 2048)、label: (4,)。8.2 复用语言模型权重做分类PerceiverForSequenceClassification.from_pretrained(deepmind/language-perceiver, num_labels2, id2labelid2label, label2idlabel2id)加载语言 checkpoint 时解码器相关的自注意力权重未初始化会在加载日志中列出分类头为{0: neg, 1: pos}。训练使用AdamWlr5e-5跑 20 个 epochbatch size 4每次前向同时传入input_ids、attention_mask与labelsloss 从 ~0.83 波动下降到 0.020.6 区间。评估同样是load_metric(accuracy)逐 batch 累计。8.3 推理一条评论即可验证text I loved this movie, its super good. input_ids tokenizer(text, return_tensorspt).input_ids outputs model(inputsinput_ids.to(device)) logits outputs.logits predicted_class_idx logits.argmax(-1).item() print(Predicted:, model.config.id2label[predicted_class_idx])注意这里id2label映射被写进model.config推理时无需单独维护映射这正是此前定义id2label/label2id的用途。九、光流预测PerceiverForOpticalFlow的分块推理策略Perceiver_for_Optical_Flow.ipynb 展示了 Perceiver 处理结构化输出的能力预测两张连续帧之间每个像素的运动向量。9.1 加载 Sintel 双帧模型在AutoFlow合成数据集40 万对图像上以368×496分辨率训练作者从 Sintel 数据集的公开样例下载两帧用于推理urls [https://storage.googleapis.com/perceiver_io/sintel_frame1.png, https://storage.googleapis.com/perceiver_io/sintel_frame2.png] image1 Image.open(requests.get(urls[0], streamTrue).raw) image2 Image.open(requests.get(urls[1], streamTrue).raw)9.2 两个关键辅助函数normalize(im)把像素从[0, 255]线性映射到[-1, 1]im / 255.0 * 2 - 1extract_image_patches(x, kernel3, stride1, dilation1)按论文方式为每个像素抽取3×3 邻域 patch用F.pad做类似 TF 的SAMEpadding 后经unfold得到 patch 张量。9.3 任意分辨率的分块拼接推理由于输入图像分辨率与训练分辨率model.config.train_size不一致作者实现compute_optical_flow把图像切成 368×496 的 patch逐 patch 前向再用距 patch 边缘越近权重越小的加权方式缝合FLOW_SCALE_FACTOR20用于把模型输出缩放回真实像素位移量。patch 网格由compute_grid_indices生成相邻 patch 重叠 20 像素并强制最后一个 patch 与图像边界对齐model PerceiverForOpticalFlow.from_pretrained(deepmind/optical-flow-perceiver) TRAIN_SIZE model.config.train_size def compute_grid_indices(image_shape, patch_sizeTRAIN_SIZE, min_overlap20): if min_overlap TRAIN_SIZE[0] or min_overlap TRAIN_SIZE[1]: raise ValueError(...) ys list(range(0, image_shape[0], TRAIN_SIZE[0] - min_overlap)) xs list(range(0, image_shape[1], TRAIN_SIZE[1] - min_overlap)) ys[-1] image_shape[0] - patch_size[0] xs[-1] image_shape[1] - patch_size[1] return itertools.product(ys, xs) flow compute_optical_flow(model, normalize(im1), normalize(im2), compute_grid_indices(im1.shape))每个 patch 的输入形状为(batch_size, num_patches, C, H, W)其中 C、H、W 来自 3×3 kernel 的 patch 维度前向在torch.no_grad()下进行并乘以FLOW_SCALE_FACTOR最后flows / flow_count完成加权平均拼接。9.4 HSV 可视化与 Gradio 演示visualize_flow用 OpenCV 把光流dx, dy转成 HSV 彩色图色调编码方向ang / np.pi / 2 * 180饱和度编码幅度np.clip(mag * 255 / 24, 0, 255)。notebook 最后还构建了一个Gradio 交互应用用户上传任意两帧图片程序自动完成 normalize → 分块 → 前向 → 缝合 → HSV 可视化几秒内返回预测光流图。十、多模态自动编码PerceiverForMultimodalAutoencodingPerceiver_for_Multimodal_Autoencoding.ipynb 是 Perceiver IO “任意输入 任意输出”最完整的体现以 UCF101 的一段短视频为输入模型同时重建图像帧、音频波形并预测视频类别标签。10.1 数据与输入构造从 UCF101 下载第一个视频用 ffmpeg 以 48kHz 采样率抽取出 PCM float 音频pcm_f32le -ar 48000再用load_video读取为 224×224 的帧序列。推理输入是一个包含三个模态的字典inputs { image: torch.from_numpy(np.moveaxis(images, -1, 2)).float().to(device), audio: torch.from_numpy(audio).to(device), label: torch.zeros((images.shape[0], 700)).to(device), # 700 类先用 0 占位 }模型加载时使用low_cpu_mem_usageTrue以缓解大 checkpoint 的内存压力model PerceiverForMultimodalAutoencoding.from_pretrained(deepmind/multimodal-perceiver, low_cpu_mem_usageTrue)10.2 分块解码与subsampled_output_points关键设计是整段视频如 16 帧全部参与 encoder 与 latent 的 cross-attention但解码器只为“被采样到的输出点”生成 query。代码把输出分成 128 个 chunk每轮只对一部分图像 patch、音频 patch 与标签做解码AUDIO_SAMPLES_PER_FRAME 48000 // 25 # 每帧对应的音频采样数 SAMPLES_PER_PATCH 16 nchunks 128 image_chunk_size np.prod(images.shape[1:-1]) // nchunks audio_chunk_size audio.shape[1] // SAMPLES_PER_PATCH // nchunks subsampling { image: torch.arange(image_chunk_size * chunk_idx, image_chunk_size * (chunk_idx 1)), audio: torch.arange(audio_chunk_size * chunk_idx, audio_chunk_size * (chunk_idx 1)), label: None, # 标签是全局的无需分块 } outputs model(inputsinputs, subsampled_output_pointssubsampling)这种“输出点采样”正是 Perceiver IO 处理超大输出的通用手段模型输出规模不再受限于显存可分块逐步重建整个视频。完成后把 128 个 chunk 的image、audio输出拼回即可用to_gif/play_audio可视化重建结果。10.3 标签预测标签分支输出 700 维 logits取 top-5 并softmax归一化后打印scores, indices torch.topk(torch.softmax(reconstruction[label], dim1), k5) for score, index in zip(scores[0], indices[0]): print(%s: %s % (model.config.id2label[index.item()], score.item()))这里再次印证model.config.id2label是推理阶段的标准工具。十一、延伸可能从 BERT/ViT/Wav2Vec2/DETR 到 Perceiver如 Perceiver/README.md 所言以上 5 个 notebook 只是 Perceiver 能力的“冰山一角”。由于输入预处理器、解码器、后处理器可以自由组合同一个 latent 自注意力引擎可以覆盖问答、命名实体识别、目标检测、音频分类等任务——凡是 BERT / ViT / Wav2Vec2 / DETR 能做到的Perceiver 都能以“输入规模不再影响自注意力成本”的方式再做一遍。这使它特别适合长输入长文档、高分辨率图像、长视频与结构化输出逐像素、逐采样点、逐 patch 的预测的场景。十二、快速参考本文涉及的类、checkpoint 与关键参数用途类checkpoint关键参数文本分词PerceiverTokenizerdeepmind/language-perceiverpaddingmax_length2048 字节掩码语言建模PerceiverForMaskedLMdeepmind/language-perceiver输入(1, 2048)输出(1, 2048, 262)图像分类LearnedPerceiverForImageClassificationLearneddeepmind/vision-perceiver-learned输出(1, 1000)图像分类FourierPerceiverForImageClassificationFourierdeepmind/vision-perceiver-fourier固定 Fourier 2D 位置嵌入图像分类ConvPerceiverForImageClassificationConvProcessingdeepmind/vision-perceiver-convConv2D maxpool 预处理文本分类微调PerceiverForSequenceClassificationdeepmind/language-perceivernum_labels2、AdamW lr5e-5图像分类微调PerceiverForImageClassificationLearneddeepmind/vision-perceiver-learnedignore_mismatched_sizesTrue、num_labels10光流预测PerceiverForOpticalFlowdeepmind/optical-flow-perceivertrain_size(368, 496)、FLOW_SCALE_FACTOR20、patch 重叠 20多模态自动编码PerceiverForMultimodalAutoencodingdeepmind/multimodal-perceiverlow_cpu_mem_usageTrue、subsampled_output_points、128 chunk图像预处理PerceiverFeatureExtractor—center crop resize normalize 到 224×224如需从零开始运行建议按“环境准备 → 掩码语言建模/图像分类推理 → 两类微调 → 光流 → 多模态自动编码”的顺序阅读 Perceiver/README.md 中链接的 5 个 notebook它们都保留了完整的代码、注释与真实运行输出可作为直接复现的教程。赞分享示例工程【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials点击查看免费下载相关推荐Transformers 中的 Perceiver IO以线性复杂度处理字节级文本、图像与多模态数据的通用架构Transformers 中的 Perceiver IO以线性复杂度处理字节级文本、图像与多模态数据的通用架构 Perceiver IOPerceiver人工智能大模型深度学习NLP预训练微调模型推理服务Fleet AI 编码工具中断处置手册Claude Code 不可用时切换到 GitHub Copilot 保持交付Fleet AI 编码工具中断处置手册Claude Code 不可用时切换到 GitHub Copilot 保持交付 本指南源自 AI coding tool示例工程Transformers-Tutorials 实战基于 Donut 的文档智能 —— 从零到一完成表单解析、DocVQA 与文档图像分类的推理与微调Transformers Tutorials 实战基于 Donut 的文档智能 —— 从零到一完成表单解析、DocVQA 与文档图像分类的推理与微调 Donu示例工程上一篇NocoBase 操作二次确认Double Check防止误操作确认弹窗的配置与实现原理下一篇effect/openapi-generator 深入解析从 OpenAPI 规格生成 Effect Schema、HTTP 客户端与 HttpApi 模块创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →