零样本学习(Zero-Shot Learning, ZSL)是一种机器学习技术,它允许模型识别或分类在训练期间未出现的类别样本。这种方法的目标是缩小现实世界中存在的大量类别与用于训练模型的少量类别之间的差距。零样本学习的关键方面包括利用类别的语义知识、使用元数据或其他信息,以及对未知类别的泛化能力。
零样本学习的一个特定应用是零样本分类,它专注于将实例(包括训练集中不存在的实例)分类到类别中。模型在训练期间学习将输入特征映射到语义空间,并将语义空间映射到类别描述或属性。在推理期间,模型通过比较输入的表示与类别描述来进行预测。零样本分类的例子包括文本分类、音频分类和在图片或视频中识别新的对象种类。
这种分类是零样本分类的一种特定类型,应用于视觉数据。它允许模型将图像分类到它们在训练期间没有明确看到过的类别中。与传统图像分类的关键区别在于,传统图像分类需要每个类别都有标记的示例,而零样本图像分类可以在没有特定训练示例的情况下对新类别进行分类。
多模态学习:通常使用包含文本描述和图像的大型数据集来训练零样本分类模型。这使得模型能够理解视觉特征和语言概念之间的关系。对齐表示:使用共同的嵌入空间,模型生成文本和视觉数据的对齐表示。这种对齐允许模型理解图像内容和文本描述之间的对应关系。推理过程:在分类期间,模型会比较候选文本标签的嵌入与输入图像的嵌入。分类结果由选择相似度分数最高的标签来确定。
首先,需要安装依赖项:
!pip install -q "transformers[torch]" pillow
实现零样本图像分类有两种主要方法:
from transformers import pipeline
from PIL import Image
import requests
# 设置管道
checkpoint = "openai/clipvitlargepatch14"
detector = pipeline(model=checkpoint, task="zeroshotimageclassification")
url = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuC7EJxlBGYl8-wwrJbUTHricImikrH2ylFQ&s"
image = Image.open(requests.get(url, stream=True).raw)
image
# 执行分类
predictions = detector(image, candidate_labels=["fox", "bear", "seagull", "owl"])
predictions
# 找到分数最高的字典
best_result = max(predictions, key=lambda x: x['score'])
# 打印最佳结果的标签和分数
print(f"Label with the best score: {best_result['label']}, Score: {best_result['score']}")
from transformers import AutoProcessor, AutoModelForZeroShotImageClassification
import torch
from PIL import Image
import requests
# 加载模型和处理器
checkpoint = "openai/clipvitlargepatch14"
model = AutoModelForZeroShotImageClassification.from_pretrained(checkpoint)
processor = AutoProcessor.from_pretrained(checkpoint)
# 加载图像
url = "https://unsplash.com/photos/xBRQfR2bqNI/download?ixid=MnwxMjA3fDB8MXxhbGx8fHx8fHx8fHwxNjc4Mzg4ODEx&force=true&w=640"
image = Image.open(requests.get(url, stream=True).raw)
Image
# 准备输入
candidate_labels = ["tree", "car", "bike", "cat"]
inputs = processor(images=image, text=candidate_labels, return_tensors="pt", padding=True)
# 执行推理
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits_per_image[0]
probs = logits.softmax(dim=1).numpy()
# 处理结果
result = [
{"score": float(score), "label": label}
for score, label in sorted(zip(probs, candidate_labels), key=lambda x: x[0])
]
print(result)
# 找到分数最高的字典
best_result = max(result, key=lambda x: x['score'])
# 打印最佳结果的标签和分数
print(f"Label with the best score: {best_result['label']}, Score: {best_result['score']}")
灵活性:能够将照片分类到新组中,无需任何重新训练。可扩展性:能够快速适应新的用例和领域。减少对数据的依赖:不需要为每个新类别提供大量的标记数据集。自然语言接口:使用户能够使用自由形式的文本定义类别。
准确性:可能无法与专业模型的性能相匹配。模糊性:可能难以区分相关类别之间的细微差异。偏见:可能继承训练数据或语言模型中的偏见。计算资源:由于模型复杂,通常需要更强大的技术。