Paddle高层API实现图像分类(CIFAR-100数据集_ResNet101)
『深度学习7日打卡营·大作业』
零基础解锁深度学习神器飞桨框架高层API,七天时间助你掌握CV、NLP领域最火模型及应用。
- 掌握深度学习常用模型基础知识
- 熟练掌握一种国产开源深度学习框架
- 具备独立完成相关深度学习任务的能力
- 能用所学为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