摘要:
记录MindSpore AI框架使用ViT模型在ImageNet图像数据分类上进行训练、验证、推理的过程和方法。包括环境准备、下载数据集、数据集加载、模型解析与构建、模型训练与推理等。
一、概念
1. ViT模型
Vision Transformer
自注意结构模型
Self-Attention
Transformer模型
能够训练具有超过100B规模的参数模型
领域
自然语言处理
计算机视觉
不依赖卷积操作
2.模型结构
ViT模型主体结构
从下往上
最下面主输入数据集
原图像划分为多个patch(图像块)
二维patch(不考虑channel)转换为一维向量
中间backbone基于Transformer模型Encoder部分
Multi-head Attention结构
部分结构顺序有调整
Normalization位置不同
上面Blocks堆叠后接全连接层Head
附加输入类别向量
输出识别分类结果
二、环境准备
确保安装了Python环境和MindSpore
%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
# 查看当前 mindspore 版本
!pip show mindspore
输出:
Name: mindspore
Version: 2.2.14
Summary: MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios.
Home-page: https://www.mindspore.cn
Author: The MindSpore Authors
Author-email: contact@mindspore.cn
License: Apache 2.0
Location: /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages
Requires: asttokens, astunparse, numpy, packaging, pillow, protobuf, psutil, scipy
Required-by:
三、数据准备
1.下载、解压数据集
下载源
ImageNet数据集
本案例应用数据集是从ImageNet筛选的子集。
from download import download
dataset_url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/vit_imagenet_dataset.zip"
path = "./"
path = download(dataset_url, path, kind="zip", replace=True)
输出:
Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/vit_imagenet_dataset.zip (489.1 MB)
file_sizes: 100%|█████████████████████████████| 513M/513M [00:02<00:00, 228MB/s]
Extracting zip file...
Successfully downloaded / unzipped to ./
2.数据集路径结构:
.dataset/
├── ILSVRC2012_devkit_t12.tar.gz
├── train/
├── infer/
└── val/
3.加载数据集
import os
import mindspore as ms
from mindspore.dataset import ImageFolderDataset
import mindspore.dataset.vision as transforms
data_path = './dataset/'
mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]
std = [0.229 * 255, 0.224 * 255, 0.225 * 255]
dataset_train = ImageFolderDataset(os.path.join(data_path, "train"), shuffle=True)
trans_train = [
transforms.RandomCropDecodeResize(size=224,
scale=(0.08, 1.0),
ratio=(0.75, 1.333)),
transforms.RandomHorizontalFlip(prob=0.5),
transforms.Normalize(mean=mean, std=std),
transforms.HWC2CHW()
]
dataset_train = dataset_train.map(operations=trans_train, input_columns=["image"])
dataset_train = dataset_train.batch(batch_size=16, drop_remainder=True)
四、模型解析
1.Transformer基本原理
Transformer模型
基于Attention机制的编码器-解码器型结构
模型结构图:
多个Encoder和Decoder模块所组成
Encoder和Decoder详细结构图:
Encoder与Decoder结构组成
多头注意力Multi-Head Attention层
基于自注意力Self-Attention机制
多个Self-Attention并行组成
Feed Forward层
Normaliztion层
残差连接(Residual Connection),图中的“Add”
2.Attention模块
Self-Attention核心内容