Transformers 4.37 中文文档(八十八)(2)https://developer.aliyun.com/article/1563220
TFLayoutLMForSequenceClassification
class transformers.TFLayoutLMForSequenceClassification
( config: LayoutLMConfig *inputs **kwargs )
参数
config
(LayoutLMConfig) - 具有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只加载配置。查看 from_pretrained()方法以加载模型权重。
LayoutLM 模型变压器顶部带有序列分类/回归头(池化输出的线性层),例如用于 GLUE 任务。
这个模型继承自 TFPreTrainedModel。查看超类文档以了解库为所有模型实现的通用方法(如下载或保存、调整输入嵌入、修剪头等)。
这个模型也是一个tf.keras.Model子类。将其用作常规的 TF 2.0 Keras 模型,并参考 TF 2.0 文档以获取与一般用法和行为相关的所有信息。
transformers
中的 TensorFlow 模型和层接受两种格式的输入:
- 将所有输入作为关键字参数(类似于 PyTorch 模型),或者
- 将所有输入作为列表、元组或字典放在第一个位置参数中。
支持第二种格式的原因是,当将输入传递给模型和层时,Keras 方法更喜欢这种格式。由于有了这种支持,当使用model.fit()
等方法时,应该可以“正常工作” - 只需以model.fit()
支持的任何格式传递输入和标签!但是,如果您想在 Keras 方法之外使用第二种格式,例如在使用 KerasFunctional
API 创建自己的层或模型时,有三种可能性可以用来收集第一个位置参数中的所有输入张量:
- 一个只有
input_ids
的单个张量,没有其他内容:model(input_ids)
- 一个长度可变的列表,其中包含一个或多个按照文档字符串中给定顺序的输入张量:
model([input_ids, attention_mask])
或model([input_ids, attention_mask, token_type_ids])
- 一个字典,其中包含与文档字符串中给定输入名称相关联的一个或多个输入张量:
model({"input_ids": input_ids, "token_type_ids": token_type_ids})
请注意,当使用子类化创建模型和层时,您无需担心这些问题,因为您可以像对待其他 Python 函数一样传递输入!
call
( input_ids: TFModelInputType | None = None bbox: np.ndarray | tf.Tensor | None = None attention_mask: np.ndarray | tf.Tensor | None = None token_type_ids: np.ndarray | tf.Tensor | None = None position_ids: np.ndarray | tf.Tensor | None = None head_mask: np.ndarray | tf.Tensor | None = None inputs_embeds: np.ndarray | tf.Tensor | None = None output_attentions: Optional[bool] = None output_hidden_states: Optional[bool] = None return_dict: Optional[bool] = None labels: np.ndarray | tf.Tensor | None = None training: Optional[bool] = False ) → export const metadata = 'undefined';transformers.modeling_tf_outputs.TFSequenceClassifierOutput or tuple(tf.Tensor)
参数
input_ids
(Numpy array
或tf.Tensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列标记的索引。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.call
() 和 PreTrainedTokenizer.encode()。
什么是输入 ID?bbox
(Numpy array
或tf.Tensor
,形状为(batch_size, sequence_length, 4)
,可选) — 每个输入序列标记的边界框。选择范围为[0, config.max_2d_position_embeddings- 1]
。attention_mask
(Numpy array
或tf.Tensor
,形状为(batch_size, sequence_length)
,可选) — 避免在填充标记索引上执行注意力的掩码。掩码值选择在[0, 1]
:
- 1 表示未被
masked
的标记, - 0 表示被
masked
的标记。
- 什么是注意力掩码?
token_type_ids
(Numpy array
或tf.Tensor
,形状为(batch_size, sequence_length)
,可选) — 段标记索引,指示输入的第一部分和第二部分。索引选择在[0, 1]
:
- 0 对应于 句子 A 标记,
- 1 对应于 句子 B 标记。
- 什么是标记类型 ID?
position_ids
(Numpy array
或tf.Tensor
,形状为(batch_size, sequence_length)
,可选) — 每个输入序列标记在位置嵌入中的位置索引。选择范围为[0, config.max_position_embeddings - 1]
。
什么是位置 ID?head_mask
(Numpy array
或tf.Tensor
,形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于使自注意力模块中选定头部失效的掩码。掩码值选择在[0, 1]
:
- 1 表示头部未被
masked
, - 0 表示头部被
masked
。
inputs_embeds
(tf.Tensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示而不是传递input_ids
。如果您想要更多控制如何将input_ids
索引转换为相关向量,而不是使用模型的内部嵌入查找矩阵,这将非常有用。output_attentions
(bool
,可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量中的attentions
。output_hidden_states
(bool
,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states
。return_dict
(bool
,可选) — 是否返回 ModelOutput 而不是普通元组。training
(bool
,可选,默认为False
) — 是否在训练模式下使用模型(一些模块如 dropout 模块在训练和评估之间有不同的行为)。labels
(tf.Tensor
或np.ndarray
,形状为(batch_size,)
,可选) — 用于计算序列分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
。如果config.num_labels == 1
,则计算回归损失(均方损失),如果config.num_labels > 1
,则计算分类损失(交叉熵)。
返回
transformers.modeling_tf_outputs.TFSequenceClassifierOutput 或 tuple(tf.Tensor)
一个 transformers.modeling_tf_outputs.TFSequenceClassifierOutput 或一个tf.Tensor
元组(如果传递了return_dict=False
或config.return_dict=False
时)包含各种元素,取决于配置(LayoutLMConfig)和输入。
loss
(形状为(batch_size, )
的tf.Tensor
,可选,当提供labels
时返回)-分类(如果 config.num_labels==1 则为回归)损失。logits
(形状为(batch_size, config.num_labels)
的tf.Tensor
)-分类(如果 config.num_labels==1 则为回归)分数(SoftMax 之前)。hidden_states
(tuple(tf.Tensor)
,可选,当传递output_hidden_states=True
或config.output_hidden_states=True
时返回)-形状为(batch_size, sequence_length, hidden_size)
的tf.Tensor
元组(一个用于嵌入的输出+一个用于每一层的输出)。
模型在每一层输出处的隐藏状态以及初始嵌入输出。attentions
(tuple(tf.Tensor)
,可选,当传递output_attentions=True
或config.output_attentions=True
时返回)-形状为(batch_size, num_heads, sequence_length, sequence_length)
的tf.Tensor
元组(每层一个)。
注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
TFLayoutLMForSequenceClassification 的前向方法,覆盖了__call__
特殊方法。
虽然前向传递的步骤需要在此函数内定义,但应该在此之后调用Module
实例,而不是这个,因为前者会负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import AutoTokenizer, TFLayoutLMForSequenceClassification >>> import tensorflow as tf >>> tokenizer = AutoTokenizer.from_pretrained("microsoft/layoutlm-base-uncased") >>> model = TFLayoutLMForSequenceClassification.from_pretrained("microsoft/layoutlm-base-uncased") >>> words = ["Hello", "world"] >>> normalized_word_boxes = [637, 773, 693, 782], [698, 773, 733, 782] >>> token_boxes = [] >>> for word, box in zip(words, normalized_word_boxes): ... word_tokens = tokenizer.tokenize(word) ... token_boxes.extend([box] * len(word_tokens)) >>> # add bounding boxes of cls + sep tokens >>> token_boxes = [[0, 0, 0, 0]] + token_boxes + [[1000, 1000, 1000, 1000]] >>> encoding = tokenizer(" ".join(words), return_tensors="tf") >>> input_ids = encoding["input_ids"] >>> attention_mask = encoding["attention_mask"] >>> token_type_ids = encoding["token_type_ids"] >>> bbox = tf.convert_to_tensor([token_boxes]) >>> sequence_label = tf.convert_to_tensor([1]) >>> outputs = model( ... input_ids=input_ids, ... bbox=bbox, ... attention_mask=attention_mask, ... token_type_ids=token_type_ids, ... labels=sequence_label, ... ) >>> loss = outputs.loss >>> logits = outputs.logits
TFLayoutLMForTokenClassification
class transformers.TFLayoutLMForTokenClassification
( config: LayoutLMConfig *inputs **kwargs )
参数
config
(LayoutLMConfig)-模型配置类,具有模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只加载配置。查看 from_pretrained()方法以加载模型权重。
LayoutLM 模型在顶部带有一个标记分类头(隐藏状态输出的顶部线性层),例如用于命名实体识别(NER)任务。
该模型继承自 TFPreTrainedModel。查看超类文档以获取库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入、修剪头等)。
这个模型也是一个tf.keras.Model子类。将其用作常规的 TF 2.0 Keras 模型,并参考 TF 2.0 文档以获取与一般用法和行为相关的所有内容。
transformers
中的 TensorFlow 模型和层接受两种格式的输入:
- 将所有输入作为关键字参数(类似于 PyTorch 模型),或
- 将所有输入作为列表、元组或字典的第一个位置参数。
支持第二种格式的原因是 Keras 方法在将输入传递给模型和层时更喜欢这种格式。由于有了这种支持,当使用model.fit()
等方法时,您应该可以“轻松处理” - 只需以model.fit()
支持的任何格式传递输入和标签即可!但是,如果您想在 Keras 方法之外使用第二种格式,比如在使用 Keras Functional
API 创建自己的层或模型时,有三种可能性可以用来收集第一个位置参数中的所有输入张量:
- 一个仅包含
input_ids
的单个张量,没有其他内容:model(input_ids)
- 一个长度不同的列表,其中包含按照文档字符串中给定的顺序的一个或多个输入张量:
model([input_ids, attention_mask])
或model([input_ids, attention_mask, token_type_ids])
- 一个包含与文档字符串中给定的输入名称相关联的一个或多个输入张量的字典:
model({"input_ids": input_ids, "token_type_ids": token_type_ids})
请注意,当使用子类化创建模型和层时,您无需担心这些问题,因为您可以像对待任何其他 Python 函数一样传递输入!
call
( input_ids: TFModelInputType | None = None bbox: np.ndarray | tf.Tensor | None = None attention_mask: np.ndarray | tf.Tensor | None = None token_type_ids: np.ndarray | tf.Tensor | None = None position_ids: np.ndarray | tf.Tensor | None = None head_mask: np.ndarray | tf.Tensor | None = None inputs_embeds: np.ndarray | tf.Tensor | None = None output_attentions: Optional[bool] = None output_hidden_states: Optional[bool] = None return_dict: Optional[bool] = None labels: np.ndarray | tf.Tensor | None = None training: Optional[bool] = False ) → export const metadata = 'undefined';transformers.modeling_tf_outputs.TFTokenClassifierOutput or tuple(tf.Tensor)
参数
input_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
)- 词汇表中输入序列令牌的索引。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.call
()和 PreTrainedTokenizer.encode()。
什么是输入 ID?bbox
(形状为(batch_size, sequence_length, 4)
的Numpy
数组或tf.Tensor
,可选)- 每个输入序列令牌的边界框。在范围[0, config.max_2d_position_embeddings- 1]
中选择。attention_mask
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选)- 用于避免在填充令牌索引上执行注意力的掩码。掩码值在[0, 1]
中选择:
- 1 表示未被
masked
的令牌, - 0 表示被
masked
的令牌。
- 什么是注意力掩码?
token_type_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选)- 分段令牌索引,指示输入的第一部分和第二部分。索引在[0, 1]
中选择:
- 0 对应于句子 A令牌,
- 1 对应于句子 B令牌。
- 什么是令牌类型 ID?
position_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选)- 每个输入序列令牌在位置嵌入中的位置索引。在范围[0, config.max_position_embeddings - 1]
中选择。
什么是位置 ID?head_mask
(形状为(num_heads,)
或(num_layers, num_heads)
的Numpy
数组或tf.Tensor
,可选)- 用于使自注意力模块中选择的头部失效的掩码。掩码值在[0, 1]
中选择:
- 1 表示头部未被
masked
, - 0 表示头部被
masked
。
inputs_embeds
(形状为(batch_size, sequence_length, hidden_size)
的tf.Tensor
,可选)- 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您想要更多控制权,以便将input_ids
索引转换为相关向量,而不是模型的内部嵌入查找矩阵。output_attentions
(bool
,optional) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。output_hidden_states
(bool
, optional) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。return_dict
(bool
, optional) — 是否返回 ModelOutput 而不是普通元组。training
(bool
,optional,默认为False
) — 是否在训练模式下使用模型(一些模块,如 dropout 模块,在训练和评估之间有不同的行为)。labels
(tf.Tensor
或形状为(batch_size, sequence_length)
的np.ndarray
,optional) — 用于计算标记分类损失的标签。索引应在[0, ..., config.num_labels - 1]
范围内。
返回
transformers.modeling_tf_outputs.TFTokenClassifierOutput 或tuple(tf.Tensor)
一个 transformers.modeling_tf_outputs.TFTokenClassifierOutput 或一个tf.Tensor
元组(如果传递return_dict=False
或config.return_dict=False
)包含根据配置(LayoutLMConfig)和输入的不同元素。
loss
(tf.Tensor
,形状为(n,)
,optional,当提供labels
时返回,其中 n 是未屏蔽标签的数量) — 分类损失。logits
(tf.Tensor
,形状为(batch_size, sequence_length, config.num_labels)
) — 分类分数(SoftMax 之前)。hidden_states
(tuple(tf.Tensor)
, optional, 当传递output_hidden_states=True
或config.output_hidden_states=True
时返回) — 形状为(batch_size, sequence_length, hidden_size)
的tf.Tensor
元组(一个用于嵌入的输出 + 一个用于每个层的输出)。
每个层的模型的隐藏状态加上初始嵌入输出。attentions
(tuple(tf.Tensor)
, optional, 当传递output_attentions=True
或config.output_attentions=True
时返回) — 形状为(batch_size, num_heads, sequence_length, sequence_length)
的tf.Tensor
元组(每个层一个)。
注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
TFLayoutLMForTokenClassification 的前向方法,覆盖__call__
特殊方法。
虽然前向传递的配方需要在此函数内定义,但应该在此之后调用Module
实例,而不是在此处调用,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> import tensorflow as tf >>> from transformers import AutoTokenizer, TFLayoutLMForTokenClassification >>> tokenizer = AutoTokenizer.from_pretrained("microsoft/layoutlm-base-uncased") >>> model = TFLayoutLMForTokenClassification.from_pretrained("microsoft/layoutlm-base-uncased") >>> words = ["Hello", "world"] >>> normalized_word_boxes = [637, 773, 693, 782], [698, 773, 733, 782] >>> token_boxes = [] >>> for word, box in zip(words, normalized_word_boxes): ... word_tokens = tokenizer.tokenize(word) ... token_boxes.extend([box] * len(word_tokens)) >>> # add bounding boxes of cls + sep tokens >>> token_boxes = [[0, 0, 0, 0]] + token_boxes + [[1000, 1000, 1000, 1000]] >>> encoding = tokenizer(" ".join(words), return_tensors="tf") >>> input_ids = encoding["input_ids"] >>> attention_mask = encoding["attention_mask"] >>> token_type_ids = encoding["token_type_ids"] >>> bbox = tf.convert_to_tensor([token_boxes]) >>> token_labels = tf.convert_to_tensor([1, 1, 0, 0]) >>> outputs = model( ... input_ids=input_ids, ... bbox=bbox, ... attention_mask=attention_mask, ... token_type_ids=token_type_ids, ... labels=token_labels, ... ) >>> loss = outputs.loss >>> logits = outputs.logits
TFLayoutLMForQuestionAnswering
class transformers.TFLayoutLMForQuestionAnswering
( config: LayoutLMConfig *inputs **kwargs )
参数
config
(LayoutLMConfig) — 具有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained()方法以加载模型权重。
LayoutLM 模型,顶部带有用于提取式问答任务(如DocVQA)的跨度分类头(在最终隐藏状态输出的顶部的线性层,用于计算span start logits
和span end logits
)。
此模型继承自 TFPreTrainedModel。查看超类文档,了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入、修剪头等)。
此模型还是一个tf.keras.Model子类。将其用作常规的 TF 2.0 Keras 模型,并参考 TF 2.0 文档以获取有关一般用法和行为的所有相关信息。
transformers
中的 TensorFlow 模型和层接受两种格式的输入:
- 将所有输入作为关键字参数(类似于 PyTorch 模型),或
- 将所有输入作为列表、元组或字典放在第一个位置参数中。
支持第二种格式的原因是 Keras 方法在将输入传递给模型和层时更喜欢这种格式。由于这种支持,当使用model.fit()
等方法时,应该“只需工作” - 只需以model.fit()
支持的任何格式传递输入和标签!但是,如果您想在 Keras 方法之外使用第二种格式,比如在使用 Keras Functional
API 创建自己的层或模型时,有三种可能性可以用来收集第一个位置参数中的所有输入张量:
- 只有
input_ids
的单个张量,没有其他内容:model(input_ids)
- 一个长度可变的列表,其中包含一个或多个按照文档字符串中给定的顺序的输入张量:
model([input_ids, attention_mask])
或model([input_ids, attention_mask, token_type_ids])
- 一个包含一个或多个与文档字符串中给定的输入名称相关联的输入张量的字典:
model({"input_ids": input_ids, "token_type_ids": token_type_ids})
请注意,当使用子类化创建模型和层时,您无需担心这些问题,因为您可以像对待任何其他 Python 函数一样传递输入!
call
( input_ids: TFModelInputType | None = None bbox: np.ndarray | tf.Tensor | None = None attention_mask: np.ndarray | tf.Tensor | None = None token_type_ids: np.ndarray | tf.Tensor | None = None position_ids: np.ndarray | tf.Tensor | None = None head_mask: np.ndarray | tf.Tensor | None = None inputs_embeds: np.ndarray | tf.Tensor | None = None output_attentions: Optional[bool] = None output_hidden_states: Optional[bool] = None return_dict: Optional[bool] = None start_positions: np.ndarray | tf.Tensor | None = None end_positions: np.ndarray | tf.Tensor | None = None training: Optional[bool] = False ) → export const metadata = 'undefined';transformers.modeling_tf_outputs.TFQuestionAnsweringModelOutput or tuple(tf.Tensor)
参数
input_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
) - 词汇表中输入序列标记的索引。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.call
()和 PreTrainedTokenizer.encode()。
什么是输入 ID?bbox
(形状为(batch_size, sequence_length, 4)
的Numpy
数组或tf.Tensor
,可选) - 每个输入序列标记的边界框。在范围[0, config.max_2d_position_embeddings- 1]
中选择。attention_mask
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选) - 遮罩,用于避免在填充标记索引上执行注意力。遮罩值在[0, 1]
中选择:
- 1 表示
未被掩码
的标记, - 0 表示
被掩码
的标记。
- 什么是注意力掩码?
token_type_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选) - 段标记索引,指示输入的第一部分和第二部分。索引在[0, 1]
中选择:
- 0 对应于句子 A的标记,
- 1 对应于句子 B的标记。
- 什么是标记类型 ID?
position_ids
(形状为(batch_size, sequence_length)
的Numpy
数组或tf.Tensor
,可选) - 每个输入序列标记在位置嵌入中的位置索引。在范围[0, config.max_position_embeddings - 1]
中选择。
什么是位置 ID?head_mask
(Numpy array
ortf.Tensor
of shape(num_heads,)
or(num_layers, num_heads)
, optional) — 用于使自注意力模块的选定头部失效的掩码。在[0, 1]
中选择的掩码值:
- 1 表示头部未被屏蔽,
- 0 表示头部被屏蔽。
inputs_embeds
(tf.Tensor
of shape(batch_size, sequence_length, hidden_size)
, optional) — 可选地,可以直接传递嵌入表示而不是传递input_ids
。如果您想要更多控制如何将input_ids
索引转换为相关向量,这将非常有用,而不是使用模型的内部嵌入查找矩阵。output_attentions
(bool
, optional) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量下的attentions
。output_hidden_states
(bool
, optional) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。return_dict
(bool
, optional) — 是否返回一个 ModelOutput 而不是一个普通的元组。training
(bool
, optional, 默认为False
) — 是否在训练模式下使用模型(一些模块,如 dropout 模块,在训练和评估之间有不同的行为)。start_positions
(tf.Tensor
ornp.ndarray
of shape(batch_size,)
, optional) — 用于计算标记跨度开始位置的标签(索引)的位置。位置被夹紧到序列的长度(sequence_length
)。序列外的位置不会被考虑在内计算损失。end_positions
(tf.Tensor
ornp.ndarray
of shape(batch_size,)
, optional) — 用于计算标记跨度结束位置的标签(索引)的位置。位置被夹紧到序列的长度(sequence_length
)。序列外的位置不会被考虑在内计算损失。
返回
transformers.modeling_tf_outputs.TFQuestionAnsweringModelOutput 或tuple(tf.Tensor)
一个 transformers.modeling_tf_outputs.TFQuestionAnsweringModelOutput 或一个tf.Tensor
元组(如果传递return_dict=False
或当config.return_dict=False
时)包含根据配置(LayoutLMConfig)和输入的各种元素。
loss
(tf.Tensor
of shape(batch_size, )
, optional, 当提供start_positions
和end_positions
时返回) — 总跨度提取损失是开始和结束位置的交叉熵之和。start_logits
(tf.Tensor
of shape(batch_size, sequence_length)
) — 跨度开始分数(在 SoftMax 之前)。end_logits
(tf.Tensor
of shape(batch_size, sequence_length)
) — Span-end scores (before SoftMax).hidden_states
(tuple(tf.Tensor)
, optional, returned whenoutput_hidden_states=True
is passed or whenconfig.output_hidden_states=True
) — 元组的tf.Tensor
(一个用于嵌入的输出 + 一个用于每一层的输出)的形状为(batch_size, sequence_length, hidden_size)
。
每层模型的隐藏状态加上初始嵌入输出。attentions
(tuple(tf.Tensor)
, optional, returned whenoutput_attentions=True
is passed or whenconfig.output_attentions=True
) — Tuple oftf.Tensor
(one for each layer) of shape(batch_size, num_heads, sequence_length, sequence_length)
.
用于计算自注意力头中的加权平均值的注意力 softmax 后的注意力权重。
TFLayoutLMForQuestionAnswering 的前向方法重写了__call__
特殊方法。
虽然前向传递的配方需要在此函数内定义,但应该在此之后调用Module
实例,而不是这个,因为前者负责运行前处理和后处理步骤,而后者则会默默地忽略它们。
示例:
>>> import tensorflow as tf >>> from transformers import AutoTokenizer, TFLayoutLMForQuestionAnswering >>> from datasets import load_dataset >>> tokenizer = AutoTokenizer.from_pretrained("impira/layoutlm-document-qa", add_prefix_space=True) >>> model = TFLayoutLMForQuestionAnswering.from_pretrained("impira/layoutlm-document-qa", revision="1e3ebac") >>> dataset = load_dataset("nielsr/funsd", split="train") >>> example = dataset[0] >>> question = "what's his name?" >>> words = example["words"] >>> boxes = example["bboxes"] >>> encoding = tokenizer( ... question.split(), words, is_split_into_words=True, return_token_type_ids=True, return_tensors="tf" ... ) >>> bbox = [] >>> for i, s, w in zip(encoding.input_ids[0], encoding.sequence_ids(0), encoding.word_ids(0)): ... if s == 1: ... bbox.append(boxes[w]) ... elif i == tokenizer.sep_token_id: ... bbox.append([1000] * 4) ... else: ... bbox.append([0] * 4) >>> encoding["bbox"] = tf.convert_to_tensor([bbox]) >>> word_ids = encoding.word_ids(0) >>> outputs = model(**encoding) >>> loss = outputs.loss >>> start_scores = outputs.start_logits >>> end_scores = outputs.end_logits >>> start, end = word_ids[tf.math.argmax(start_scores, -1)[0]], word_ids[tf.math.argmax(end_scores, -1)[0]] >>> print(" ".join(words[start : end + 1])) M. Hamann P. Harper, P. Martinez
LayoutLMV2
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/layoutlmv2
概述
LayoutLMV2 模型是由 Yang Xu、Yiheng Xu、Tengchao Lv、Lei Cui、Furu Wei、Guoxin Wang、Yijuan Lu、Dinei Florencio、Cha Zhang、Wanxiang Che、Min Zhang、Lidong Zhou 提出的LayoutLMv2: Multi-modal Pre-training for Visually-Rich Document Understanding。LayoutLMV2 改进了 LayoutLM 以获得跨多个文档图像理解基准的最新结果:
- 从扫描文档中提取信息:FUNSD数据集(包含超过 30,000 个单词的 199 个带注释表格)、CORD数据集(包含 800 张用于训练的收据、100 张用于验证和 100 张用于测试)、SROIE数据集(包含 626 张用于训练和 347 张用于测试的收据)以及Kleister-NDA数据集(包含来自 EDGAR 数据库的非披露协议,包括 254 份用于训练、83 份用于验证和 203 份用于测试的文件)。
- 文档图像分类:RVL-CDIP数据集(包含 40 万张属于 16 个类别的图像)。
- 文档视觉问答:DocVQA数据集(包含在 12,000 多个文档图像上定义的 5 万个问题)。
该论文的摘要如下:
文本和布局的预训练在各种视觉丰富的文档理解任务中已被证明是有效的,这是由于其有效的模型架构和大规模未标记的扫描/数字化文档的优势。在本文中,我们提出了 LayoutLMv2,通过在多模态框架中预训练文本、布局和图像,利用了新的模型架构和预训练任务。具体来说,LayoutLMv2 不仅使用现有的遮蔽视觉语言建模任务,还使用新的文本-图像对齐和文本-图像匹配任务在预训练阶段,从而更好地学习跨模态交互。同时,它还将空间感知自注意机制集成到 Transformer 架构中,使模型能够充分理解不同文本块之间的相对位置关系。实验结果表明,LayoutLMv2 优于强基线,并在各种下游视觉丰富的文档理解任务中取得了新的最先进结果,包括 FUNSD(0.7895 -> 0.8420)、CORD(0.9493 -> 0.9601)、SROIE(0.9524 -> 0.9781)、Kleister-NDA(0.834 -> 0.852)、RVL-CDIP(0.9443 -> 0.9564)和 DocVQA(0.7295 -> 0.8672)。预训练的 LayoutLMv2 模型可以在此 https URL 上公开获取。
LayoutLMv2 依赖于detectron2
、torchvision
和tesseract
。运行以下命令进行安装:
python -m pip install 'git+https://github.com/facebookresearch/detectron2.git' python -m pip install torchvision tesseract
(如果您正在开发 LayoutLMv2,请注意通过 doctests 还需要安装这些包。)
使用提示
- LayoutLMv1 和 LayoutLMv2 之间的主要区别在于后者在预训练期间包含了视觉嵌入(而 LayoutLMv1 仅在微调期间添加了视觉嵌入)。
- LayoutLMv2 在自注意力层中添加了相对 1D 注意力偏置和空间 2D 注意力偏置到注意力分数中。详细信息可在论文的第 5 页找到。
- 可以在此处找到如何在 RVL-CDIP、FUNSD、DocVQA、CORD 上使用 LayoutLMv2 模型的演示笔记本。
- LayoutLMv2 使用 Facebook AI 的Detectron2包作为其视觉骨干。查看此链接获取安装说明。
- 除了
input_ids
,forward()还需要 2 个额外的输入,即image
和bbox
。image
输入对应于文本标记出现的原始文档图像。模型期望每个文档图像的大小为 224x224。这意味着如果您有一批文档图像,image
应该是形状为(batch_size, 3, 224, 224)的张量。这可以是torch.Tensor
或Detectron2.structures.ImageList
。您不需要对通道进行归一化,因为模型会自行处理。需要注意的是,视觉主干期望 BGR 通道而不是 RGB,因为 Detectron2 中的所有模型都是使用 BGR 格式进行预训练的。bbox
输入是输入文本标记的边界框(即 2D 位置)。这与 LayoutLMModel 相同。可以使用外部 OCR 引擎(例如 Google 的Tesseract)(有一个Python 包装器可用)来获取这些信息。每个边界框应采用(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 Image Library(PIL)库来获取这些信息,例如:
from PIL import Image image = Image.open( "name_of_your_document - can be a png, jpg, etc. of your documents (PDFs must be converted to images)." ) width, height = image.size
然而,该模型包含一个全新的 LayoutLMv2Processor,可用于直接为模型准备数据(包括在底层应用 OCR)。更多信息可以在下面的“使用”部分找到。
- 在内部,LayoutLMv2Model 将通过其视觉主干发送
image
输入,以获得一个分辨率较低的特征图,其形状等于 LayoutLMv2Config 的image_feature_pool_shape
属性。然后将该特征图展平以获得一系列图像标记。由于特征图的大小默认为 7x7,因此获得 49 个图像标记。然后将这些标记与文本标记连接,并通过 Transformer 编码器发送。这意味着模型的最后隐藏状态将具有长度为 512 + 49 = 561,如果您将文本标记填充到最大长度。更一般地,最后的隐藏状态将具有形状seq_length
+image_feature_pool_shape[0]
*config.image_feature_pool_shape[1]
。 - 在调用 from_pretrained()时,将打印一个警告,其中包含一长串未初始化的参数名称。这不是问题,因为这些参数是批量归一化统计数据,在自定义数据集上微调时将具有值。
- 如果要在分布式环境中训练模型,请确保在模型上调用
synchronize_batch_norm
,以便正确同步视觉主干的批量归一化层。
此外,还有 LayoutXLM,这是 LayoutLMv2 的多语言版本。更多信息可以在 LayoutXLM 的文档页面找到。
资源
官方 Hugging Face 和社区(由🌎表示)资源列表,可帮助您开始使用 LayoutLMv2。如果您有兴趣提交资源以包含在此处,请随时提出拉取请求,我们将对其进行审查!资源应该展示一些新内容,而不是重复现有资源。
文本分类
- 关于如何在 RVL-CDIP 数据集上对 LayoutLMv2 进行微调以进行文本分类的笔记。
- 另请参阅:文本分类任务指南
问答
- 关于如何在 DocVQA 数据集上对 LayoutLMv2 进行问答微调的笔记。
- 另请参阅:问答任务指南
- 另请参阅:文档问答任务指南
标记分类
- 关于如何在 CORD 数据集上对 LayoutLMv2 进行微调以进行标记分类的笔记。
- 关于如何在 FUNSD 数据集上对 LayoutLMv2 进行微调以进行标记分类的笔记。
- 另请参阅:标记分类任务指南
Transformers 4.37 中文文档(八十八)(4)https://developer.aliyun.com/article/1563222