pytorch实战 猫狗大战Kaggle 迁移学习ResNet50模型微调

pytorch实战 猫狗大战Kaggle 迁移学习ResNet50模型微调

猫狗大战数据集

  • 这是kaggle上一个非常经典的二分类图像数据集,训练集包括25000张猫和狗的图片及其标签,测试集则是12500张未标签图片,数据下载地址https://www.kaggle.com/c/dogs-vs-cats/data。不过这个网址比较远古,无法提交自己训练的答案,可以到新的(虽然也不新了)比赛链接提交https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview
  • 将训练数据按类别分开整理成如下结构
    |-- train
        |-- cat
            |-- 1.jpg
            |-- 2.jpg
            |-- ...
        |-- dog
            |-- 1.jpg
            |-- 2.jpg
            |-- ...

数据加载及处理

  • 整理好数据后,我们可以直接使用ImageFolder读取并使用random_split()划分数据集验证集

    all_data =  torchvision.datasets.ImageFolder(
        root=train_root,
        transform=train_transform
    )
    train_data , vaild_data= torch.utils.data.random_split(all_data,[int(0.8*len(all_data)),len(all_data)-int(0.8*len(all_data)))
  • 复杂的也可以继承datasets类,简单示例
    class MyDataset(Dataset):
    
        def __init__(self, root, size=229, ):
            """
            Initialize the data producer
            """
            self._root = root
            self._size = size
            self._num_image = len(os.listdir(root))
            self._img_name = os.listdir(root)
    
        def __len__(self):
            return self._num_image
    
        def __getitem__(self, index):
            img = Image.open(os.path.join(self._root, self._img_name[index]))
    
            # PIF image: H × W × C
            # torch image: C × H × W
            img = np.array(img, dtype-np.float32).transpose((2, 0, 1))
    
            return img
  • 为防止过拟合,可以对数据进行翻转,亮度,对比度等数据增广
    train_transform = transforms.Compose([
        transforms.Resize(224),
        transforms.RandomResizedCrop(224,scale=(0.6,1.0),ratio=(0.8,1.0)),
        transforms.RandomHorizontalFlip(),
        torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0),
        torchvision.transforms.ColorJitter(brightness=0, contrast=0.5, saturation=0, hue=0),
        transforms.ToTensor(),
        transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5])
    ])
  • 加载为pytorch读取的数据集
    train_set = torch.utils.data.DataLoader(
        train_data,
        batch_size=BTACH_SIZE,
        shuffle=True
    )
    test_set = torch.utils.data.DataLoader(
        vaild_data,
        batch_size=BTACH_SIZE,
        shuffle=False
    )

迁移学习 ResNet50微调

  • 此前自己写过浅层的CNN,验证集准确率只能达到七十多,深了不会写估计训练也很难,于是采用迁移学习的思想,torchvision提供了很多现成的模型和预训练好的参数:

    • Alexnet
    • VGG
    • ResNet
    • SqueezeNet
    • DenseNet
    • Inception v3
  • 这里我们使用残差网络 ResNet50 并且加上全连接层和softmax输出二分类
    model = torchvision.models.resnet50(pretrained=True)
    model.fc = nn.Sequential(
        nn.Linear(2048,2),
        nn.softmax()
    )
  • 这里我用0.01的学习率训练了5次就能达到九十多的准确率了,实际上还可以对输出层使用较高的学习率而对其他层使用较低的学习率来达到更好的微调效果

Kaggle提交

  • 直接提交看看,貌似一般般,在排行榜里算中等
  • kaggle这里的评估是使用logloss
  • 我们看看标签分别是0和1的时候这个loss是怎样的
  • 这时候就可以有一些奇淫技巧,面向评估函数编程,把预测狗的统一改成0.95,猫的改成0.05,再提交一下
  • 仅供娱乐

代码

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import os
import matplotlib.pyplot as plt
from tqdm import tqdm

#超参
DEVICE = torch.device('cuda')
LR = 0.001
EPOCH = 50
BTACH_SIZE = 32
train_root = './train'

#数据加载及处理
train_transform = transforms.Compose([
    transforms.Resize(224),
    transforms.RandomResizedCrop(224,scale=(0.6,1.0),ratio=(0.8,1.0)),
    transforms.RandomHorizontalFlip(),
    torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0),
    torchvision.transforms.ColorJitter(brightness=0, contrast=0.5, saturation=0, hue=0),
    transforms.ToTensor(),
    transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5])
])

