【计算机视觉】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), # 将图像