当前位置:实例文章 » 其他实例» [文章]【计算机视觉】DINOv2(视觉大模型)代码四个不同模型的对比,以 28 * 28 的图像为例(完整的源代码)

【计算机视觉】DINOv2(视觉大模型)代码四个不同模型的对比,以 28 * 28 的图像为例(完整的源代码)

发布人:shili8 发布时间:2025-02-04 01:12 阅读次数:0

**计算机视觉 DINOv2 视觉大模型**

DINOv2 是一种基于自监督学习的视觉大模型,旨在提高图像分类任务的性能。相比传统的监督式学习方法,DINOv2 利用无标签数据进行训练,从而减少了数据标注的负担。

**四个不同模型的对比**

本文将比较四种不同的视觉大模型:DINOv2、ResNet50、ViT-B/16 和 Swin-T。这些模型都将用于图像分类任务,输入图像大小为28 *28。

### **1. DINOv2**

DINOv2 是一种自监督学习的视觉大模型,它通过无标签数据进行训练,从而提高了图像分类任务的性能。

import torchimport torchvisionfrom torchvision import transforms# 定义数据转换器transform = transforms.Compose([
 transforms.Resize(32), # 将图像大小调整为32 *32 transforms.ToTensor(),
])

# 加载无标签数据集train_dataset = torchvision.datasets.ImageFolder(root='./data/train', transform=transform)
test_dataset = torchvision.datasets.ImageFolder(root='./data/test', transform=transform)

# 定义自监督学习的损失函数def self_supervised_loss(model, device):
 # 将模型设置为训练模式 model.train()
 # 初始化总损失值 total_loss =0 # 遍历数据集中的每个样本 for i in range(len(train_dataset)):
 # 加载当前样本的图像和标签 img, _ = train_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算自监督学习的损失值 loss = torch.mean((output - output.detach()) **2)
 # 将损失值添加到总损失中 total_loss += loss.item()
 return total_loss# 定义模型训练函数def train_model(model, device):
 # 初始化总损失值 total_loss =0 # 遍历数据集中的每个样本 for i in range(len(train_dataset)):
 # 加载当前样本的图像和标签 img, _ = train_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算自监督学习的损失值 loss = torch.mean((output - output.detach()) **2)
 # 将损失值添加到总损失中 total_loss += loss.item()
 return total_loss# 定义模型测试函数def test_model(model, device):
 # 初始化正确率 correct_count =0 # 遍历数据集中的每个样本 for i in range(len(test_dataset)):
 # 加载当前样本的图像和标签 img, label = test_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算预测值与真实标签的匹配度 _, predicted = torch.max(output,1)
 # 如果预测值与真实标签匹配,则增加正确率计数 if predicted == label:
 correct_count +=1 return correct_count / len(test_dataset)

# 定义模型训练和测试函数def train_and_test_model(model, device):
 # 训练模型 model.train()
 # 初始化总损失值 total_loss =0 # 遍历数据集中的每个样本 for i in range(len(train_dataset)):
 # 加载当前样本的图像和标签 img, _ = train_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算自监督学习的损失值 loss = torch.mean((output - output.detach()) **2)
 # 将损失值添加到总损失中 total_loss += loss.item()
 # 测试模型 model.eval()
 return test_model(model, device)

# 定义主函数def main():
 # 加载设备 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
 # 初始化模型 model = DINOv2(num_classes=10)
 # 将模型设置为训练模式 model.train()
 # 训练模型 train_model(model, device)
 # 测试模型 test_model(model, device)

# 执行主函数if __name__ == "__main__":
 main()



### **2. ResNet50**

ResNet50 是一种深度卷积神经网络,用于图像分类任务。

import torchimport torchvisionfrom torchvision import transforms# 定义数据转换器transform = transforms.Compose([
 transforms.Resize(32), # 将图像大小调整为32 *32 transforms.ToTensor(),
])

# 加载数据集train_dataset = torchvision.datasets.ImageFolder(root='./data/train', transform=transform)
test_dataset = torchvision.datasets.ImageFolder(root='./data/test', transform=transform)

# 定义模型训练函数def train_model(model, device):
 # 初始化总损失值 total_loss =0 # 遍历数据集中的每个样本 for i in range(len(train_dataset)):
 # 加载当前样本的图像和标签 img, label = train_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算损失值 loss = torch.mean((output - label) **2)
 # 将损失值添加到总损失中 total_loss += loss.item()
 return total_loss# 定义模型测试函数def test_model(model, device):
 # 初始化正确率 correct_count =0 # 遍历数据集中的每个样本 for i in range(len(test_dataset)):
 # 加载当前样本的图像和标签 img, label = test_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算预测值与真实标签的匹配度 _, predicted = torch.max(output,1)
 # 如果预测值与真实标签匹配,则增加正确率计数 if predicted == label:
 correct_count +=1 return correct_count / len(test_dataset)

# 定义模型训练和测试函数def train_and_test_model(model, device):
 # 训练模型 model.train()
 # 初始化总损失值 total_loss =0 # 遍历数据集中的每个样本 for i in range(len(train_dataset)):
 # 加载当前样本的图像和标签 img, label = train_dataset[i]
 # 将图像转换为设备上的张量 img = transform(img).to(device)
 # 前向传播计算预测值 output = model(img.unsqueeze(0))
 # 计算损失值 loss = torch.mean((output - label) **2)
 # 将损失值添加到总损失中 total_loss += loss.item()
 # 测试模型 model.eval()
 return test_model(model, device)

# 定义主函数def main():
 # 加载设备 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
 # 初始化模型 model = ResNet50(num_classes=10)
 # 将模型设置为训练模式 model.train()
 # 训练模型 train_model(model, device)
 # 测试模型 test_model(model, device)

# 执行主函数if __name__ == "__main__":
 main()



### **3. ViT**

ViT 是一种视觉transformer,用于图像分类任务。

import torchimport torchvisionfrom torchvision import transforms# 定义数据转换器transform = transforms.Compose([
 transforms.Resize(32), # 将图像

其他信息

其他资源

Top