赞
踩
近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformer的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前规模的模型。
ViT则是自然语言处理和计算机视觉两个领域的融合结晶。在不依赖卷积操作的情况下,依然可以在图像分类任务上达到很好的效果。
ViT模型的主体结构是基于Transformer模型的Encoder部分(部分结构顺序有调整,如:Normalization的位置与标准Transformer不同),其结构图[1]如下:
ViT模型主要应用于图像分类领域。因此,其模型结构相较于传统的Transformer有以下几个特点:
下面将通过代码实例来详细解释基于ViT实现ImageNet分类任务。
注意,本教程在CPU上运行时间过长,不建议使用CPU运行。
开始实验之前,请确保本地已经安装了Python环境并安装了MindSpore。
首先我们需要下载本案例的数据集,可通过http://image-net.org下载完整的ImageNet数据集,本案例应用的数据集是从ImageNet中筛选出来的子集。
运行第一段代码时会自动下载并解压,请确保你的数据集路径如以下结构。
.dataset/
├── ILSVRC2012_devkit_t12.tar.gz
├── train/
├── infer/
└── val/
from download import download # 导入download模块中的download函数
# 定义数据集的URL
dataset_url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/vit_imagenet_dataset.zip"
# 定义下载的保存路径
path = "./" # 当前目录
# 调用download函数下载数据集
path = download(dataset_url, path, kind="zip", replace=True) # 下载数据集并指定为zip文件,若已存在则替换
from download import download
:
download
模块中导入了download
函数。这个函数通常用于从指定的URL下载文件。dataset_url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/vit_imagenet_dataset.zip"
:
dataset_url
,它包含了要下载的数据集的链接。这个链接指向一个zip文件,包含了ImageNet数据集的一部分。path = "./"
:
path
,其值为当前目录"./"
。这意味着下载的文件将保存在当前执行代码的目录中。path = download(dataset_url, path, kind="zip", replace=True)
:
download
函数:
dataset_url
: 指定要下载的文件的URL。path
: 指定下载后文件的保存路径。kind="zip"
: 指定下载文件的类型为zip格式。replace=True
: 如果文件已存在,则会被替换。download(url, path, kind, replace)
:
url
: 要下载文件的链接。path
: 文件下载后保存的路径。kind
: 指定下载文件的类型,通常为"zip"、"tar"等,适用于不同格式的压缩包。replace
: 布尔值,决定是否覆盖已存在的同名文件。设置为True
时,若目标路径已有同名文件,则将其替换。import os # 导入os模块,用于处理文件和目录路径 import mindspore as ms # 导入MindSpore库 from mindspore.dataset import ImageFolderDataset # 从MindSpore中导入ImageFolderDataset类,用于加载图像文件夹数据集 import mindspore.dataset.vision as transforms # 导入MindSpore的图像处理变换模块 # 定义数据集路径 data_path = './dataset/' # 存放数据集的路径 # 定义图像的均值和标准差,用于归一化 mean = [0.485 * 255, 0.456 * 255, 0.406 * 255] # RGB通道的均值 std = [0.229 * 255, 0.224 * 255, 0.225 * 255] # RGB通道的标准差 # 创建训练数据集 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), # 以50%概率进行随机水平翻转 transforms.Normalize(mean=mean, std=std), # 对图像进行归一化处理 transforms.HWC2CHW() # 将图像从HWC格式转换为CHW格式 ] # 将变换应用于数据集 dataset_train = dataset_train.map(operations=trans_train, input_columns=["image"]) # 对图像列应用预处理操作 # 将数据集分批处理 dataset_train = dataset_train.batch(batch_size=16, drop_remainder=True) # 将数据集按批次进行处理,每批次16张图像,若不足16张则丢弃
import os
:
os
模块,以便于处理文件路径和目录操作。import mindspore as ms
:
from mindspore.dataset import ImageFolderDataset
:
ImageFolderDataset
类,这个类用于加载存储在文件夹中的图像数据集。import mindspore.dataset.vision as transforms
:
data_path = './dataset/'
:
dataset
文件夹中。mean
** 和 **std
:
dataset_train = ImageFolderDataset(os.path.join(data_path, "train"), shuffle=True)
:
data_path
下的train
目录加载图像数据,并在每个epoch结束时随机打乱数据顺序。trans_train
:
RandomCropDecodeResize
: 随机裁剪并调整图像大小到224x224。RandomHorizontalFlip
: 随机水平翻转图像,概率为0.5。Normalize
: 使用指定的均值和标准差对图像进行归一化处理。HWC2CHW
: 将图像格式从高度-宽度-通道(HWC)转换为通道-高度-宽度(CHW)。dataset_train.map(operations=trans_train, input_columns=["image"])
:
dataset_train.batch(batch_size=16, drop_remainder=True)
:
drop_remainder=True
表示如果最后一批数据不足16张,则丢弃该批次。ImageFolderDataset
:
transforms.RandomCropDecodeResize
:
transforms.RandomHorizontalFlip
:
transforms.Normalize
:
transforms.HWC2CHW
:
dataset.map()
:
dataset.batch()
:
下面将通过代码来细致剖析ViT模型的内部结构。
Transformer模型源于2017年的一篇文章[2]。在这篇文章中提出的基于Attention机制的编码器-解码器型结构在自然语言处理领域获得了巨大的成功。模型结构如下图所示:
其主要结构为多个Encoder和Decoder模块所组成,其中Encoder和Decoder的详细结构如下图[2]所示:
Encoder与Decoder由许多结构组成,如:多头注意力(Multi-Head Attention)层,Feed Forward层,Normaliztion层,甚至残差连接(Residual Connection,图中的“Add”)。不过,其中最重要的结构是多头注意力(Multi-Head Attention)结构,该结构基于自注意力(Self-Attention)机制,是多个Self-Attention的并行组成。
所以,理解了Self-Attention就抓住了Transformer的核心。
以下是Self-Attention的解释,其核心内容是为输入向量的每个单词学习一个权重。通过给定一个任务相关的查询向量Query向量,计算Query和各个Key的相似性或者相关性得到注意力分布,即得到每个Key对应Value的权重系数,然后对Value进行加权求和得到最终的Attention数值。
在Self-Attention中:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。