PaddlePaddle:CNN对Cifar10图像分类(1)
文章目录
- PaddlePaddle:CNN对Cifar10图像分类(1)
- (一)PaddlePaddle简介
- 1.PaddlePaddle
- 2.Paddle套件
- (二)卷积神经网络CNN
- 1.卷积神经网络的层级结构
- 2.典型的卷积神经网络
- (三)Cifar10和Cifar100数据集
- 1.cifar10数据集
- 2.cifar100数据集
- (四)数据集加载和预处理
- 1.数据集加载
- 2.数据加载器
(一)PaddlePaddle简介
1.PaddlePaddle
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体。目前,飞桨已凝聚超265万开发者,服务企业10万家,基于飞桨开源深度学习平台产生了34万个模型
[1] 。飞桨助力开发者快速实现AI想法,快速上线AI业务。帮助越来越多的行业完成AI赋能,实现产业智能化升级。
2.Paddle套件
开发套件
1.ERNIE
飞桨语义理解套件,基于持续学习语义理解预训练框架,使用多任务学习增量式构建预训练任务,支持各类训练任务的Fine-tuning,保证极速推理的Fast-Inference API,兼具灵活部署的ERNIE Service和具备轻量方案的ERNIE Tiny系列工具集。
2.PaddleClas
飞桨图像分类套件,目的是为工业界和学术界提供便捷易用的图像分类任务预训练模型和工具集,打通模型开发、训练、压缩、部署全流程,辅助其它高层视觉任务组网并提升模型效果,助力开发者训练更好的图像分类模型和应用落地。
3.PaddleSeg
飞桨图像分割套件PaddleSeg覆盖了U-Net、DeepLabv3+、ICNet、PSPNet和HRNet等主流的分割模型。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。
4.PaddleDetection
飞桨目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的训练、精度速度优化到部署全流程。PaddleDetection以模块化的设计实现了多种主流目标检测算法,并且提供了丰富的数据增强、网络组件、损失函数等模块,集成了模型压缩和跨平台高性能部署能力。目前基于PaddleDetection已经完成落地的项目涉及工业质检、遥感图像检测、无人巡检等多个领域。
5.PaddleOCR
飞桨文字识别套件,旨在打造一套丰富、领先、实用的文字检测、识别模型/工具库,开源了超轻量级中文OCR模型和通用中文OCR模型,提供了数十种文本检测、识别模型训练方法,助力使用者训练出更好的模型,并应用落地。
6.ElasticCTR
飞桨弹性计算推荐套件,可以实现分布式训练CTR预估任务和基于PaddleServing的在线个性化推荐服务。PaddleServing服务化部署框架具有良好的易用性、灵活性和高性能,可以提供端到端的CTR训练和部署解决方案。ElasticCTR具备产业实践基础、弹性调度能力、高性能和工业级部署等特点。
7.PLSC
飞桨海量类别分类套件,为用户提供了大规模分类任务从训练到部署的全流程解决方案。提供简洁易用的高层API,通过数行代码即可实现千万类别分类神经网络的训练,并提供快速部署模型的能力。Parakeet 飞桨语音合成套件,提供了灵活、高效、先进的文本到语音合成工具,帮助开发者更便捷高效地完成语音合成模型的开发和应用。
工具套件
1.PaddleHub
飞桨预训练模型应用工具,覆盖文本、图像、视频三大领域超过130个高质量预训练模型。开发者可以轻松结合实际业务场景,选用高质量预训练模型并配合Fine-tuneAPI快速完成模型验证与应用部署工作。适用于个人开发者学习、企业POC快速验证、参加AI竞赛以及教学科研等多种业务场景。 PARL飞桨深度强化学习框架,在NeurIPS2019和NeurIPS2018挑战赛中夺冠。具有高灵活性、可扩展性和高性能的特点,覆盖TD3、PPO、IMPALA、A2C、GA3C等10+主流强化学习算法以及EvolutionAlgorithm进化学习算法,支持大规模并行训练和线上快速部署。
2.AutoDL
飞桨自动化深度学习工具,旨在自动网络结构设计,开源的AutoDL设计的图像分类网络在CIFAR10数据集正确率达到98%,效果优于目前已公开的10类人类专家设计的网络,居于业内领先位置。(数据来源:内部测试10种网络分别为:vgg_15_BN_64、vgg_16、resnet_32、resnet_56、resnet_110、resnet_v2_bottleneck_164、wide_resnet、densenet_BC_100_12、resnet_29_8x64d、shake_shake_64d_cutout,实际结果可能受测试环境影响而在一定范围内变化,仅供参考)
3. VisualDL
飞桨可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。帮助用户清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型调优。
4. PALM
飞桨多任务学习框架,一个灵活、通用且易于使用的NLP大规模预训练和多任务学习框架,旨在快速开发高性能NLP模型的上层框架。使用PALM可以非常轻松灵活的探索具有多种任务辅助训练的“高鲁棒性”阅读理解模型,基于PALM训练的模型D-Net在EMNLP2019国际阅读理解评测中夺得冠军。
5.PGL
飞桨图学习框架,业界首个提出通用消息并行传递机制,支持百亿规模巨图的工业级图学习框架。原生支持异构图,支持分布式图存储及分布式学习算法,覆盖20+图学习模型,包括自研深度语义图模型ERNIESage等。历经大量真实工业应用验证,能够灵活、高效地搭建前沿的大规模图学习算法。
6. PaddleFL
飞桨联邦学习框架,研究人员可以很轻松地用PaddleFL复制和比较不同的联邦学习算法,便捷地实现大规模分布式集群部署,并且提供丰富的横向和纵向联邦学习策略及其在计算机视觉、自然语言处理、推荐算法等领域的应用。此外,依靠着PaddlePaddle的大规模分布式训练和Kubernetes对训练任务的弹性调度能力,PaddleFL可以基于全栈开源软件轻松部署。
7.Paddle Quantum
飞桨量子机器学习框架,提供量子优化、量子化学等前沿应用工具集,常用量子电路模型,以及丰富的量子机器学习案例,帮助开发者便捷地搭建量子神经网络。
8.PaddleCloud
飞桨云上任务提交工具,能够帮助您一键发起深度学习任务,为您提供快速打通云上计算资源通道,支持您快速发起单机/分布式飞桨核心框架训练任务,致力于推动AI应用更广泛地落地。
9.PaddleX
飞桨全流程开发工具,集成了飞桨视觉套件、模型压缩工具PaddleSlim、可视化分析工具VisualDL、轻量化推理引擎PaddleLite等核心模块的能力,并提供简明易懂的Python API,方便用户根据实际生产需求进行直接调用或二次开发。PaddleX具备全流程打通、融合产业实践、易用易集成三大特点,为开发者提供飞桨全流程开发的最佳实践。
(二)卷积神经网络CNN
1.卷积神经网络的层级结构
主要有以下层次:
(1) 数据输入层/ Input layer
主要有三种常见的数据处理方式:
(2) 卷积计算层/ CONV layerCNN相关概念:
卷积和计算:
卷积神经网络重要机制:
(3) 激励层 / Activation layer几种重要的激活函数:
(4) 池化层 / Pooling layer
(5) 全连接层 / FC layer
(6) Batch Normalization层(可能有)
2.典型的卷积神经网络
- LeNet,这是最早用于数字识别的CNN
- AlexNet,2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层。
- ZF Net,2013 ILSVRC比赛冠军
- GoogLeNet,2014 ILSVRC比赛冠军
- VGGNet,2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet
- GoogLeNet,但是在很多图像转化学习问题(比如objectdetection)上效果很好
- ResNet,2015ILSVRC比赛冠军,结构修正(残差学习)以适应深层次CNN训练。
- DenseNet,CVPR2017 best paper,把ResNet的add变成concat
(三)Cifar10和Cifar100数据集
1.cifar10数据集
CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像有50000个训练图像和10000个测试图像。数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。以下是数据集中的类,以及来自每个类的10个随机图像:
下载数据集:打开Cifar10官网,从Vision下载所需的部分,然后可以按照官网的教程学习后面的压缩过程。
2.cifar100数据集
这个数据集就像CIFAR-10,除了它有100个类,每个类包含600个图像。,每类各有500个训练图像和100个测试图像。CIFAR-100中的100个类被分成20个超类。每个图像都带有一个“精细”标签(它所属的类)和一个“粗糙”标签(它所属的超类)
超类 | 类别 |
水生哺乳动物 | 海狸,海豚,水獭,海豹,鲸鱼 |
鱼 | 水族馆的鱼,比目鱼,射线,鲨鱼,鳟鱼 |
花卉 | 兰花,罂粟花,玫瑰,向日葵,郁金香 |
食品容器 | 瓶子,碗,罐子,杯子,盘子 |
水果和蔬菜 | 苹果,蘑菇,橘子,梨,甜椒 |
家用电器 | 时钟,电脑键盘,台灯,电话机,电视机 |
家用家具 | 床,椅子,沙发,桌子,衣柜 |
昆虫 | 蜜蜂,甲虫,蝴蝶,毛虫,蟑螂 |
大型食肉动物 | 熊,豹,狮子,老虎,狼 |
大型人造户外用品 | 桥,城堡,房子,路,摩天大楼 |
大自然的户外场景 | 云,森林,山,平原,海 |
大杂食动物和食草动物 | 骆驼,牛,黑猩猩,大象,袋鼠 |
中型哺乳动物 | 狐狸,豪猪,负鼠,浣熊,臭鼬 |
非昆虫无脊椎动物 | 螃蟹,龙虾,蜗牛,蜘蛛,蠕虫 |
人 | 宝贝,男孩,女孩,男人,女人 |
爬行动物 | 鳄鱼,恐龙,蜥蜴,蛇,乌龟 |
小型哺乳动物 | 仓鼠,老鼠,兔子,母老虎,松鼠 |
树木 | 枫树,橡树,棕榈,松树,柳树 |
车辆1 | 自行车,公共汽车,摩托车,皮卡车,火车 |
车辆2 | 割草机,火箭,有轨电车,坦克,拖拉机 |
Superclass | Classes |
aquatic | mammals beaver, dolphin, otter, seal, whale |
flowers | orchids, poppies, roses, sunflowers, tulips |
food | containers bottles, bowls, cans, cups, plates |
fruit | and vegetables apples, mushrooms, oranges, pears, sweet peppers |
household | electrical devices clock, computer keyboard, lamp, telephone, television |
household | furniture bed, chair, couch, table, wardrobe |
insects | bee, beetle, butterfly, caterpillar, cockroach |
large | carnivores bear, leopard, lion, tiger, wolf |
large | man-made outdoor things bridge, castle, house, road, skyscraper |
large | natural outdoor scenes cloud, forest, mountain, plain, sea |
large | omnivores and herbivores camel, cattle, chimpanzee, elephant, kangaroo |
medium-sized | mammals fox, porcupine, possum, raccoon, skunk |
non-insect | invertebrates crab, lobster, snail, spider, worm |
people | baby, boy, girl, man, woman |
reptiles | crocodile, dinosaur, lizard, snake, turtle |
small | mammals hamster, mouse, rabbit, shrew, squirrel |
trees | maple, oak, palm, pine, willow |
vehicles 1 | bicycle, bus, motorcycle, pickup truck, train |
vehicles 2 | lawn-mower, rocket, streetcar, tank, tractor |
(四)数据集加载和预处理
1.数据集加载
import os
import gzip
from struct import unpack
import numpy as np
# 从文件中加载 CIFAR-10 数据集
def cifar10(data_path='./data', data_split=None):
if data_split is None:
split = ['data_batch', 'test_batch']
elif data_split == 'train':
split = ['data_batch', ]
elif data_split == 'test':
split = ['test_batch', ]
else:
raise ValueError('data_split should be in (train, test)')
print('loading CIFAR-10 dataset ......')
data = []
with tarfile.open(os.path.join(data_path, 'cifar-10-python.tar.gz'), mode='r') as f:
for item in split:
images, labels = [], []
for file_name in f:
if item in file_name.name:
temp = pickle.load(f.extractfile(file_name.name), encoding='bytes')
images.append(temp[b'data'])
labels += temp[b'labels']
images = np.concatenate(images, axis=0).reshape(-1, 3, 32, 32)
labels = np.array(labels).reshape(-1, 1)
assert images.shape[0] == labels.shape[0], \
'length of images({}) should be the same as labels({})'.format(images.shape[0], labels.shape[0])
data.append((images, labels))
return tuple(data)
2.数据加载器
import random
import numpy as np
# 数据加载器
def data_loader(data, batch_size=100, shuffle=False):
images = (data[0].astype('float32') / 255.0 - 0.5) / 0.5 # 数据归一化: 0~255 -->> -1~1
labels = data[1].astype('int64')
assert images.shape[0] == labels.shape[0], \
'length of images({}) should be the same as labels({})'.format(images.shape[0], labels.shape[0])
data_ids = list(range(labels.shape[0]))
def generator():
if shuffle:
random.shuffle(data_ids)
batch_image, batch_label = [], []
for i in data_ids:
batch_image.append(images[i])
batch_label.append(labels[i])
# 返回批数据
if len(batch_label) == batch_size:
yield np.array(batch_image), np.array(batch_label)
batch_image, batch_label = [], []
if len(batch_label) > 0:
yield np.array(batch_image), np.array(batch_label)
return generator
if __name__ == '__main__':
for data_name in ('mnist', 'cifar10'):
train_data, test_data = eval(data_name)()
print(data_name)
print('train_data', train_data[0].shape, train_data[1].shape, train_data[0].dtype, train_data[1].dtype)
print('test_data', test_data[0].shape, test_data[1].shape, test_data[0].dtype, test_data[1].dtype)
train_loader = data_loader(train_data, batch_size=10, shuffle=True)
batch_image, batch_label = next(train_loader())
print('batch_image', batch_image.shape, batch_image.dtype, np.min(batch_image), np.max(batch_image))
print('batch_label', batch_label.shape, batch_label.dtype, batch_label)
print()