all_data =  torchvision.datasets.ImageFolder(
        root=train_root,
        transform=train_transform
    )
    train_data , vaild_data= torch.utils.data.random_split(all_data,[int(0.8*len(all_data)),len(all_data)-int(0.8*len(all_data)))

train_set = torch.utils.data.DataLoader(
    train_data,
    batch_size=BTACH_SIZE,
    shuffle=True
)
test_set = torch.utils.data.DataLoader(
    vaild_data,
    batch_size=BTACH_SIZE,
    shuffle=False
)

#训练和验证
cirterion = nn.CrossEntropyLoss()
def train(model,device,dataset,optimizer,epoch):
    model.train()
    correct = 0
    for i,(x,y) in tqdm(enumerate(dataset)):
        x , y = x.to(device), y.to(device)
        optimizer.zero_grad()
        output = model(x)
        pred = output.max(1,keepdim=True)[1]
        correct += pred.eq(y.view_as(pred)).sum().item()
        loss = cirterion(output,y)
        LOSS.append(loss)
        loss.backward()
        optimizer.step()   

    print("Epoch {} Loss {:.4f} Accuracy {}/{} ({:.0f}%)".format(epoch,loss,correct,len(dataset),100*correct/len(dataset)))

def vaild(model,device,dataset):
    model.eval()
    correct = 0
    with torch.no_grad():
        for i,(x,y) in tqdm(enumerate(dataset)):
            x,y = x.to(device) ,y.to(device)
            output = model(x)
            loss = nn.CrossEntropyLoss(output,y)
            pred = output.max(1,keepdim=True)[1]
            correct += pred.eq(y.view_as(pred)).sum().item()
    print("Test Loss {:.4f} Accuracy {}/{} ({:.0f}%)".format(loss,correct,len(dataset),100.*correct/len(dataset)))

model = torchvision.models.resnet50(pretrained=True)
model.fc = nn.Sequential(
        nn.Linear(2048,2),
        nn.Softmax()
    )
model.to(DEVICE)
optimizer = optim.SGD(model.parameters(), lr = LR, momentum = 0.09)

for epoch in range(1,EPOCH+1):
    train(model,DEVICE,train_set,optimizer,epoch)
    vaild(model,DEVICE,test_set)

原文地址:https://www.cnblogs.com/weiba180/p/12417073.html

时间: 2024-10-11 06:56:10

pytorch实战 猫狗大战Kaggle 迁移学习ResNet50模型微调的相关文章

《深度学习与计算机视觉算法原理框架应用》PDF+《深度学习之PyTorch实战计算机视觉》PDF

下载:https://pan.baidu.com/s/12-s95JrHek82tLRk3UQO_w <深度学习与计算机视觉 算法原理.框架应用>PDF,带书签,347页.<大数据架构详解:从数据获取到深度学习>PDF,带书签,373页.配套源代码. 下载:https://pan.baidu.com/s/1P0-o29x0ZrXp8WotN7GzcA<深度学习之PyTorch实战计算机视觉> 更多分享:https://pan.baidu.com/s/1g4hv05UZ_

Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)

http://www.cnblogs.com/fiercex/p/7927804.html fiercex 路漫漫其修远兮,吾将上下而求索 Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合) 这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集.注意,mxnet版本要高于0.12.1b2017112.下载数据集. train.zip test.zip labels然后解压在data文件夹下 1. 数据 1.1 整理数据 将解压后的数据整理成Gluon能够读取

深度学习之迁移学习

迁移学习概述背景随着越来越多的机器学习应用场景的出现,而现有表现比较好的监督学习需要大量的标注数据,标注数据是一项枯燥无味且花费巨大的任务,所以迁移学习受到越来越多的关注.传统机器学习(主要指监督学习) 基于同分布假设 需要大量标注数据 然而实际使用过程中不同数据集可能存在一些问题,比如 数据分布差异 标注数据过期 训练数据过期,也就是好不容易标定的数据要被丢弃,有些应用中数据是分布随着时间推移会有变化.如何充分利用之前标注好的数据(废物利用),同时又保证在新的任务上的模型精度?基于这样的问题,

有关迁移学习论文

Application of Transfer Learning in Continuous Time Series for Anomaly Detection in Commercial Aircraft Flight Data https://ieeexplore.ieee.org/document/8513709 论文开始介绍了用于处理时间序列的两个主要的模型RNN和LSTM,同时介绍了什么是迁移学习 一 迁移学习的方法 1 基于样例的迁移学习(instance-based transfe

迁移学习、fine-tune和局部参数恢复

参考:迁移学习——Fine-tune 一.迁移学习 就是把已训练好的模型参数迁移到新的模型来帮助新模型训练. 模型的训练与预测: 深度学习的模型可以划分为 训练 和 预测 两个阶段. 训练 分为两种策略:一种是白手起家从头搭建模型进行训练,一种是通过预训练模型进行训练. 预测 相对简单,直接用已经训练好的模型对数据集进行预测即可. 优点: 1)站在巨人的肩膀上:前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要强悍,没有必要重复造轮子. 2)训练成本可以很低:如果采用导出特征向量

Keras猫狗大战七:resnet50预训练模型迁移学习优化,动态调整学习率,精度提高到96.2%

在https://www.cnblogs.com/zhengbiqing/p/11780161.html中直接在resnet网络的卷积层后添加一层分类层,得到一个最简单的迁移学习模型,得到的结果为95.3%. 这里对最后的分类网络做些优化:用GlobalAveragePooling2D替换Flatten.增加一个密集连接层(同时添加BN.Activation.Dropout): conv_base = ResNet50(weights='imagenet', include_top=False,

1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习

ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks,原作者保留版权 卷积神经网络在视觉识别任务上的表现令人称奇.好的CNN网络是带有上百万参数和许多隐含层的"庞然怪物".事实上,一个不好的经验规则是:网络越深,效果越好.AlexNet,VGG,Inc

分享《深度学习之PyTorch实战计算机视觉》PDF

下载:https://pan.baidu.com/s/1Yhf2Pv0gy63VgiMQTglgXA 更多资料:http://blog.51cto.com/3215120 <深度学习之PyTorch实战计算机视觉>两个版本的高清PDF,287页,带书签目录,文字可以复制. 如图: 原文地址:http://blog.51cto.com/3215120/2316431

参考《深度学习之PyTorch实战计算机视觉》PDF

计算机视觉.自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向. 计算机视觉学习,推荐阅读<深度学习之PyTorch实战计算机视觉>.学到人工智能的基础概念及Python 编程技能,掌握PyTorch 的使用方法,学到深度学习相关的理论知识,比如卷积神经网络.循环神经网络.自动编码器,等等.在掌握深度学习理论和编程技能之后,还会学到如何基于PyTorch 深度学习框架实战计算机视觉.<深度学习之PyTorch实战计算机视觉>中的大量实例在循序渐进地学习的同时,不断地获得成