UDOP模型由唐振能、杨知毅、王国昕、方宇伟、刘洋、朱长光、曾泽、张家超、班莫希在《统一视觉、文本和布局以实现通用文档处理》(Unifying Vision, Text, and Layout for Universal Document Processing)一文中提出。UDOP采用基于T5的编码器-解码器Transformer架构,用于文档AI任务,例如文档图像分类、文档解析和文档视觉问答。
该论文的摘要如下
我们提出了通用文档处理(UDOP),这是一个基础文档AI模型,它统一了文本、图像和布局模式以及各种任务格式,包括文档理解和生成。UDOP利用文本内容和文档图像之间的空间相关性,用一种统一表示形式来建模图像、文本和布局模式。通过新颖的视觉-文本-布局Transformer,UDOP将预训练和多领域下游任务统一到一个基于提示的序列生成方案中。UDOP在大型未标记文档语料库和多种标注数据上使用创新的自监督目标和多种标注数据进行预训练。UDOP还通过遮蔽图像重建学习从文本和布局模式生成文档图像。据我们所知,这是文档AI领域首次实现了一种模型同时达到高质量的神经文档编辑和内容定制。我们的方法在包括金融报告、学术论文和网站在内的各种数据域的9项文档AI任务上,如文档理解和问答,上取得了最先进的成果。UDOP在文档理解基准测试(DUE)的排行榜上名列第一。
UDOP架构。摘自原始论文(原文链接)使用技巧
- 除了input_ids之外,UdopForConditionalGeneration还期望输入
bbox
,即输入标记的边界框(即2D位置)。可以使用如Google的Tesseract(提供了一个Python封装)之类的OCR引擎来获取这些边界框。每个边界框应以(x0, y0, x1, y1)格式表示,其中(x0, y0)对应于边界框中左上角的位置,而(x1, y1)代表右下角的位置。请注意,首先需要将边界框规范化为0-1000的比例。为了规范化,您可以使用以下函数
def normalize_bbox(bbox, width, height):
return [
int(1000 * (bbox[0] / width)),
int(1000 * (bbox[1] / height)),
int(1000 * (bbox[2] / width)),
int(1000 * (bbox[3] / height)),
]
在这里,width
和height
对应于原始文档中标记出现的宽度和高度。例如,可以使用Python图像库(PIL)库来获取,如下所示:
from PIL import Image
# Document can be a png, jpg, etc. PDFs must be converted to images.
image = Image.open(name_of_your_document).convert("RGB")
width, height = image.size
可以使用 UdopProcessor 对图像和文本进行预处理,以便模型使用,它可以处理所有这些任务。默认情况下,该类使用 Tesseract 引擎从一个给定的文档中提取单词列表和框(坐标)。其功能与 LayoutLMv3Processor 相当,因此支持在需要时传入 apply_ocr=False
(如果您想使用自己的 OCR 引擎)或 apply_ocr=True
(如果想要使用默认的 OCR 引擎)。有关所有可能的用例,请参阅 LayoutLMv2 使用的指南(UdopProcessor
的功能相同)。
- 如果使用自己选择的 OCR 引擎,建议使用 Azure 的 Read API,它支持所谓的行段。通常,使用段位置嵌入可以提高性能。
- 在推理时,建议使用
generate
方法对文档图像进行自回归文本生成。 - 该模型已经在自监督和监督目标上进行预训练。您可以使用在预训练期间使用的各种任务前缀(提示)来测试开箱即用的功能。例如,可以将“问答。日期是什么?”作为一个提示提供给模型,因为“问答”是在预训练 DocVQA 时使用的任务前缀。有关所有任务前缀,请参阅论文(表 1)。
- 还可以微调 UdopEncoderModel,这是 UDOP 的编码器部分,可以看作是 LayoutLMv3 类似的 Transformer 编码器。对于判别性任务,可以在其上添加线性分类器并在标记的数据集上进行微调。
资源
以下是一些官方 Hugging Face 和社区(通过 🌎 标记)资源列表,用于帮助您开始使用 UDOP。如果您有兴趣提交资源以在此处包含,请随时提交拉取请求,我们将对其进行审查!资源最好能展示新内容,而不是复制现有的资源。
UdopConfig
类 transformers.UdopConfig
< 来源 >( vocab_size = 33201 d_model = 1024 d_kv = 64 d_ff = 4096 num_layers = 24 num_decoder_layers = None num_heads = 16 relative_attention_num_buckets = 32 relative_attention_max_distance = 128 relative_bias_args = [{'type': '1d'}, {'type': 'horizontal'}, {'type': 'vertical'}] dropout_rate = 0.1 layer_norm_epsilon = 1e-06 initializer_factor = 1.0 feed_forward_proj = 'relu' is_encoder_decoder = True use_cache = True pad_token_id = 0 eos_token_id = 1 max_2d_position_embeddings = 1024 image_size = 224 patch_size = 16 num_channels = 3 **kwargs )
参数
- vocab_size (
int
, 可选,默认为 33201) — Udop 模型的词汇量。定义了在调用 UdopForConditionalGeneration 时所能通过inputs_ids
传递的不同标记的数量。 - d_model (
int
, 可选,默认为 1024) — 编码器层和池化层的尺寸。 - d_kv (
int
, 可选,默认为 64) — 每个注意力头中键、查询和值投影的尺寸。投影层的inner_dim
将定义为num_heads * d_kv
。 - d_ff (
int
,可选,默认为4096) — 每个UdopBlock
中中间前馈层的尺寸。 - num_layers (
int
,可选,默认为24) — Transformer编码器和解码器中的隐藏层数。 - num_decoder_layers (
int
,可选) — Transformer解码器中的隐藏层数。如果没有设置,将使用与num_layers
相同的值。 - num_heads (
int
,可选,默认为16) — Transformer编码器和解码器每个注意力层中的注意力头数。 - 《relative_attention_num_buckets》 (
int
,可选,默认为32) — 每一层注意力使用的桶的数量。 - 《relative_attention_max_distance》 (
int
,可选,默认为128) — 为桶分离的长序列的最大距离。 - 《relative_bias_args》 (
List[dict]
,可选,默认为[{'type' -- '1d'}, {'type': 'horizontal'}, {'type': 'vertical'}]
):包含相对偏置层的参数的字典列表。 - dropout_rate (
浮点数
, 可选, 默认为 0.1) — 所有 dropout 层的比例。 - layer_norm_epsilon (
浮点数
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon。 - initializer_factor (
浮点数
, 可选, 默认为 1.0) — 初始化所有权重矩阵的因子(应保持为 1,用于内部初始化测试)。 - feed_forward_proj (
string
, 可选,默认为"relu"
) —— 要使用的前向层类型。应为"relu"
或"gated-gelu"
之一。Udopv1.1使用"gated-gelu"
前向投影。原始Udop使用"relu"
。 - is_encoder_decoder (
bool
, 可选,默认为True
) —— 模型是否应作为编码器/解码器使用。 - use_cache (
bool
, 可选,默认为True
) —— 模型是否应返回最后的关键值注意力(不是所有模型都使用)。 - pad_token_id (
int
, 可选,默认为0) ——词汇表中padding标记的id。 - eos_token_id (
int
, 可选, 默认为1) — 词汇中的序列结束标记的ID。 - max_2d_position_embeddings (
int
, 可选, 默认为1024) — 相对位置编码的最大绝对位置嵌入。 - image_size (
int
, 可选, 默认为224) — 输入图像的大小。 - patch_size (
int
, 可选, 默认为16) — 视觉编码器使用的补丁大小。 - num_channels (
int
, 可选, 默认为3) — 输入图像中的通道数。
这是存储 UdopForConditionalGeneration 配置的配置类。它用于根据指定的参数实例化UDOP模型,定义模型架构。使用默认值实例化配置将产生类似于UDOP microsoft/udop-large 架构的配置。
配置对象继承自 PretrainedConfig 并可用于控制模型输出。请参阅 PretrainedConfig 文档以获取更多信息。
UdopTokenizer
类 transformers.UdopTokenizer
< source >( vocab_file eos_token = '</s>' unk_token = '<unk>' sep_token = '</s>' pad_token = '<pad>' sep_token_box = [1000, 1000, 1000, 1000] pad_token_box = [0, 0, 0, 0] pad_token_label = -100 only_label_first_subword = True additional_special_tokens = None sp_model_kwargs: Optional = None legacy = True add_prefix_space = True **kwargs )
参数
- vocab_file (
str
) - 词汇文件路径。 - eos_token (
str
, 可选,默认为"</s>"
) — 序列结束标记。在构建使用特殊标记的序列时,这不是序列结束时所使用的标记。所使用的标记是
sep_token
。 - unk_token (
str
, 可选,默认为"<unk>"
) — 未知标记。不在词汇表中的标记无法转换为ID,将设置为该标记。 - sep_token (
str
, 可选,默认为"</s>"
) — 分隔符标记,当从多个序列构建序列时使用,例如序列分类的两个序列或问答中用于文本和问题的序列。它也用作使用特殊标记构建的序列的最后一个标记。 - pad_token (
字符串
,可选,默认为"<pad>"
) — 用于填充的标记,例如,在将不同长度的序列批处理时使用。 - sep_token_box (
整数列表
,可选,默认为[1000, 1000, 1000, 1000]
) — 用于特殊[SEP]标记的边界框。 - pad_token_box (
整数列表
,可选,默认为[0, 0, 0, 0]
) — 用于特殊[PAD]标记的边界框。 - sp_model_kwargs (
dict
,可选)- 将传递给SentencePieceProcessor.__init__()
方法。SentencePiece 的 Python 封装器可用于设置,例如:-
enable_sampling
: 启用子词正则化。 -
nbest_size
: 单词采样参数。对于 BPE-Dropout 无效。nbest_size = {0,1}
: 不执行采样。nbest_size > 1
: 从 nbest_size 结果中进行抽样。nbest_size < 0
: 假设 nbest_size 是无限的,使用前向筛选和后向抽样算法从所有假设(格)中进行抽样。
-
alpha
: 单词采样的平滑参数,以及 BPE-Dropout 中合并操作的拒绝概率。
-
- legacy (
bool
,可选,默认为True
)- 是否应使用分词器的legacy
行为。Legacy 是在 #24622 合并之前,其中包括对出现在特殊标记之后的标记进行正确处理的修复。一个简单的例子:legacy=True
:
改编自 LayoutXLMTokenizer 和 T5Tokenizer。基于 SentencePiece。
此分词器继承了 PreTrainedTokenizer,其中包含大多数主要方法。用户应该参考这个超类来获取关于这些方法的更多信息。
build_inputs_with_special_tokens
< 源代码 >( token_ids_0: 列表 token_ids_1: 可选 = None ) → 列表[int]
通过连接并添加特殊标记,从序列或序列对构建用于序列分类任务的模型输入。序列具有以下格式
- 单个序列:
X </s>
- 序列对:
A </s> B </s>
get_special_tokens_mask
< 来源 >( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) → List[int]
从没有添加特殊标记的标记列表中检索序列 ID。此方法在通过标记器 prepare_for_model
方法添加特殊标记时调用。
create_token_type_ids_from_sequences
< source >( token_ids_0: 列表 token_ids_1: 可选 = None ) → 列表[int]
从传入的两个序列创建一个掩码,用于序列对分类任务。T5 不使用标记类型 ID,因此返回一个零列表。
UdopTokenizerFast
类 transformers.UdopTokenizerFast
< 来源 >( vocab_file = None tokenizer_file = None eos_token = '</s>' sep_token = '</s>' unk_token = '<unk>' pad_token = '<pad>' sep_token_box = [1000, 1000, 1000, 1000] pad_token_box = [0, 0, 0, 0] pad_token_label = -100 only_label_first_subword = True additional_special_tokens = None **kwargs )
参数
- vocab_file (
str
, 可选) — 词汇表文件的路径。 - tokenizer_file (
str
, 可选) — 分词器的文件路径。 - eos_token (
str
, 可选, 默认为"</s>"
) — 序列结束标记。 - sep_token (
str
, 可选, 默认为"</s>"
) — 分隔标记,用于从多个序列构建序列时,例如两个序列用于序列分类,或者用于文本和问题的问答。它也被用作用特殊标记构建的序列的最后一个标记。 - unk_token (
str
,可选,默认为"
) — 未知标记。不在词汇表中的标记无法转换为ID,并设置为此标记。" - pad_token (
str
,可选,默认为"
) — 用于填充的标记,例如当批量处理不同长度的序列时。" - sep_token_box (
List[int]
,可选,默认为[1000, 1000, 1000, 1000]
) — 用于特殊[SEP]标记的边界框。 - pad_token_box (
List[int]
,可选,默认为[0, 0, 0, 0]
) — 用于特殊[PAD]标记的边界框。 - pad_token_label (
int
, 可选, 默认为-100) — 用于填充标记的标签。默认为-100,它是PyTorch的CrossEntropyLoss的ignore_index
。 - only_label_first_subword (
bool
, 可选, 默认为True
) — 当提供单词标签时,是否仅标记第一个子词。 - additional_special_tokens (
List[str]
, 可选, 默认为["<s>NOTUSED", "</s>NOTUSED"]
) — 分词器使用的额外特殊标记。
构建一个“快速”UDOP分词器(由HuggingFace的tokenizers库支持)。改编自LayoutXLMTokenizer和T5Tokenizer。基于BPE。
该分词器继承自PreTrainedTokenizerFast,它包含了大多数主要方法。用户应参考这个超类来获取有关这些方法的更多信息。
batch_encode_plus_boxes
< source >( batch_text_or_text_pairs: Union is_pair: bool = None boxes: Optional = None word_labels: Optional = None add_special_tokens: bool = True padding: Union = False truncation: Union = None max_length: Optional = None stride: int = 0 is_split_into_words: bool = False pad_to_multiple_of: Optional = None return_tensors: Union = None return_token_type_ids: Optional = None return_attention_mask: Optional = None return_overflowing_tokens: bool = False return_special_tokens_mask: bool = False return_offsets_mapping: bool = False return_length: bool = False verbose: bool = True **kwargs )
对序列列表或序列对列表进行标记化,并准备好模型。
此方法已弃用,应改用__call__
。
build_inputs_with_special_tokens
< source >( token_ids_0: 列表 token_ids_1: 可选 = None ) → 列表[int]
通过连接和添加特殊标记,从序列或序列对构建用于序列分类任务的模型输入。XLM-RoBERTa序列的格式如下
- 单个序列:
<s> X </s>
- 序列对:
<s> A </s></s> B </s>
调用框
< 源代码 >( text: 联合 text_pair: 联合 = None boxes: 联合 = None word_labels: 联合 = None add_special_tokens: 布尔 = True padding: 联合 = False truncation: 联合 = None max_length: 可选 = None stride: int = 0 pad_to_multiple_of: 可选 = None return_tensors: 联合 = None return_token_type_ids: 可选 = None return_attention_mask: 可选 = None return_overflowing_tokens: 布尔 = False return_special_tokens_mask: 布尔 = False return_offsets_mapping: 布尔 = False return_length: 布尔 = False verbose: 布尔 = True **kwargs ) → BatchEncoding
参数
- text (
str
,List[str]
,List[List[str]]
) — 待编码的序列或序列批。每个序列可以是字符串、字符串列表(单个示例的单词或示例批次的提问)或字符串列表列表(单词批次)。 - text_pair (
List[str]
,List[List[str]]
) — 待编码的序列或序列批次。每个序列应为字符串列表(预处理字符串)。 - boxes (
List[List[int]]
,List[List[List[int]]]
) — 单词级边界框。每个边界框应归一化到0-1000的范围。 - word_labels (
List[int]
,List[List[int]]
, 可选) — 单词级整数标签(用于如FUNSD、CORD这样的标记分类任务)。 - add_special_tokens (
bool
, 可选,默认为True
) — 是否以相对于模型的方式编码序列 特殊标记。 - padding (
bool
或str
或 PaddingStrategy,可选,默认为False
) — 激活并控制填充。接受以下值:True
或'longest'
:填充到批量中最长的序列(或如果只提供了一个序列则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或填充到模型的可接受输入长度的最大值,如果未提供该参数。False
或'do_not_pad'
(默认):不填充(即可以输出具有不同长度的序列的批量)。
- 截断(truncation)(《bool》、《str》或TruncationStrategy,可选,默认为《False》)— 激活并控制截断。接受以下值:
- 《True》或《'longest_first'》:截断到使用《max_length》参数指定的最大长度,或如果不提供该参数,则截断到模型可接受的最大输入长度。如果提供一对序列(或一对序列的批次),则会逐个标记进行截断,从最长的序列中移除一个标记。
- 《'only_first'》:截断到使用《max_length》参数指定的最大长度,或如果不提供该参数,则截断到模型可接受的最大输入长度。如果提供一对序列(或一对序列的批次),则仅截断第一序列。
- 《'only_second'》:截断到使用《max_length》参数指定的最大长度,或如果不提供该参数,则截断到模型可接受的最大输入长度。如果提供一对序列(或一对序列的批次),则仅截断第二序列。
- 《False》或《'do_not_truncate'》(默认):不截断(即可以输出序列长度大于模型最大容许输入大小的批次)。
- 最大长度(max_length)(《int》,可选)— 通过截断/填充参数之一来控制使用的最大长度。
如果未设置或设置为《None》,则该值将在需要截断/填充参数最大长度时使用预定义的模型最大长度。如果模型没有特定的最大输入长度(如XLNet),则不会激活截断/填充到最大长度。
- stride (
int
, 可选, 默认值 0) — 如果与max_length
一起设置,并且将return_overflowing_tokens=True
,当返回溢出标记时将包含一些标记,这些标记来自截断序列的末尾,以提供截断序列和溢出序列之间的重叠。此参数的值定义重叠标记的数量。 - pad_to_multiple_of (
int
, 可选) — 如果设置了,将序列填充到提供值的倍数。这对于在 NVIDIA 硬件上的 Tesla 核心使用(算力 >= 7.5 的 Volta)特别有用。 - return_tensors (
str
或 TensorType, 可选) — 如果设置了,将返回张量而不是 Python 整数列表。可接受的值包括: - return_token_type_ids (
bool
, 可选) — 是否返回标记类型ID。若未指定,将根据特定标记化器的默认设置返回标记类型ID,该默认设置由return_outputs
属性定义。 - return_attention_mask (
bool
, 可选) — 是否返回注意力掩码。若未指定,将根据特定标记化器的默认设置返回注意力掩码,该默认设置由return_outputs
属性定义。 - return_overflowing_tokens (
bool
, 可选, 默认为False
) — 是否返回溢出的标记序列。当提供输入ID序列的成对序列(或一对序列的批次)并且truncation_strategy = longest_first
或True
时,将引发错误而不是返回溢出标记。 - 返回特殊词元掩码 (
布尔值
,可选,默认为False
) — 是否返回特殊词元掩码信息。 - 返回偏移映射 (
布尔值
,可选,默认为False
) — 是否为每个标记返回(char_start, char_end)
。 - 返回编码输入的长度 (
布尔值
,可选,默认为False
) — 是否返回编码输入的长度。 - verbose (
bool
, 可选, 默认为True
) — 是否打印更多信息和警告。**kwargs** — 传递给self.tokenize()
方法
返回值
包含以下字段的 BatchEncoding
-
input_ids — 要输入模型中的 token id 列表。
-
bbox — 要输入模型中的边界框列表。
-
token_type_ids — 要输入模型中的 token 类型 id 列表(当
return_token_type_ids=True
或 “token_type_ids” 在self.model_input_names
中时)。 -
attention_mask — 指定模型应该关注的 token 的索引列表(当
return_attention_mask=True
或 “attention_mask” 在self.model_input_names
中时)。 -
labels — 要输入模型的标签列表。(当指定了
word_labels
时)。 -
overflowing_tokens — 超出长度限制的 token 序列列表(当指定了
max_length
并且return_overflowing_tokens=True
时)。 -
num_truncated_tokens — 被截断的 token 数量(当指定了
max_length
并且return_overflowing_tokens=True
时)。 -
special_tokens_mask — 包含 0 和 1 的列表,其中 1 表示添加了特殊 token,0 表示正则序列 token(当
add_special_tokens=True
并且return_special_tokens_mask=True
时)。 -
length — 输入的长度(当
return_length=True
时)。
主方法,用于将要或多个序列或一个或多个序列对的 word-level 标准化边界框和可选标签进行标记化并准备用于模型。
create_token_type_ids_from_sequences
< source >( token_ids_0: 列表 token_ids_1: 可选 = None ) → 列表[int]
从传递给序列对分类任务的两个序列中创建一个掩码。XLM-RoBERTa不使用标记类型ID,因此返回一个零列表。
encode_boxes
< source >( text: 联合 text_pair: 联合 = None boxes: 可选 = None word_labels: 可选 = None add_special_tokens: 布尔 = True padding: 联合 = False truncation: 联合 = None max_length: 可选 = None stride: int = 0 return_tensors: 联合 = None **kwargs )
参数
- Converts 将字符串转换为ID序列(整数),使用词元化和词汇进行。等同于进行 ——
self.convert_tokens_to_ids(self.tokenize(text))
。 —— text(《str》,《List[str>`或`List[int]`);要编码的第一个序列。这可以是一个字符串,一个字符串列表(使用`tokenize`方法标记的字符串)或一个整数列表(使用`convert_tokens_to_ids`方法标记的字符串ID)。text_pair(《str》,《List[str>`或`List[int]`,《可选》):可选的第二个要编码的序列。这可以是一个字符串,一个字符串列表(使用`tokenize`方法标记的字符串)或一个整数列表(使用`convert_tokens_to_ids`方法标记的字符串ID)。
encode_plus_boxes
< source >( text: 联合 text_pair: 可选 = None boxes: 可选 = None word_labels: 可选 = None add_special_tokens: 布尔型 = True padding: 联合 = False truncation: 联合 = None max_length: 可选 = None stride: 整型 = 0 is_split_into_words: 布尔型 = False pad_to_multiple_of: 可选 = None return_tensors: 联合 = None return_token_type_ids: 可选 = None return_attention_mask: 可选 = None return_overflowing_tokens: 布尔型 = False return_special_tokens_mask: 布尔型 = False return_offsets_mapping: 布尔型 = False return_length: 布尔型 = False verbose: 布尔型 = True **kwargs )
参数
- text (
str
,List[str]
or (for non-fast tokenizers)List[int]
) — 需要编码的第一个序列。这可以是一个字符串,一个字符串列表(使用tokenize
方法分词的字符串)或一个整数列表(使用convert_tokens_to_ids
方法转换的分词字符串 ID)。 - text_pair (
str
,List[str]
或List[int]
,可选)— 可选的第二个序列进行编码。这可以是一个字符串,一个字符串列表(使用tokenize
方法标记化的字符串)或整数列表(使用convert_tokens_to_ids
方法标记化的字符串 ids)。
标记化并准备用于模型的序列或序列对。
此方法已弃用,应改用__call__
。
UdopProcessor
类 transformers.UdopProcessor
< source >( image_processor tokenizer )
参数
- image_processor (
LayoutLMv3ImageProcessor
) — LayoutLMv3ImageProcessor 的一个实例。图像处理器是必需的输入。 - tokenizer (
UdopTokenizer
或UdopTokenizerFast
) — UdopTokenizer 或 UdopTokenizerFast 的一个实例。分词器是必需的输入。
构建一个将 LayoutLMv3 图像处理器和 UDOP 分词器合并为一个单一处理器的 UDOP 处理器。
UdopProcessor 提供了准备模型所需数据的所有功能。
它首先使用 LayoutLMv3ImageProcessor 改变文档图像的大小、缩放和归一化,可选地进行 OCR 以获取单词和归一化的边界框。然后将这些提供给 UdopTokenizer 或 UdopTokenizerFast,它们将单词和边界框转换为标记级别的 input_ids
、attention_mask
、token_type_ids
、bbox
。可选地,可以提供整数 word_labels
,它们被转换为标记级别的 labels
用于标记分类任务(如 FUNSD,CORD)。
此外,它还支持向分词器传递 text_target
和 text_pair_target
,这些可以用作准备语言建模任务的标签。
__call__
< 来源 >( images: 并集 = 无 text: 并集 = 无 text_pair: 并集 = 无 boxes: 并集 = 无 word_labels: 并集 = 无 text_target: 并集 = 无 text_pair_target: 并集 = 无 add_special_tokens: 布尔 = True padding: 并集 = False truncation: 并集 = False max_length: 可选 = 无 stride: 整数 = 0 pad_to_multiple_of: 可选 = 无 return_token_type_ids: 可选 = 无 return_attention_mask: 可选 = 无 return_overflowing_tokens: 布尔 = False return_special_tokens_mask: 布尔 = False return_offsets_mapping: 布尔 = False return_length: 布尔 = False verbose: 布尔 = True return_tensors: 并集 = 无 )
此方法首先将 images
参数传递给 ~UdopImageProcessor.__call__
。如果 UdopImageProcessor
被初始化为 apply_ocr
设置为 True
,它将获取到的单词和边界框以及额外的参数传递给 __call__()
并返回结果,同时附带预准备的 pixel_values
。如果 UdopImageProcessor
被初始化为 apply_ocr
设置为 False
,则将用户指定的单词(text
或 text_pair
)和 boxes
以及额外的参数传递给 __call__()
并返回结果,同时附带预准备的 pixel_values
。
或者,可以将 text_target
和 text_pair_target
传递,为 UDOP 准备目标。
请参阅上述两个方法的文档字符串以获取更多信息。
UdopModel
类 transformers.UdopModel
< source >( config )
参数
- config (UdopConfig) — Model configuration class with all the parameters of the model. Initializing with a config file does not load the weights associated with the model, only the configuration. Check out the from_pretrained() method to load the model weights.
无具体头部,仅输出原始隐藏状态的裸UDOP编码器-解码器Transformer。这个模型继承自PreTrainedModel。查看超类文档,了解库为所有模型(如下载、保存、调整输入嵌入大小、裁剪头部等)实现的通用方法。
该模型也是PyTorch torch.nn.Module的子类。将其作为常规PyTorch Module使用,并参考PyTorch文档了解所有与通用用法和行为相关的事项。
forward
< 源代码 >( input_ids: 张量 = None attention_mask: 张量 = None bbox: 字典 = None pixel_values: 可选项 = None visual_bbox: 字典 = None decoder_input_ids: 可选项 = None decoder_attention_mask: 可选项 = None inputs_embeds: 可选项 = None encoder_outputs: 可选项 = None past_key_values: 可选项 = None head_mask: 可选项 = None decoder_inputs_embeds: 可选项 = None decoder_head_mask: 可选项 = None cross_attn_head_mask: 可选项 = None use_cache = True transformers.modeling_outputs.Seq2SeqModelOutput 或 tuple(torch.FloatTensor)
) → transformers.modeling_outputs.Seq2SeqModelOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
形状(batch_size, sequence_length)
) — 词汇表中的输入序列标记索引。UDOP是一个具有相对位置嵌入的模型,所以您应该在左右两侧填充输入。索引可以使用 AutoTokenizer 获取。详见 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。 什么是输入ID? - attention_mask (
torch.FloatTensor
形状(batch_size, sequence_length)
, 可选) — 避免对填充标记索引执行注意力的掩码。掩码值选择在[0, 1]
:- 1 对于没有被掩码的标记,
- 0 对于被掩码的标记。 什么是注意力掩码?
- bbox (
torch.LongTensor
形状为({0}, 4)
,可选) — 每个输入序列标记的边界框。选择在[0, config.max_2d_position_embeddings-1]
的范围内。每个边界框应该是(x0, y0, x1, y1)格式的归一化版本,其中(x0, y0)对应于边界框中左上角的位置,而(x1, y1)表示右下角的位置。注意,
sequence_length = token_sequence_length + patch_sequence_length + 1
,其中1
是 [CLS] 标记。参见pixel_values
的patch_sequence_length
。 - pixel_values (
torch.FloatTensor
形状为(batch_size, num_channels, height, width)
) — 文档图像批次。每个图像被划分为形状为(num_channels, config.patch_size, config.patch_size)
的补丁,总补丁数(=patch_sequence_length
)等于((height / config.patch_size) * (width / config.patch_size))
。 - visual_bbox (
torch.LongTensor
形状为(batch_size, patch_sequence_length, 4)
,可选) — 图像中每个补丁的边界框。如果没有提供,模型将创建边界框。 - decoder_input_ids (
torch.LongTensor
of shape(batch_size, target_sequence_length)
, 可选) — 解码器输入序列的标签分类器在词汇表中的索引。可以使用AutoTokenizer
获得索引。请参阅AutoTokenizer。有关详细信息,请参阅PreTrainedTokenizer.encode()和PreTrainedTokenizer.call()。有关解码器输入ID的更多信息,请参阅什么是解码器输入ID? T5使用pad_token_id
作为decoder_input_ids
生成的起始标记。如果使用past_key_values
,则可以可选地仅输入最后一个decoder_input_ids
(请参阅past_key_values
)。有关如何为预训练准备decoder_input_ids
的更多信息,请参阅T5 Training。 - decoder_attention_mask (
torch.BoolTensor
of shape(batch_size, target_sequence_length)
, 可选) — 默认行为:生成一个tensor,忽略decoder_input_ids
中的填充token。默认还会使用因果掩码。 - head_mask (
torch.FloatTensor
of shape(num_heads,)
or(num_layers, num_heads)
, 可选) — 用于取消编码器中自注意力模块选定头的null掩码。选择的掩码值在[0, 1]
内:1
表示头未被掩码;0
表示头被掩码。
- decoder_head_mask (
torch.FloatTensor
of shape(num_heads,)
or(num_layers, num_heads)
, optional) — 用于解码器中的自注意力模块中取消选中头部的掩码。掩码值在[0, 1]
之间:- 1 表示头部未被掩码,
- 0 表示头部被掩码。
- cross_attn_head_mask (
torch.Tensor
of shape(num_heads,)
or(num_layers, num_heads)
, optional) — 用于解码器中的跨注意力模块中取消选中头部的掩码。掩码值在[0, 1]
之间:- 1 表示头部未被掩码,
- 0 表示头部被掩码。
- encoder_outputs (
tuple(tuple(torch.FloatTensor)
, optional) — 包含(《last_hidden_state”,可选:hidden_states,可选:attentions)的元组。last_hidden_state
的形状为(batch_size, sequence_length, hidden_size)
,表示编码器最后层的隐藏状态序列。用于解码器的跨注意力机制。 - past_key_values (长度为
config.n_layers
的tuple(tuple(torch.FloatTensor))
,每个元素包含4个形状为(batch_size, num_heads, sequence_length - 1, embed_size_per_head)
的张量) — 包含注意力块的预计算的键和值隐藏状态。可用于加速解码。如果使用了past_key_values
,用户可以选择性地只输入最后的decoder_input_ids
(没有给出此模型过去键值状态的那些)的形状为(batch_size, 1)
,而不是形状为(batch_size, sequence_length)
的所有decoder_input_ids
。 - inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
,可选) — 可选地,您可以直接传递一个嵌入表示,而不是传递input_ids
。当您需要比模型内部嵌入查找矩阵更多的控制来转换input_ids
索引到相关向量时,这非常有用。 - decoder_inputs_embeds (
torch.FloatTensor
形状为(batch_size, target_sequence_length, hidden_size)
,可选)— 可以选择直接传递嵌入式表示,而不传递decoder_input_ids
。如果使用past_key_values
,则可以选择仅输入最后的decoder_inputs_embeds
(请参阅past_key_values
)。这在使用比模型的内部嵌入查找矩阵具有更多控制权来转换decoder_input_ids
索引到相关向量时很有用。如果decoder_input_ids
和decoder_inputs_embeds
都未设置,则decoder_inputs_embeds
取inputs_embeds
的值。 - use_cache (
bool
,可选)— 如果设置为True
,则返回past_key_values
键值状态,并将其用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
,可选)— 是否返回所有注意力层的注意力张量。有关更多信息,请参阅返回的张量下的attentions
。 - output_hidden_states (
bool
, optional) — 是否返回所有层的隐藏状态。详细信息请参考返回张量的hidden_states
。 - return_dict (
bool
, optional) — 是否返回一个ModelOutput,而不是一个普通的元组。
返回值
transformers.modeling_outputs.Seq2SeqModelOutput或tuple(torch.FloatTensor)
A transformers.modeling_outputs.Seq2SeqModelOutput或一组torch.FloatTensor
(如果传递了参数return_dict=False
或config.return_dict=False
)包含各种元素,具体取决于配置(UdopConfig)和输入。
-
last_hidden_state (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
) — 模型解码器最后一层的输出隐藏状态的序列。如果使用了
past_key_values
,则只输出序列的最后一隐藏状态,形状为(batch_size, 1, hidden_size)
。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, optional, returned whenuse_cache=True
is passed or whenconfig.use_cache=True
) — 长度为config.n_layers
的tuple(torch.FloatTensor)
,每个元组包含两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量,以及两个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的额外张量。包含预计算的隐藏状态(自我注意块和交叉注意块中的键和值),可用于加快序列解码(请参阅
past_key_values
输入)。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
, optional, returned whenoutput_hidden_states=True
is passed or whenconfig.output_hidden_states=True
) — 含有形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
的元组(如果有嵌入层,则为嵌入输出加上每层的输出)。解码器在每个层的输出隐藏状态加上可选的初始嵌入输出。
-
decoder_attentions (
tuple(torch.FloatTensor)
, 可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的注意力权重,在注意力 Softmax 之后使用,用于计算自注意力头中的加权平均。
-
cross_attentions (
tuple(torch.FloatTensor)
, 可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器交叉注意力层的注意力权重,在注意力 Softmax 之后使用,用于计算交叉注意力头中的加权平均。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层的隐藏状态序列。 -
encoder_hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(如果模型有嵌入层,其中一个为嵌入输出,其余为每层输出),形状为(batch_size, sequence_length, hidden_size)
。编码器在每层输出的隐藏状态序列以及可选的初始嵌入输出。
-
encoder_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。编码器的注意力权重,在注意力 Softmax 之后使用,用于计算自注意力头中的加权平均。
UdopModel 前向方法覆盖了 __call__
特殊方法。
尽管需要在函数内部定义前向传递的配方,但在之后应该调用 Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者默默忽略它们。
示例
>>> from transformers import AutoProcessor, AutoModel
>>> from datasets import load_dataset
>>> import torch
>>> # load model and processor
>>> # in this case, we already have performed OCR ourselves
>>> # so we initialize the processor with `apply_ocr=False`
>>> processor = AutoProcessor.from_pretrained("microsoft/udop-large", apply_ocr=False)
>>> model = AutoModel.from_pretrained("microsoft/udop-large")
>>> # load an example image, along with the words and coordinates
>>> # which were extracted using an OCR engine
>>> dataset = load_dataset("nielsr/funsd-layoutlmv3", split="train", trust_remote_code=True)
>>> example = dataset[0]
>>> image = example["image"]
>>> words = example["tokens"]
>>> boxes = example["bboxes"]
>>> inputs = processor(image, words, boxes=boxes, return_tensors="pt")
>>> decoder_input_ids = torch.tensor([[model.config.decoder_start_token_id]])
>>> # forward pass
>>> outputs = model(**inputs, decoder_input_ids=decoder_input_ids)
>>> last_hidden_states = outputs.last_hidden_state
>>> list(last_hidden_states.shape)
[1, 1, 1024]
UdopForConditionalGeneration
class transformers.UdopForConditionalGeneration
< source >( config )
参数
- 配置 (UdopConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看from_pretrained()方法以加载模型权重。
UDOP编码器-解码器Transformer,带有语言建模头部,可接收文档图像和可选提示生成文本。
此类基于T5ForConditionalGeneration,扩展以处理图像和布局(2D)数据。此模型继承自PreTrainedModel。请查看超类文档,以了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头部等。)
该模型也是PyTorch torch.nn.Module的子类。将其作为常规PyTorch Module使用,并参考PyTorch文档了解所有与通用用法和行为相关的事项。
forward
< source >( input_ids: Tensor = None attention_mask: Tensor = None bbox: Dict = None pixel_values: Optional = None visual_bbox: Dict = None decoder_input_ids: Optional = None decoder_attention_mask: Optional = None inputs_embeds: Optional = None encoder_outputs: Optional = None past_key_values: Optional = None head_mask: Optional = None decoder_inputs_embeds: Optional = None decoder_head_mask: Optional = None cross_attn_head_mask: Optional = None use_cache = True output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None labels: Optional = None ) → transformers.modeling_outputs.Seq2SeqLMOutput 或者 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
形状(batch_size, sequence_length)
) —词汇表中的输入序列标记的索引。UDOP是一个带有相对位置嵌入的模型,因此您可以在左右两侧填充输入。可以使用AutoTokenizer获得这些索引。有关详细信息,请参阅PreTrainedTokenizer.encode()和PreTrainedTokenizer.call()。 什么是输入ID? - attention_mask (
torch.FloatTensor
形状(batch_size, sequence_length)
,可选) —避免在填充标记索引上执行注意力的掩码。掩码值选择在[0, 1]
:- 1 表示未掩码的标记,
- 0 表示掩码的标记。 什么是注意力掩码?
- bbox (
torch.LongTensor
形状({0}, 4)
,可选) —每个输入序列标记的边界框。选中范围为[0, config.max_2d_position_embeddings-1]
。每个边界框应为形式为 (x0, y0, x1, y1) 的归一化版本,其中 (x0, y0) 对应于边界框中上角的位置,而 (x1, y1) 代表边界框中下角的位置。注意,
sequence_length = token_sequence_length + patch_sequence_length + 1
,其中 1 为 [CLS] 标记。请参阅pixel_values
以了解patch_sequence_length
。 - pixel_values (形状为
torch.FloatTensor
的(batch_size, num_channels, height, width)
批量文档图像。每个图像被分割为形状为(num_channels, config.patch_size, config.patch_size)
的补丁,补丁总数(=patch_sequence_length
)等于((height / config.patch_size) * (width / config.patch_size))
。 - visual_bbox (形状为
torch.LongTensor
的(batch_size, patch_sequence_length, 4)
的,可选) — 图像中每个补丁的边界框。如果不提供,模型将创建边界框。 - decoder_input_ids (形状为
torch.LongTensor
的(batch_size, target_sequence_length)
的,可选) — 解码器输入序列token在词汇表中的索引。索引可以通过 AutoTokenizer 获取。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。有关解码器输入ID的解释,请参阅 What are decoder input IDs? T5 使用pad_token_id
作为decoder_input_ids
生成的起始token。如果使用past_key_values
,则可能只需输入最后decoder_input_ids
(请参阅past_key_values
)。有关如何为预训练准备decoder_input_ids
的更多信息,请参阅 T5 Training。 - decoder_attention_mask (
torch.BoolTensor
形状为(batch_size, target_sequence_length)
,可选) — 默认行为:生成一个Tensor,忽略decoder_input_ids
中的填充标记。默认还会使用因果掩码。 - head_mask (
torch.FloatTensor
形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于禁用编码器中自注意力模块选定的头的掩码。掩码值在[0, 1]
之间选择:- 1表示头没有被
掩码 , - 0表示头被
掩码 。
- 1表示头没有被
- decoder_head_mask (
torch.FloatTensor
形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于禁用解码器中自注意力模块选定的头的掩码。掩码值在[0, 1]
之间选择:- 1表示头没有被
掩码 , - 0表示头被
掩码 。
- 1表示头没有被
- cross_attn_head_mask (
torch.Tensor
的形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 解码器中nullify选定的交叉注意力模块的头部的掩码。掩码值选中在[0, 1]
:- 1表示头部未被< strong> maskeD strong>,
- 0表示头部被< strong> maskEd strong>。
- encoder_outputs (
tuple(tuple(torch.FloatTensor))
,可选) — 元组包含(last_hidden_state
,可选:hidden_states
,可选:attentions
)last_hidden_state
的形状为(batch_size, sequence_length, hidden_size)
是编码器最后一层的隐藏状态序列。用于解码器的交叉注意力。 - past_key_values (
tuple(tuple(torch.FloatTensor))
的长度为config.n_layers
,每个元组包含形状为(batch_size, num_heads, sequence_length - 1, embed_size_per_head)
的张量4个) — 包含预计算的注意力块的关键和值隐藏状态。可用于加速解码。如果使用past_key_values
,用户可以选择只输入最后decoder_input_ids
(那些没有给这个模型提供过去的关键值状态的)的形状为(batch_size, 1)
,而不是所有decoder_input_ids
的形状为(batch_size, sequence_length)
。 - inputs_embeds (
torch.FloatTensor
形状(batch_size, sequence_length, hidden_size)
,可选) — 可选地,而不是传递input_ids
,您可以选择直接传递一个嵌入表示。如果您想要比模型的内部嵌入查找矩阵有更多控制权,如何将input_ids
索引转换为相关向量,这种方法很有用。 - decoder_inputs_embeds (
torch.FloatTensor
形状(batch_size, target_sequence_length, hidden_size)
,可选) — 可选地,而不是传递decoder_input_ids
,您可以选择直接传递一个嵌入表示。如果使用past_key_values
,则可选地只输入最后的decoder_inputs_embeds
(请参阅past_key_values
)。如果您想要比模型的内部嵌入查找矩阵有更多控制权,如何将decoder_input_ids
索引转换为相关向量,这种方法很有用。如果未设置decoder_input_ids
和decoder_inputs_embeds
,则decoder_inputs_embeds
将采用inputs_embeds
的值。 - use_cache (
bool
,可选) — 如果设置为True
,则返回past_key_values
密钥值状态并可用来加速解码(请参阅past_key_values
)。 - output_attentions (
bool
, optional) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回的张量部分中的attentions
。 - output_hidden_states (
bool
, optional) — 是否返回所有层的隐藏状态。有关详细信息,请参阅返回的张量部分中的hidden_states
。 - return_dict (
bool
, optional) — 是否返回一个ModelOutput而不是一个普通的元组。 - labels (
torch.LongTensor
of shape(batch_size,)
, optional) — 计算语言模型损失的标签。索引应在[-100, 0, ..., config.vocab_size - 1]
范围内。所有设置为-100
的标签将被忽略(屏蔽),仅计算[0, ..., config.vocab_size]
范围内的标签的损失。
返回值
transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
A transformers.modeling_outputs.Seq2SeqLMOutput 或一个由 torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
),包含根据配置(UdopConfig)和输入的多个元素。
-
loss (
torch.FloatTensor
of shape(1,)
, optional, returned whenlabels
is provided) — 语言模型损失。 -
logits (
torch.FloatTensor
of shape(batch_size, sequence_length, config.vocab_size)
) — 语言模型头部的预测得分(SoftMax之前的每个词汇表的得分)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, optional, returned whenuse_cache=True
is passed or whenconfig.use_cache=True
) — 长度为config.n_layers
的tuple(torch.FloatTensor)
,每个元组包含两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量,以及两个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的额外张量。包含预计算的隐藏状态(自我注意块和交叉注意块中的键和值),可用于加快序列解码(请参阅
past_key_values
输入)。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
, optional, returned whenoutput_hidden_states=True
is passed or whenconfig.output_hidden_states=True
) — 含有形状为(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
的元组(如果有嵌入层,则为嵌入输出加上每层的输出)。每个层输出的解码器隐藏状态加上初始嵌入输出。
-
decoder_attentions (
tuple(torch.FloatTensor)
, 可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的注意力权重,在注意力 Softmax 之后使用,用于计算自注意力头中的加权平均。
-
cross_attentions (
tuple(torch.FloatTensor)
, 可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器交叉注意力层的注意力权重,在注意力 Softmax 之后使用,用于计算交叉注意力头中的加权平均。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层的隐藏状态序列。 -
encoder_hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(如果模型有嵌入层,其中一个为嵌入输出,其余为每层输出),形状为(batch_size, sequence_length, hidden_size)
。每个层输出的编码器隐藏状态加上初始嵌入输出。
-
encoder_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) — 每一层对应一个torch.FloatTensor
的元组,形状为(batch_size, num_heads, sequence_length, sequence_length)
。编码器的注意力权重,在注意力 Softmax 之后使用,用于计算自注意力头中的加权平均。
UdopForConditionalGeneration 的 forward 方法覆盖了 __call__
特殊方法。
尽管需要在函数内部定义前向传递的配方,但在之后应该调用 Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者默默忽略它们。
示例
>>> from transformers import AutoProcessor, UdopForConditionalGeneration
>>> from datasets import load_dataset
>>> # load model and processor
>>> # in this case, we already have performed OCR ourselves
>>> # so we initialize the processor with `apply_ocr=False`
>>> processor = AutoProcessor.from_pretrained("microsoft/udop-large", apply_ocr=False)
>>> model = UdopForConditionalGeneration.from_pretrained("microsoft/udop-large")
>>> # load an example image, along with the words and coordinates
>>> # which were extracted using an OCR engine
>>> dataset = load_dataset("nielsr/funsd-layoutlmv3", split="train", trust_remote_code=True)
>>> example = dataset[0]
>>> image = example["image"]
>>> words = example["tokens"]
>>> boxes = example["bboxes"]
>>> # one can use the various task prefixes (prompts) used during pre-training
>>> # e.g. the task prefix for DocVQA is "Question answering. "
>>> question = "Question answering. What is the date on the form?"
>>> encoding = processor(image, question, words, boxes=boxes, return_tensors="pt")
>>> # autoregressive generation
>>> predicted_ids = model.generate(**encoding)
>>> print(processor.batch_decode(predicted_ids, skip_special_tokens=True)[0])
9/30/92
UdopEncoderModel
class transformers.UdopEncoderModel
< source >( config: UdopConfig )
参数
- config (UdopConfig) — 模型配置类,包含所有模型参数。使用配置文件初始化不会加载模型相关联的权重,只加载配置。请看from_pretrained()方法来加载模型权重。
仅输出编码器原始隐藏状态的 UDOP 模型,没有顶部任何特定头部。此模型继承自 PreTrainedModel。检查超类文档,了解库为其所有模型实现的通用方法(例如下载或保存,调整输入嵌入大小,修剪头部等)。
该模型也是PyTorch torch.nn.Module的子类。将其作为常规PyTorch Module使用,并参考PyTorch文档了解所有与通用用法和行为相关的事项。
forward
< source >( input_ids: Tensor = None bbox: Dict = None attention_mask: Tensor = None pixel_values: Optional = None visual_bbox: Dict = None head_mask: Optional = None inputs_embeds: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None ) → transformers.models.udop.modeling_udop.BaseModelOutputWithAttentionMask
or tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
) — 输入序列中词汇表中标记索引。T5模型具有相对位置嵌入,因此您可以同时在左侧和右侧填充输入。索引可以通过 AutoTokenizer 获取。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
有关如何为预训练准备
input_ids
的更多信息,请参阅 T5 Training。 - attention_mask (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) - 用于防止在填充词索引上执行关注的掩码。掩码值选自[0, 1]
:- 1代表未被掩码的词;
- 0代表被掩码的词。
- bbox (
torch.LongTensor
,形状为pixel_values ( torch.FloatTensor
,形状为(batch_size, num_channels, height, width)
) - 文档图像的批次。每个图像分为形状为(num_channels, config.patch_size, config.patch_size)
的块,块的总数(=patch_sequence_length
)等于(((height / config.patch_size) * (width / config.patch_size))
。 - visual_bbox (
torch.LongTensor
形状为(batch_size, patch_sequence_length, 4)
,可选) — 图像中每个补丁的边界框。如果未提供,模型将创建边界框。 - head_mask (
torch.FloatTensor
形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于无效化自注意力模块所选头的掩码。掩码值选择在[0, 1]
中:- 1 表示头 未掩码,
- 0 表示头 掩码。
- inputs_embeds (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选择直接传递嵌入表示,而不是传递input_ids
。如果您希望比模型内部的嵌入查找矩阵有更多的控制权来将input_ids
索引转换为相关向量,则很有用。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是一个普通的元组。
返回值
transformers.models.udop.modeling_udop.BaseModelOutputWithAttentionMask
或 tuple(torch.FloatTensor)
transformers.models.udop.modeling_udop.BaseModelOutputWithAttentionMask
或一个由多个元素组成的 torch.FloatTensor
的元组(如果传递了 return_dict=False
或 config.return_dict=False
)。
- last_hidden_state (
torch.FloatTensor
的形状为(批次大小, 序列长度, 隐藏大小)
) — 模型最后层的输出的隐藏状态序列。如果使用了past_key_values
,则只输出形状为(批次大小, 1, 隐藏大小)
的序列的最后隐藏状态。 - past_key_values (
tuple(tuple(torch.FloatTensor))
, 可选,当传递了use_cache=True
时返回) - 当
config.use_cache=True
时) — 一个长度为config.n_layers
的tuple(torch.FloatTensor)
元组,其中每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量,可选地,如果config.is_encoder_decoder=True
,则还包括 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的额外张量。包含预计算的隐藏状态(自我注意力块中的键和值以及可选地如果config.is_encoder_decoder=True
,则在交叉注意力块中)可以用来(见past_key_values
输入)加速顺序解码。 - hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或 - 当
config.output_hidden_states=True
) — 一个torch.FloatTensor
元组(如果一个模型有嵌入层,则代表嵌入层的输出 + 每层的输出),形状为(batch_size, sequence_length, hidden_size)
。模型的隐藏状态在每个层输出处加上可选的初始嵌入输出。 - attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当 config.output_attentions=True
): 一个形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个),包含注意力软云后的注意力权重,用于计算自我注意力首部的加权平均。- cross_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
和 config.add_cross_attention=True
是或当config.output_attentions=True
时) — 一个形状为(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元组(每个层一个),包含解码器交叉注意力层注意力软云后的注意力权重,用于计算交叉注意力首部的加权平均。
UdopEncoderModel 的前向方法覆盖了特殊方法 __call__
。
尽管需要在函数内部定义前向传递的配方,但在之后应该调用 Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者默默忽略它们。
示例
>>> from transformers import AutoProcessor, UdopEncoderModel
>>> from huggingface_hub import hf_hub_download
>>> from datasets import load_dataset
>>> # load model and processor
>>> # in this case, we already have performed OCR ourselves
>>> # so we initialize the processor with `apply_ocr=False`
>>> processor = AutoProcessor.from_pretrained("microsoft/udop-large", apply_ocr=False)
>>> model = UdopEncoderModel.from_pretrained("microsoft/udop-large")
>>> # load an example image, along with the words and coordinates
>>> # which were extracted using an OCR engine
>>> dataset = load_dataset("nielsr/funsd-layoutlmv3", split="train", trust_remote_code=True)
>>> example = dataset[0]
>>> image = example["image"]
>>> words = example["tokens"]
>>> boxes = example["bboxes"]
>>> encoding = processor(image, words, boxes=boxes, return_tensors="pt")
>>> outputs = model(**encoding)
>>> last_hidden_states = outputs.last_hidden_state