利用pytorch实现迁移学习之猫狗分类器(dog vs cat)

迁移学习

迁移学习(Transfer learning) 就是把已学训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。
本文使用VGG16模型用于迁移学习,最终得到一个能对猫狗图片进行辨识的CNN(卷积神经网络),测试集用来验证模型是否能够很好的工作。

猫狗分类器

本文使用迁移学习实现猫狗分类器。
数据集来自Kaggle比赛:Dogs vs. Cats Redux: Kernels Edition

利用pytorch实现迁移学习

首先进行图片的导入和预览

path = "dog_vs_cat"
transform = transforms.Compose([transforms.CenterCrop(224),
                                transforms.ToTensor(),
                                transforms.Normalize([0.5,0.5,0.5], [0.5,0.5,0.5])])

data_image = {x:datasets.ImageFolder(root = os.path.join(path,x),
                                     transform = transform)
              for x in ["train", "val"]}

data_loader_image = {x:torch.utils.data.DataLoader(dataset=data_image[x],
                                                batch_size = 4,
                                                shuffle = True)
                     for x in ["train", "val"]}

输入的图片需要分辨率为224*224,所以使用transform.CenterCrop(224)对原始图片进行裁剪。载入的图片训练集合为20000个和验证集合为5000个,原始图片全部为训练集合,需自己拆分出一部分验证集合,输出的Label,1代表为狗,0代表猫。

X_train,y_train = next(iter(data_loader_image["train"]))
mean = [0.5, 0.5, 0.5]
std = [0.5, 0.5, 0.5]
img = torchvision.utils.make_grid(X_train)
img = img.numpy().transpose((1,2,0))
img = img*std + mean

print([classes[i] for i in y_train])
plt.imshow(img)

### 使用 PyTorch 实现猫狗图像分类 #### 1. 主要依赖库 为了实现猫狗图像分类,需要引入以下几个主要的 Python 库: - **PyTorch**: 提供深度学习框架的核心功能,包括张量操作、自动求导机制以及神经网络模块化构建能力[^4]。 - **torchvision**: 包含预定义的数据集加载器、常用的卷积神经网络 (CNN) 架构以及丰富的图像变换工具,极大地简化了图像处理流程[^1]。 - **numpy**: 支持高效数组运算和科学计算,在数据预处理阶段扮演重要角色。 - **matplotlib**: 可视化工具,用于绘制损失曲线或展示预测结果,便于调试和优化模型性能。 #### 2. 数据准备 按照指定结构组织数据集目录是非常重要的一步。具体来说,数据集应当分为 `train` 和 `test` 两部分,各自包含两类子文件夹——即代表不同类别的 “cat” 和 “dog”。这些图片会被用来完成模型训练与最终评估工作[^2]。 #### 3. 模型架构设计 可以选用经典的 CNN 结构来提取图像特征并作出分类决策。例如 ResNet 或者 VGG 系列都是不错的选择。如果希望减少开发时间,则可以直接利用 torchvision 中提供的迁移学习方案,加载已经过 ImageNet 预训练好的权重参数再加以微调即可适应新的任务需求。 #### 4. 训练过程概述 以下是简单的代码片段展示了如何设置基本的训练循环逻辑: ```python import torch from torch import nn, optim from torchvision import datasets, transforms, models # 定义数据增强方式及标准化处理 data_transforms = { 'train': transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) } # 加载数据集 image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']} dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4, shuffle=True, num_workers=4) for x in ['train', 'val']} device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model_ft = models.resnet18(pretrained=True) num_ftrs = model_ft.fc.in_features model_ft.fc = nn.Linear(num_ftrs, 2) model_ft = model_ft.to(device) criterion = nn.CrossEntropyLoss() optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9) for epoch in range(num_epochs): running_loss = 0.0 for inputs, labels in dataloaders['train']: inputs, labels = inputs.to(device), labels.to(device) optimizer_ft.zero_grad() outputs = model_ft(inputs) loss = criterion(outputs, labels) loss.backward() optimizer_ft.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(dataloaders["train"])}') ``` 上述脚本实现了完整的训练周期管理,并定期打印当前批次平均损失值以便监控进度情况。 #### 5. 测试与部署 当训练完成后,可以通过加载保存下来的最优状态字典恢复最佳版本的模型实例来进行实际推断作业。同时也可以借助第三方插件比如 Gradio 创建交互式的 Web UI 来演示整个系统的运行效果。 ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值