Paddle高层API实现图像分类(CIFAR-100数据集_ResNet101)

本文介绍了使用PaddlePaddle高层API来实现ResNet101模型对CIFAR-100数据集的图像分类。内容涵盖数据准备、数据增强、模型开发、模型训练和调优,以及利用VisualDL进行模型可视化。文章还提到了学习率策略和早停法来优化模型性能。
摘要由CSDN通过智能技术生成

Paddle高层API实现图像分类(CIFAR-100数据集_ResNet101)

『深度学习7日打卡营·大作业』

零基础解锁深度学习神器飞桨框架高层API,七天时间助你掌握CV、NLP领域最火模型及应用。

  1. 课程地址
    传送门:https://aistudio.baidu.com/aistudio/course/introduce/6771

  2. 目标

  • 掌握深度学习常用模型基础知识
  • 熟练掌握一种国产开源深度学习框架
  • 具备独立完成相关深度学习任务的能力
  • 能用所学为AI加一份年味

数据集:

指定数据集:cifar100,通过高层API调用。

可以自己写数据增强和数据预处理功能。

模型:

随便选,模型参数初始化(如:uniform和normal)可以随意调整。

模型训练

各种超参数(如:epochs、batch_size)可以随意调整。

评判标准

最终以model.evaluate的精度输出值(格式如下),计算方式是将eval_dataset送入evaluate接口即可,需要在model.prepare中配置评估指标Accuracy,所用数据集不能被用于训练过。

{
   'loss': [6.4980035], 'acc': 0.8485721442885772} 

导入相关库

import paddle
import numpy as np

paddle.__version__
'2.0.0'
# 配置GPU
paddle.set_device('gpu')
CUDAPlace(0)

② 数据准备

数据增强


    #mean and std of cifar100 dataset
    CIFAR100_TRAIN_MEAN = (0.5070751592371323, 0.48654887331495095, 0.4409178433670343)
    CIFAR100_TRAIN_STD = (0.2673342858792401, 0.2564384629170883, 0.27615047132568404)

	train_transfrom = T.Compose([
            T.Resize((256, 256)),
            T.CenterCrop((224, 224)),
            T.RandomHorizontalFlip(0.5),        # 随机水平翻转
            T.RandomRotation(degrees=15),       # (-degrees,+degrees)
            T.ToTensor(),                      # 数据的格式转换和标准化 HWC => CHW  
            T.Normalize(mean=CIFAR100_MEAN, std=CIFAR100_STD)  # 图像归一化
        ])
        
   eval_transfrom = T.Compose([
            T.Resize(224),
            T.ToTensor(),                       # 数据的格式转换和标准化 HWC => CHW  
            T.Normalize(mean=CIFAR100_MEAN, std=CIFAR100_STD)  # 图像归一化
        ])
    

class paddle.vision.transforms.ToTensor

将形状为 (H x W x C)的输入数据 PIL.Image 或 numpy.ndarray 转换为 (C x H x W)。 如果想保持形状不变,可以将参数 data_format 设置为 ‘HWC’。

同时,如果输入的 PIL.Image 的 mode 是 (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1) 其中一种,或者输入的 numpy.ndarray 数据类型是'uint8',那个会将输入数据从(0-255)的范围缩放到 (0-1)的范围。其他的情况,则保持输入不变。

# 训练数据集
train_dataset = paddle.vision.datasets.Cifar100(mode='train', transform=paddle.vision.transforms.ToTensor())

# 验证数据集
eval_dataset = paddle.vision.datasets.Cifar100(mode='test', transform=paddle.vision.transforms.ToTensor())

# 合并数据集
dataset = paddle.concat([d[0] for d in paddle.io.DataLoader(train_dataset)] + [d[0] for d in paddle.io.DataLoader(eval_dataset)])
# 计算数据均值和方差
print(f'mean:{dataset.mean(axis=[0, 2, 3]).numpy()} \n std:{dataset.std(axis=[0, 2, 3]).numpy()}')
mean:[0.5073715 0.4867007 0.441096 ] 
 std:[0.26750046 0.25658613 0.27630225]

由于要调用resnet101的预训练模型,这里把CIFAR的 32 × 32 32\times 32 32×32的图像resize 224 × 224 224\times 224 224×224的图像,保持特征尺寸和感受野的一致。

import paddle.vision.transforms as T 


# CIFAR100_TRAIN_MEAN = (0.5070751592371323, 0.48654887331495095, 0.4409178433670343)
# CIFAR100_TRAIN_STD = (0.2673342858792401, 0.2564384629170883, 0.27615047132568404)

CIFAR100_MEAN = [0.5073715, 0.4867007, 0.441096]
CIFAR100_STD = [0.26750046, 0.25658613, 0.27630225]

# mean=[0.485, 0.456, 0.406]
# std=[0.229, 0.224, 0.225]

train_transfrom = T.Compose([
            T.Resize((256, 256)),
            T.CenterCrop((224, 224)),
            T.RandomHorizontalFlip(0.5),        # 随机水平翻转
            T.RandomRotation(degrees=15),       # (-degrees,+degrees)
            T.ToTensor(),                      # 数据的格式转换和标准化 HWC => CHW  
            T.Normalize(mean=CIFAR100_MEAN, std=CIFAR100_STD)  # 图像归一化
        ])

eval_transfrom = T.Compose([
            T.Resize(224),
            T.ToTensor(),                       # 数据的格式转换和标准化 HWC => CHW  
            T.Normalize(mean=CIFAR100_MEAN, std=CIFAR100_STD)  # 图像归一化
        ])

# 训练数据集
train_dataset = paddle.vision.datasets.Cifar100(mode='train', transform=train_transfrom)

# 验证数据集
eval_dataset = paddle.vision.datasets.Cifar100(mode='test', transform=eval_transfrom)
print(f'训练集大小: {len(train_dataset)}, 测试集大小: {len(eval_dataset)}')

print("train data shape:", train_dataset[0][0].shape)

print("eval data shape:", eval_dataset[0][0].shape)

# train_dataset[3][0]
训练集大小: 50000, 测试集大小: 10000
train data shape: [3, 224, 224]
eval data shape: [3, 224, 224]
import matplotlib.pyplot as plt

idx = np.random.randint(0, 50000, size=10)

for i in idx:
    img = train_dataset[i][0].numpy().transpose([1, 2, 0])
    plt.imshow(img
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值