飞桨完成入门图像分类最强指南
零基础白话图像分类
课程传送门『领航团图像分类课程』
全流程白话解析传送门
什么是图像分类
图像分类是基于深度学习的cv分类任务。
核心是从给定的分类集合中给图像分配一个标签的任务。
实际上我们的任务是分析一个输入图像并返回一个图像分类的标签。
标签总是来自预定义的可能类别集。
说白了就是经过学习以后的模型可以划分图像的类别
就像刚出生的婴儿识别猫狗一样,也是后天大量数据学习得到的。
import paddle
print("paddle当前版本 " + paddle.__version__)
paddle当前版本 2.0.0
什么是数据如何处理数据
- 什么是数据(以图为例)
数据可以分为训练集、验证集和测试集 一般比例为6:2:2
训练集就是给既定的模型喂数据(给孩子看大量的猫狗图片)
验证集就是问大街上单独的一个猫或狗的数据然后对错误的进行纠正以便以下次更好的训练
测试集就是当孩子熟悉了有关的特征以后自然的报出猫或狗
个人理解:训练集类似于平时学习的知识;验证集是周考月考,便于调整学习状态等;而测试集就是期末考试检验模型真实的水平
- 数据如何处理(以图为例)
根据不同的图我们要对模型进行设计,这里的数据就需要做归一化处理,图像是多大的,几通道等等
在paddle中可以通过继承paddle.io.Dataset
修改里面的__getitem__
、__init__
、__len__
进行调整
也可以直接导入官方已经处理好的数据集可以直接进行使用。
# 框架处理好的数据集查看
print('视觉相关数据集:', paddle.vision.datasets.__all__)
print('自然语言相关数据集:', paddle.text.datasets.__all__)
视觉相关数据集: ['DatasetFolder', 'ImageFolder', 'MNIST', 'FashionMNIST', 'Flowers', 'Cifar10', 'Cifar100', 'VOC2012']
自然语言相关数据集: ['Conll05st', 'Imdb', 'Imikolov', 'Movielens', 'UCIHousing', 'WMT14', 'WMT16']
from paddle.vision.transforms import ToTensor # 导入ToTensor 用ToTensor将数据格式转为paddle Tensor
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
print(train_dataset[0]) # 查看数据(paddle Tensor 大小为1,28,28)
(Tensor(shape=[1, 28, 28], dtype=float32, place=CPUPlace, stop_gradient=True,
[[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.01176471, 0.07058824, 0.07058824, 0.07058824, 0.49411768, 0.53333336, 0.68627453, 0.10196079, 0.65098041, 1., 0.96862751, 0.49803925, 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.11764707, 0.14117648, 0.36862746, 0.60392159, 0.66666669, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.88235301, 0.67450982, 0.99215692, 0.94901967, 0.76470596, 0.25098041, 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.19215688, 0.93333340, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.98431379, 0.36470589, 0.32156864, 0.32156864, 0.21960786, 0.15294118, 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0.07058824, 0.85882360, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.77647066, 0.71372551, 0.96862751, 0.94509810, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.31372550, 0.61176473, 0.41960788, 0.99215692, 0.99215692, 0.80392164, 0.04313726, 0., 0.16862746, 0.60392159, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.05490196, 0.00392157, 0.60392159, 0.99215692, 0.35294119, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.54509807, 0.99215692, 0.74509805, 0.00784314, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.04313726, 0.74509805, 0.99215692, 0.27450982, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.13725491, 0.94509810, 0.88235301, 0.62745100, 0.42352945, 0.00392157, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.31764707, 0.94117653, 0.99215692, 0.99215692, 0.46666670, 0.09803922, 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.17647059, 0.72941178, 0.99215692, 0.99215692, 0.58823532, 0.10588236, 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.06274510, 0.36470589, 0.98823535, 0.99215692, 0.73333335, 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.97647065, 0.99215692, 0.97647065, 0.25098041, 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.18039216, 0.50980395, 0.71764708, 0.99215692, 0.99215692, 0.81176478, 0.00784314, 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.15294118, 0.58039218, 0.89803928, 0.99215692, 0.99215692, 0.99215692, 0.98039222, 0.71372551, 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.09411766, 0.44705886, 0.86666673, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.78823537, 0.30588236, 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0.09019608, 0.25882354, 0.83529419, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.77647066, 0.31764707, 0.00784314, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0.07058824, 0.67058825, 0.85882360, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.76470596, 0.31372550, 0.03529412, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.21568629, 0.67450982, 0.88627458, 0.99215692, 0.99215692, 0.99215692, 0.99215692, 0.95686281, 0.52156866, 0.04313726, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.53333336, 0.99215692, 0.99215692, 0.99215692, 0.83137262, 0.52941179, 0.51764709, 0.06274510, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]]), array([5]))
# 此处没有导入图就做一个解析
from paddle.io import Dataset # 导入Datasrt库
class MyDataset(Dataset):
"""
步骤一:继承paddle.io.Dataset类
"""
def __init__(self, mode='train'):
"""
步骤二:实现构造函数,定义数据读取方式,划分训练和测试数据集
"""
self.data = []
with open(f'{mode}.txt') as f: