Transformers 4.37 中文文档(九十三)(3)https://developer.aliyun.com/article/1564061
SigLIP
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/siglip
概述
SigLIP 模型是由 Xiaohua Zhai、Basil Mustafa、Alexander Kolesnikov、Lucas Beyer 在用于语言图像预训练的 Sigmoid Loss中提出的。SigLIP 建议用简单的成对 Sigmoid 损失替换 CLIP 中使用的损失函数。这导致在 ImageNet 的零样本分类准确性方面表现更好。
论文摘要如下:
我们提出了一种简单的成对 Sigmoid 损失用于语言-图像预训练(SigLIP)。与标准的具有 softmax 归一化的对比学习不同,Sigmoid 损失仅在图像-文本对上操作,不需要全局查看成对相似性以进行归一化。Sigmoid 损失同时允许进一步扩大批处理大小,同时在较小的批处理大小下表现更好。结合锁定图像调整,仅使用四个 TPUv4 芯片,我们训练了一个在两天内实现了 84.5% ImageNet 零样本准确性的 SigLiT 模型。批处理大小与损失的解耦进一步使我们能够研究示例与对之间的影响以及负到正的比率。最后,我们将批处理大小推到极限,高达一百万,并发现随着批处理大小的增长,好处迅速减少,32k 的更合理的批处理大小已经足够。
使用提示
- SigLIP 的使用类似于 CLIP。主要区别在于训练损失,它不需要查看批处理中所有图像和文本的成对相似性的全局视图。需要将 sigmoid 激活函数应用于 logits,而不是 softmax。
- 目前不支持训练。如果你想要微调 SigLIP 或从头开始训练,请参考来自OpenCLIP的损失函数,该函数利用了各种
torch.distributed
实用程序。 - 当使用独立的 SiglipTokenizer 或 SiglipProcessor 时,请确保传递
padding="max_length"
,因为模型是这样训练的。
SigLIP 评估结果与 CLIP 进行比较。摘自原始论文。
使用示例
有两种主要方法可以使用 SigLIP:一种是使用管道 API,它为您抽象了所有复杂性,另一种是自己使用SiglipModel
类。
Pipeline API
该流程允许在几行代码中使用模型:
>>> from transformers import pipeline >>> from PIL import Image >>> import requests >>> # load pipe >>> image_classifier = pipeline(task="zero-shot-image-classification", model="google/siglip-base-patch16-224") >>> # load image >>> url = 'http://images.cocodataset.org/val2017/000000039769.jpg' >>> image = Image.open(requests.get(url, stream=True).raw) >>> # inference >>> outputs = image_classifier(image, candidate_labels=["2 cats", "a plane", "a remote"]) >>> outputs = [{"score": round(output["score"], 4), "label": output["label"] } for output in outputs] >>> print(outputs) [{'score': 0.1979, 'label': '2 cats'}, {'score': 0.0, 'label': 'a remote'}, {'score': 0.0, 'label': 'a plane'}]
自己使用模型
如果你想自己进行预处理和后处理,以下是如何操作的:
>>> from PIL import Image >>> import requests >>> from transformers import AutoProcessor, AutoModel >>> import torch >>> model = AutoModel.from_pretrained("google/siglip-base-patch16-224") >>> processor = AutoProcessor.from_pretrained("google/siglip-base-patch16-224") >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg" >>> image = Image.open(requests.get(url, stream=True).raw) >>> texts = ["a photo of 2 cats", "a photo of 2 dogs"] >>> # important: we pass `padding=max_length` since the model was trained with this >>> inputs = processor(text=texts, images=image, padding="max_length", return_tensors="pt") >>> with torch.no_grad(): ... outputs = model(**inputs) >>> logits_per_image = outputs.logits_per_image >>> probs = torch.sigmoid(logits_per_image) # these are the probabilities >>> print(f"{probs[0][0]:.1%} that image 0 is '{texts[0]}'") 31.9% that image 0 is 'a photo of 2 cats'
SiglipConfig
class transformers.SiglipConfig
( text_config = None vision_config = None **kwargs )
参数
text_config
(dict
,可选)—用于初始化 SiglipTextConfig 的配置选项字典。vision_config
(dict
,可选)—用于初始化 SiglipVisionConfig 的配置选项字典。kwargs
(可选)—关键字参数字典。
SiglipConfig 是用于存储 SiglipModel 配置的配置类。根据指定的参数实例化一个 Siglip 模型,定义文本模型和视觉模型配置。使用默认值实例化配置将产生类似于 Siglip google/siglip-base-patch16-224架构的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例:
>>> from transformers import SiglipConfig, SiglipModel >>> # Initializing a SiglipConfig with google/siglip-base-patch16-224 style configuration >>> configuration = SiglipConfig() >>> # Initializing a SiglipModel (with random weights) from the google/siglip-base-patch16-224 style configuration >>> model = SiglipModel(configuration) >>> # Accessing the model configuration >>> configuration = model.config >>> # We can also initialize a SiglipConfig from a SiglipTextConfig and a SiglipVisionConfig >>> from transformers import SiglipTextConfig, SiglipVisionConfig >>> # Initializing a SiglipText and SiglipVision configuration >>> config_text = SiglipTextConfig() >>> config_vision = SiglipVisionConfig() >>> config = SiglipConfig.from_text_vision_configs(config_text, config_vision)
from_text_vision_configs
( text_config: SiglipTextConfig vision_config: SiglipVisionConfig **kwargs ) → export const metadata = 'undefined';SiglipConfig
返回
SiglipConfig
配置对象的一个实例
从 siglip 文本模型配置和 siglip 视觉模型配置实例化一个 SiglipConfig(或派生类)。
SiglipTextConfig
class transformers.SiglipTextConfig
( vocab_size = 32000 hidden_size = 768 intermediate_size = 3072 num_hidden_layers = 12 num_attention_heads = 12 max_position_embeddings = 64 hidden_act = 'gelu_pytorch_tanh' layer_norm_eps = 1e-06 attention_dropout = 0.0 pad_token_id = 1 bos_token_id = 49406 eos_token_id = 49407 **kwargs )
参数
vocab_size
(int
, optional, defaults to 32000) — Siglip 文本模型的词汇表大小。定义在调用 SiglipModel 时可以表示的不同标记数量。hidden_size
(int
, optional, defaults to 768) — 编码器层和池化器层的维度。intermediate_size
(int
, optional, defaults to 3072) — Transformer 编码器中“中间”(即前馈)层的维度。num_hidden_layers
(int
, optional, defaults to 12) — Transformer 编码器中的隐藏层数量。num_attention_heads
(int
, optional, defaults to 12) — Transformer 编码器中每个注意力层的注意力头数。max_position_embeddings
(int
, optional, defaults to 64) — 该模型可能使用的最大序列长度。通常将其设置为较大的值以防万一(例如 512、1024 或 2048)。hidden_act
(str
orfunction
, optional, defaults to"gelu_pytorch_tanh"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果是字符串,支持"gelu"
,"relu"
,"selu"
和"gelu_new"
"quick_gelu"
。layer_norm_eps
(float
, optional, defaults to 1e-06) — 层归一化层使用的 epsilon。attention_dropout
(float
, optional, defaults to 0.0) — 注意力概率的 dropout 比率。pad_token_id
(int
, optional, defaults to 1) — 词汇表中填充标记的 id。bos_token_id
(int
, optional, defaults to 49406) — 词汇表中序列开始标记的 id。eos_token_id
(int
, optional, defaults to 49407) — 词汇表中序列结束标记的 id。
这是一个配置类,用于存储 SiglipTextModel 的配置。根据指定的参数实例化一个 Siglip 文本编码器,定义模型架构。使用默认值实例化配置将产生类似于 Siglip google/siglip-base-patch16-224架构的文本编码器配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例:
>>> from transformers import SiglipTextConfig, SiglipTextModel >>> # Initializing a SiglipTextConfig with google/siglip-base-patch16-224 style configuration >>> configuration = SiglipTextConfig() >>> # Initializing a SiglipTextModel (with random weights) from the google/siglip-base-patch16-224 style configuration >>> model = SiglipTextModel(configuration) >>> # Accessing the model configuration >>> configuration = model.config
SiglipVisionConfig
class transformers.SiglipVisionConfig
( hidden_size = 768 intermediate_size = 3072 num_hidden_layers = 12 num_attention_heads = 12 num_channels = 3 image_size = 224 patch_size = 16 hidden_act = 'gelu_pytorch_tanh' layer_norm_eps = 1e-06 attention_dropout = 0.0 **kwargs )
参数
hidden_size
(int
, 可选, 默认为 768) — 编码器层和池化层的维度。intermediate_size
(int
, 可选, 默认为 3072) — Transformer 编码器中“中间”(即前馈)层的维度。num_hidden_layers
(int
, 可选, 默认为 12) — Transformer 编码器中的隐藏层数量。num_attention_heads
(int
, 可选, 默认为 12) — Transformer 编码器中每个注意力层的注意力头数量。num_channels
(int
, 可选, 默认为 3) — 输入图像中的通道数。image_size
(int
, 可选, 默认为 224) — 每个图像的大小(分辨率)。patch_size
(int
, 可选, 默认为 16) — 每个补丁的大小(分辨率)。hidden_act
(str
或function
, 可选, 默认为"gelu_pytorch_tanh"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果是字符串,支持"gelu"
、"relu"
、"selu"
和"gelu_new"
、"quick_gelu"
。layer_norm_eps
(float
, 可选, 默认为 1e-06) — 层归一化层使用的 epsilon。attention_dropout
(float
, 可选, 默认为 0.0) — 注意力概率的丢弃比率。
这是用于存储 SiglipVisionModel 配置的配置类。根据指定的参数实例化 Siglip 视觉编码器,定义模型架构。使用默认值实例化配置将产生类似于 Siglip google/siglip-base-patch16-224架构的视觉编码器的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例:
>>> from transformers import SiglipVisionConfig, SiglipVisionModel >>> # Initializing a SiglipVisionConfig with google/siglip-base-patch16-224 style configuration >>> configuration = SiglipVisionConfig() >>> # Initializing a SiglipVisionModel (with random weights) from the google/siglip-base-patch16-224 style configuration >>> model = SiglipVisionModel(configuration) >>> # Accessing the model configuration >>> configuration = model.config
SiglipTokenizer
class transformers.SiglipTokenizer
( vocab_file eos_token = '</s>' unk_token = '<unk>' pad_token = '</s>' additional_special_tokens = None sp_model_kwargs: Optional = None model_max_length = 64 do_lower_case = True **kwargs )
参数
vocab_file
(str
) — 包含实例化分词器所需词汇的SentencePiece文件(通常具有*.spm*扩展名)。eos_token
(str
, 可选, 默认为""
) — 序列结束标记。unk_token
(str
, 可选, 默认为""
) — 未知标记。词汇表中不存在的标记无法转换为 ID,而是设置为此标记。pad_token
(str
, 可选, 默认为""
) — 用于填充的标记,例如在批处理不同长度的序列时使用。additional_special_tokens
(List[str]
, 可选) — 分词器使用的额外特殊标记。sp_model_kwargs
(dict
, 可选) — 将传递给SentencePieceProcessor.__init__()
方法。SentencePiece 的 Python 包装器可用于设置:
enable_sampling
: 启用子词正则化。nbest_size
: 对 unigram 的采样参数。对于 BPE-Dropout 无效。
nbest_size = {0,1}
: 不执行采样。nbest_size > 1
:从 nbest_size 结果中采样。nbest_size < 0
:假设 nbest_size 为无限,并使用前向过滤和后向采样算法从所有假设(格)中采样。
alpha
:unigram 采样的平滑参数,以及 BPE-dropout 合并操作的丢弃概率。
model_max_length
(int
, optional, 默认为 64) — 模型输入的最大长度(标记数)。do_lower_case
(bool
, optional, 默认为True
) — 在标记化时是否将输入转换为小写。
构建一个 Siglip 分词器。基于 SentencePiece。
此分词器继承自 PreTrainedTokenizer,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
build_inputs_with_special_tokens
( token_ids_0: List token_ids_1: Optional = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — 将添加特殊标记的 ID 列表。token_ids_1
(List[int]
, optional) — 序列对的可选第二个 ID 列表。
返回
List[int]
具有适当特殊标记的输入 ID 列表。
通过连接和添加特殊标记,从序列或序列对构建用于序列分类任务的模型输入。序列的格式如下:
- 单个序列:
X
- 序列对:
A B
get_special_tokens_mask
( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — ID 列表。token_ids_1
(List[int]
, optional) — 序列对的可选第二个 ID 列表。already_has_special_tokens
(bool
, optional, 默认为False
) — 标记列表是否已经为模型格式化了特殊标记。
返回
List[int]
一个整数列表,范围为 [0, 1]:1 表示特殊标记,0 表示序列标记。
从没有添加特殊标记的标记列表中检索序列 id。在使用分词器的 prepare_for_model
方法添加特殊标记时调用此方法。
create_token_type_ids_from_sequences
( token_ids_0: List token_ids_1: Optional = None ) → export const metadata = 'undefined';List[int]
参数
token_ids_0
(List[int]
) — ID 列表。token_ids_1
(List[int]
, optional) — 序列对的可选第二个 ID 列表。
返回
List[int]
零列表。
从传递的两个序列创建一个用于序列对分类任务的掩码。T5 不使用标记类型 id,因此返回一个零列表。
save_vocabulary
( save_directory: str filename_prefix: Optional = None )
Transformers 4.37 中文文档(九十三)(5)https://developer.aliyun.com/article/1564063