国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi)

這篇具有很好參考價(jià)值的文章主要介紹了華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

近些年,隨著基于自注意(Self-Attention)結(jié)構(gòu)的模型的發(fā)展,特別是Transformer模型的提出,極大地促進(jìn)了自然語(yǔ)言處理模型的發(fā)展。由于Transformers的計(jì)算效率和可擴(kuò)展性,它已經(jīng)能夠訓(xùn)練具有超過(guò)100B參數(shù)的空前規(guī)模的模型。
ViT則是自然語(yǔ)言處理和計(jì)算機(jī)視覺(jué)兩個(gè)領(lǐng)域的融合結(jié)晶。在不依賴(lài)卷積操作的情況下,依然可以在圖像分類(lèi)任務(wù)上達(dá)到很好的效果。
模型結(jié)構(gòu)
ViT模型的主體結(jié)構(gòu)是基于Transformer模型的Encoder部分(部分結(jié)構(gòu)順序有調(diào)整,如:Normalization的位置與標(biāo)準(zhǔn)Transformer不同),其結(jié)構(gòu)圖[1]如下:
華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer
模型特點(diǎn)
ViT模型主要應(yīng)用于圖像分類(lèi)領(lǐng)域。因此,其模型結(jié)構(gòu)相較于傳統(tǒng)的Transformer有以下幾個(gè)特點(diǎn):
數(shù)據(jù)集的原圖像被劃分為多個(gè)patch后,將二維patch(不考慮channel)轉(zhuǎn)換為一維向量,再加上類(lèi)別向量與位置向量作為模型輸入。
模型主體的Block結(jié)構(gòu)是基于Transformer的Encoder結(jié)構(gòu),但是調(diào)整了Normalization的位置,其中,最主要的結(jié)構(gòu)依然是Multi-head Attention結(jié)構(gòu)。
模型在Blocks堆疊后接全連接層,接受類(lèi)別向量的輸出作為輸入并用于分類(lèi)。通常情況下,我們將最后的全連接層稱(chēng)為Head,Transformer Encoder部分為backbone。

下面將通過(guò)代碼實(shí)例來(lái)詳細(xì)解釋基于ViT實(shí)現(xiàn)ImageNet分類(lèi)任務(wù)。

如果你對(duì)MindSpore感興趣,可以關(guān)注昇思MindSpore社區(qū)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

一、環(huán)境準(zhǔn)備

1.進(jìn)入ModelArts官網(wǎng)

云平臺(tái)幫助用戶(hù)快速創(chuàng)建和部署模型,管理全周期AI工作流,選擇下面的云平臺(tái)以開(kāi)始使用昇思MindSpore,獲取安裝命令,安裝MindSpore2.0.0-alpha版本,可以在昇思教程中進(jìn)入ModelArts官網(wǎng)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

選擇下方CodeLab立即體驗(yàn)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

等待環(huán)境搭建完成

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

2.使用CodeLab體驗(yàn)Notebook實(shí)例

下載NoteBook樣例代碼,Vision Transformer圖像分類(lèi) ,.ipynb為樣例代碼

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

選擇ModelArts Upload Files上傳.ipynb文件

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

選擇Kernel環(huán)境

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

切換至GPU環(huán)境,切換成第一個(gè)限時(shí)免費(fèi)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

進(jìn)入昇思MindSpore官網(wǎng),點(diǎn)擊上方的安裝

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

獲取安裝命令

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

回到Notebook中,在第一塊代碼前加入命令
華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

conda update -n base -c defaults conda

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

安裝MindSpore 2.0 GPU版本

conda install mindspore=2.0.0a0 -c mindspore -c conda-forge

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

安裝mindvision

pip install mindvision

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

安裝下載download

pip install download

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

二、環(huán)境準(zhǔn)備與數(shù)據(jù)讀取

開(kāi)始實(shí)驗(yàn)之前,請(qǐng)確保本地已經(jīng)安裝了Python環(huán)境并安裝了MindSpore。

首先我們需要下載本案例的數(shù)據(jù)集,可通過(guò)http://image-net.org下載完整的ImageNet數(shù)據(jù)集,本案例應(yīng)用的數(shù)據(jù)集是從ImageNet中篩選出來(lái)的子集。

運(yùn)行第一段代碼時(shí)會(huì)自動(dòng)下載并解壓,請(qǐng)確保你的數(shù)據(jù)集路徑如以下結(jié)構(gòu)。

.dataset/
    ├── ILSVRC2012_devkit_t12.tar.gz
    ├── train/
    ├── infer/
    └── val/

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

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)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

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)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

三、模型解析

下面將通過(guò)代碼來(lái)細(xì)致剖析ViT模型的內(nèi)部結(jié)構(gòu)。

Transformer基本原理

Transformer模型源于2017年的一篇文章[2]。在這篇文章中提出的基于Attention機(jī)制的編碼器-解碼器型結(jié)構(gòu)在自然語(yǔ)言處理領(lǐng)域獲得了巨大的成功。模型結(jié)構(gòu)如下圖所示:

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer
其主要結(jié)構(gòu)為多個(gè)Encoder和Decoder模塊所組成,其中Encoder和Decoder的詳細(xì)結(jié)構(gòu)如下圖[2]所示:

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer
Encoder與Decoder由許多結(jié)構(gòu)組成,如:多頭注意力(Multi-Head Attention)層,F(xiàn)eed
Forward層,Normaliztion層,甚至殘差連接(Residual
Connection,圖中的“Add”)。不過(guò),其中最重要的結(jié)構(gòu)是多頭注意力(Multi-Head
Attention)結(jié)構(gòu),該結(jié)構(gòu)基于自注意力(Self-Attention)機(jī)制,是多個(gè)Self-Attention的并行組成。

所以,理解了Self-Attention就抓住了Transformer的核心。

Attention模塊

from mindspore import nn, ops


class Attention(nn.Cell):
    def __init__(self,
                 dim: int,
                 num_heads: int = 8,
                 keep_prob: float = 1.0,
                 attention_keep_prob: float = 1.0):
        super(Attention, self).__init__()

        self.num_heads = num_heads
        head_dim = dim // num_heads
        self.scale = ms.Tensor(head_dim ** -0.5)

        self.qkv = nn.Dense(dim, dim * 3)
        self.attn_drop = nn.Dropout(p=1.0-attention_keep_prob)
        self.out = nn.Dense(dim, dim)
        self.out_drop = nn.Dropout(p=1.0-keep_prob)
        self.attn_matmul_v = ops.BatchMatMul()
        self.q_matmul_k = ops.BatchMatMul(transpose_b=True)
        self.softmax = nn.Softmax(axis=-1)

    def construct(self, x):
        """Attention construct."""
        b, n, c = x.shape
        qkv = self.qkv(x)
        qkv = ops.reshape(qkv, (b, n, 3, self.num_heads, c // self.num_heads))
        qkv = ops.transpose(qkv, (2, 0, 3, 1, 4))
        q, k, v = ops.unstack(qkv, axis=0)
        attn = self.q_matmul_k(q, k)
        attn = ops.mul(attn, self.scale)
        attn = self.softmax(attn)
        attn = self.attn_drop(attn)
        out = self.attn_matmul_v(attn, v)
        out = ops.transpose(out, (0, 2, 1, 3))
        out = ops.reshape(out, (b, n, c))
        out = self.out(out)
        out = self.out_drop(out)

        return out

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

Transformer Encoder

在了解了Self-Attention結(jié)構(gòu)之后,通過(guò)與Feed Forward,Residual
Connection等結(jié)構(gòu)的拼接就可以形成Transformer的基礎(chǔ)結(jié)構(gòu),下面代碼實(shí)現(xiàn)了Feed Forward,Residual
Connection結(jié)構(gòu)。

from typing import Optional, Dict


class FeedForward(nn.Cell):
    def __init__(self,
                 in_features: int,
                 hidden_features: Optional[int] = None,
                 out_features: Optional[int] = None,
                 activation: nn.Cell = nn.GELU,
                 keep_prob: float = 1.0):
        super(FeedForward, self).__init__()
        out_features = out_features or in_features
        hidden_features = hidden_features or in_features
        self.dense1 = nn.Dense(in_features, hidden_features)
        self.activation = activation()
        self.dense2 = nn.Dense(hidden_features, out_features)
        self.dropout = nn.Dropout(p=1.0-keep_prob)

    def construct(self, x):
        """Feed Forward construct."""
        x = self.dense1(x)
        x = self.activation(x)
        x = self.dropout(x)
        x = self.dense2(x)
        x = self.dropout(x)

        return x


class ResidualCell(nn.Cell):
    def __init__(self, cell):
        super(ResidualCell, self).__init__()
        self.cell = cell

    def construct(self, x):
        """ResidualCell construct."""
        return self.cell(x) + x

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

接下來(lái)就利用Self-Attention來(lái)構(gòu)建ViT模型中的TransformerEncoder部分,類(lèi)似于構(gòu)建了一個(gè)Transformer的編碼器部分,如下圖[1]所示:

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

vit-encoder

ViT模型中的基礎(chǔ)結(jié)構(gòu)與標(biāo)準(zhǔn)Transformer有所不同,主要在于Normalization的位置是放在Self-Attention和Feed
Forward之前,其他結(jié)構(gòu)如Residual Connection,F(xiàn)eed
Forward,Normalization都如Transformer中所設(shè)計(jì)。

從Transformer結(jié)構(gòu)的圖片可以發(fā)現(xiàn),多個(gè)子encoder的堆疊就完成了模型編碼器的構(gòu)建,在ViT模型中,依然沿用這個(gè)思路,通過(guò)配置超參數(shù)num_layers,就可以確定堆疊層數(shù)。

Residual
Connection,Normalization的結(jié)構(gòu)可以保證模型有很強(qiáng)的擴(kuò)展性(保證信息經(jīng)過(guò)深層處理不會(huì)出現(xiàn)退化的現(xiàn)象,這是Residual
Connection的作用),Normalization和dropout的應(yīng)用可以增強(qiáng)模型泛化能力。

從以下源碼中就可以清晰看到Transformer的結(jié)構(gòu)。將TransformerEncoder結(jié)構(gòu)和一個(gè)多層感知器(MLP)結(jié)合,就構(gòu)成了ViT模型的backbone部分。

class TransformerEncoder(nn.Cell):
    def __init__(self,
                 dim: int,
                 num_layers: int,
                 num_heads: int,
                 mlp_dim: int,
                 keep_prob: float = 1.,
                 attention_keep_prob: float = 1.0,
                 drop_path_keep_prob: float = 1.0,
                 activation: nn.Cell = nn.GELU,
                 norm: nn.Cell = nn.LayerNorm):
        super(TransformerEncoder, self).__init__()
        layers = []

        for _ in range(num_layers):
            normalization1 = norm((dim,))
            normalization2 = norm((dim,))
            attention = Attention(dim=dim,
                                  num_heads=num_heads,
                                  keep_prob=keep_prob,
                                  attention_keep_prob=attention_keep_prob)

            feedforward = FeedForward(in_features=dim,
                                      hidden_features=mlp_dim,
                                      activation=activation,
                                      keep_prob=keep_prob)

            layers.append(
                nn.SequentialCell([
                    ResidualCell(nn.SequentialCell([normalization1, attention])),
                    ResidualCell(nn.SequentialCell([normalization2, feedforward]))
                ])
            )
        self.layers = nn.SequentialCell(layers)

    def construct(self, x):
        """Transformer construct."""
        return self.layers(x)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

ViT模型的輸入

傳統(tǒng)的Transformer結(jié)構(gòu)主要用于處理自然語(yǔ)言領(lǐng)域的詞向量(Word Embedding or Word Vector),詞向量與傳統(tǒng)圖像數(shù)據(jù)的主要區(qū)別在于,詞向量通常是一維向量進(jìn)行堆疊,而圖片則是二維矩陣的堆疊,多頭注意力機(jī)制在處理一維詞向量的堆疊時(shí)會(huì)提取詞向量之間的聯(lián)系也就是上下文語(yǔ)義,這使得Transformer在自然語(yǔ)言處理領(lǐng)域非常好用,而二維圖片矩陣如何與一維詞向量進(jìn)行轉(zhuǎn)化就成為了Transformer進(jìn)軍圖像處理領(lǐng)域的一個(gè)小門(mén)檻。

在ViT模型中:

通過(guò)將輸入圖像在每個(gè)channel上劃分為16*16個(gè)patch,這一步是通過(guò)卷積操作來(lái)完成的,當(dāng)然也可以人工進(jìn)行劃分,但卷積操作也可以達(dá)到目的同時(shí)還可以進(jìn)行一次而外的數(shù)據(jù)處理;例如一幅輸入224
x 224的圖像,首先經(jīng)過(guò)卷積處理得到16 x 16個(gè)patch,那么每一個(gè)patch的大小就是14 x 14。
再將每一個(gè)patch的矩陣?yán)斐蔀橐粋€(gè)一維向量,從而獲得了近似詞向量堆疊的效果。上一步得到的14 x 14的patch就轉(zhuǎn)換為長(zhǎng)度為196的向量。
這是圖像輸入網(wǎng)絡(luò)經(jīng)過(guò)的第一步處理。具體Patch Embedding的代碼如下所示:

class PatchEmbedding(nn.Cell):
    MIN_NUM_PATCHES = 4

    def __init__(self,
                 image_size: int = 224,
                 patch_size: int = 16,
                 embed_dim: int = 768,
                 input_channels: int = 3):
        super(PatchEmbedding, self).__init__()

        self.image_size = image_size
        self.patch_size = patch_size
        self.num_patches = (image_size // patch_size) ** 2
        self.conv = nn.Conv2d(input_channels, embed_dim, kernel_size=patch_size, stride=patch_size, has_bias=True)

    def construct(self, x):
        """Path Embedding construct."""
        x = self.conv(x)
        b, c, h, w = x.shape
        x = ops.reshape(x, (b, c, h * w))
        x = ops.transpose(x, (0, 2, 1))

        return x

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

輸入圖像在劃分為patch之后,會(huì)經(jīng)過(guò)pos_embedding 和 class_embedding兩個(gè)過(guò)程。

class_embedding主要借鑒了BERT模型的用于文本分類(lèi)時(shí)的思想,在每一個(gè)word
vector之前增加一個(gè)類(lèi)別值,通常是加在向量的第一位,上一步得到的196維的向量加上class_embedding后變?yōu)?97維。

增加的class_embedding是一個(gè)可以學(xué)習(xí)的參數(shù),經(jīng)過(guò)網(wǎng)絡(luò)的不斷訓(xùn)練,最終以輸出向量的第一個(gè)維度的輸出來(lái)決定最后的輸出類(lèi)別;由于輸入是16 x 16個(gè)patch,所以輸出進(jìn)行分類(lèi)時(shí)是取 16 x 16個(gè)class_embedding進(jìn)行分類(lèi)。

pos_embedding也是一組可以學(xué)習(xí)的參數(shù),會(huì)被加入到經(jīng)過(guò)處理的patch矩陣中。

由于pos_embedding也是可以學(xué)習(xí)的參數(shù),所以它的加入類(lèi)似于全鏈接網(wǎng)絡(luò)和卷積的bias。這一步就是創(chuàng)造一個(gè)長(zhǎng)度維197的可訓(xùn)練向量加入到經(jīng)過(guò)class_embedding的向量中。

實(shí)際上,pos_embedding總共有4種方案。但是經(jīng)過(guò)作者的論證,只有加上pos_embedding和不加pos_embedding有明顯影響,至于pos_embedding是一維還是二維對(duì)分類(lèi)結(jié)果影響不大,所以,在我們的代碼中,也是采用了一維的pos_embedding,由于class_embedding是加在pos_embedding之前,所以pos_embedding的維度會(huì)比patch拉伸后的維度加1。

總的而言,ViT模型還是利用了Transformer模型在處理上下文語(yǔ)義時(shí)的優(yōu)勢(shì),將圖像轉(zhuǎn)換為一種“變種詞向量”然后進(jìn)行處理,而這樣轉(zhuǎn)換的意義在于,多個(gè)patch之間本身具有空間聯(lián)系,這類(lèi)似于一種“空間語(yǔ)義”,從而獲得了比較好的處理效果。

整體構(gòu)建ViT

以下代碼構(gòu)建了一個(gè)完整的ViT模型。

from mindspore.common.initializer import Normal
from mindspore.common.initializer import initializer
from mindspore import Parameter


def init(init_type, shape, dtype, name, requires_grad):
    """Init."""
    initial = initializer(init_type, shape, dtype).init_data()
    return Parameter(initial, name=name, requires_grad=requires_grad)


class ViT(nn.Cell):
    def __init__(self,
                 image_size: int = 224,
                 input_channels: int = 3,
                 patch_size: int = 16,
                 embed_dim: int = 768,
                 num_layers: int = 12,
                 num_heads: int = 12,
                 mlp_dim: int = 3072,
                 keep_prob: float = 1.0,
                 attention_keep_prob: float = 1.0,
                 drop_path_keep_prob: float = 1.0,
                 activation: nn.Cell = nn.GELU,
                 norm: Optional[nn.Cell] = nn.LayerNorm,
                 pool: str = 'cls') -> None:
        super(ViT, self).__init__()

        self.patch_embedding = PatchEmbedding(image_size=image_size,
                                              patch_size=patch_size,
                                              embed_dim=embed_dim,
                                              input_channels=input_channels)
        num_patches = self.patch_embedding.num_patches

        self.cls_token = init(init_type=Normal(sigma=1.0),
                              shape=(1, 1, embed_dim),
                              dtype=ms.float32,
                              name='cls',
                              requires_grad=True)

        self.pos_embedding = init(init_type=Normal(sigma=1.0),
                                  shape=(1, num_patches + 1, embed_dim),
                                  dtype=ms.float32,
                                  name='pos_embedding',
                                  requires_grad=True)

        self.pool = pool
        self.pos_dropout = nn.Dropout(p=1.0-keep_prob)
        self.norm = norm((embed_dim,))
        self.transformer = TransformerEncoder(dim=embed_dim,
                                              num_layers=num_layers,
                                              num_heads=num_heads,
                                              mlp_dim=mlp_dim,
                                              keep_prob=keep_prob,
                                              attention_keep_prob=attention_keep_prob,
                                              drop_path_keep_prob=drop_path_keep_prob,
                                              activation=activation,
                                              norm=norm)
        self.dropout = nn.Dropout(p=1.0-keep_prob)
        self.dense = nn.Dense(embed_dim, num_classes)

    def construct(self, x):
        """ViT construct."""
        x = self.patch_embedding(x)
        cls_tokens = ops.tile(self.cls_token.astype(x.dtype), (x.shape[0], 1, 1))
        x = ops.concat((cls_tokens, x), axis=1)
        x += self.pos_embedding

        x = self.pos_dropout(x)
        x = self.transformer(x)
        x = self.norm(x)
        x = x[:, 0]
        if self.training:
            x = self.dropout(x)
        x = self.dense(x)

        return x

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

整體流程圖如下所示:

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

四、模型訓(xùn)練與推理

模型訓(xùn)練

from mindspore.nn import LossBase
from mindspore.train import LossMonitor, TimeMonitor, CheckpointConfig, ModelCheckpoint
from mindspore import train

# define super parameter
epoch_size = 10
momentum = 0.9
num_classes = 1000
resize = 224
step_size = dataset_train.get_dataset_size()

# construct model
network = ViT()

# load ckpt
vit_url = "https://download.mindspore.cn/vision/classification/vit_b_16_224.ckpt"
path = "./ckpt/vit_b_16_224.ckpt"

vit_path = download(vit_url, path, replace=True)
param_dict = ms.load_checkpoint(vit_path)
ms.load_param_into_net(network, param_dict)

# define learning rate
lr = nn.cosine_decay_lr(min_lr=float(0),
                        max_lr=0.00005,
                        total_step=epoch_size * step_size,
                        step_per_epoch=step_size,
                        decay_epoch=10)

# define optimizer
network_opt = nn.Adam(network.trainable_params(), lr, momentum)


# define loss function
class CrossEntropySmooth(LossBase):
    """CrossEntropy."""

    def __init__(self, sparse=True, reduction='mean', smooth_factor=0., num_classes=1000):
        super(CrossEntropySmooth, self).__init__()
        self.onehot = ops.OneHot()
        self.sparse = sparse
        self.on_value = ms.Tensor(1.0 - smooth_factor, ms.float32)
        self.off_value = ms.Tensor(1.0 * smooth_factor / (num_classes - 1), ms.float32)
        self.ce = nn.SoftmaxCrossEntropyWithLogits(reduction=reduction)

    def construct(self, logit, label):
        if self.sparse:
            label = self.onehot(label, ops.shape(logit)[1], self.on_value, self.off_value)
        loss = self.ce(logit, label)
        return loss


network_loss = CrossEntropySmooth(sparse=True,
                                  reduction="mean",
                                  smooth_factor=0.1,
                                  num_classes=num_classes)

# set checkpoint
ckpt_config = CheckpointConfig(save_checkpoint_steps=step_size, keep_checkpoint_max=100)
ckpt_callback = ModelCheckpoint(prefix='vit_b_16', directory='./ViT', config=ckpt_config)

# initialize model
# "Ascend + mixed precision" can improve performance
ascend_target = (ms.get_context("device_target") == "Ascend")
if ascend_target:
    model = train.Model(network, loss_fn=network_loss, optimizer=network_opt, metrics={"acc"}, amp_level="O2")
else:
    model = train.Model(network, loss_fn=network_loss, optimizer=network_opt, metrics={"acc"}, amp_level="O0")

# train model
model.train(epoch_size,
            dataset_train,
            callbacks=[ckpt_callback, LossMonitor(125), TimeMonitor(125)],
            dataset_sink_mode=False,)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

模型驗(yàn)證

dataset_val = ImageFolderDataset(os.path.join(data_path, "val"), shuffle=True)

trans_val = [
    transforms.Decode(),
    transforms.Resize(224 + 32),
    transforms.CenterCrop(224),
    transforms.Normalize(mean=mean, std=std),
    transforms.HWC2CHW()
]

dataset_val = dataset_val.map(operations=trans_val, input_columns=["image"])
dataset_val = dataset_val.batch(batch_size=16, drop_remainder=True)

# construct model
network = ViT()

# load ckpt
param_dict = ms.load_checkpoint(vit_path)
ms.load_param_into_net(network, param_dict)

network_loss = CrossEntropySmooth(sparse=True,
                                  reduction="mean",
                                  smooth_factor=0.1,
                                  num_classes=num_classes)

# define metric
eval_metrics = {'Top_1_Accuracy': train.Top1CategoricalAccuracy(),
                'Top_5_Accuracy': train.Top5CategoricalAccuracy()}

if ascend_target:
    model = train.Model(network, loss_fn=network_loss, optimizer=network_opt, metrics=eval_metrics, amp_level="O2")
else:
    model = train.Model(network, loss_fn=network_loss, optimizer=network_opt, metrics=eval_metrics, amp_level="O0")

# evaluate model
result = model.eval(dataset_val)
print(result)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

模型推理

dataset_infer = ImageFolderDataset(os.path.join(data_path, "infer"), shuffle=True)

trans_infer = [
    transforms.Decode(),
    transforms.Resize([224, 224]),
    transforms.Normalize(mean=mean, std=std),
    transforms.HWC2CHW()
]

dataset_infer = dataset_infer.map(operations=trans_infer,
                                  input_columns=["image"],
                                  num_parallel_workers=1)
dataset_infer = dataset_infer.batch(1)

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

import os
import pathlib
import cv2
import numpy as np
from PIL import Image
from enum import Enum
from scipy import io


class Color(Enum):
    """dedine enum color."""
    red = (0, 0, 255)
    green = (0, 255, 0)
    blue = (255, 0, 0)
    cyan = (255, 255, 0)
    yellow = (0, 255, 255)
    magenta = (255, 0, 255)
    white = (255, 255, 255)
    black = (0, 0, 0)


def check_file_exist(file_name: str):
    """check_file_exist."""
    if not os.path.isfile(file_name):
        raise FileNotFoundError(f"File `{file_name}` does not exist.")


def color_val(color):
    """color_val."""
    if isinstance(color, str):
        return Color[color].value
    if isinstance(color, Color):
        return color.value
    if isinstance(color, tuple):
        assert len(color) == 3
        for channel in color:
            assert 0 <= channel <= 255
        return color
    if isinstance(color, int):
        assert 0 <= color <= 255
        return color, color, color
    if isinstance(color, np.ndarray):
        assert color.ndim == 1 and color.size == 3
        assert np.all((color >= 0) & (color <= 255))
        color = color.astype(np.uint8)
        return tuple(color)
    raise TypeError(f'Invalid type for color: {type(color)}')


def imread(image, mode=None):
    """imread."""
    if isinstance(image, pathlib.Path):
        image = str(image)

    if isinstance(image, np.ndarray):
        pass
    elif isinstance(image, str):
        check_file_exist(image)
        image = Image.open(image)
        if mode:
            image = np.array(image.convert(mode))
    else:
        raise TypeError("Image must be a `ndarray`, `str` or Path object.")

    return image


def imwrite(image, image_path, auto_mkdir=True):
    """imwrite."""
    if auto_mkdir:
        dir_name = os.path.abspath(os.path.dirname(image_path))
        if dir_name != '':
            dir_name = os.path.expanduser(dir_name)
            os.makedirs(dir_name, mode=777, exist_ok=True)

    image = Image.fromarray(image)
    image.save(image_path)


def imshow(img, win_name='', wait_time=0):
    """imshow"""
    cv2.imshow(win_name, imread(img))
    if wait_time == 0:  # prevent from hanging if windows was closed
        while True:
            ret = cv2.waitKey(1)

            closed = cv2.getWindowProperty(win_name, cv2.WND_PROP_VISIBLE) < 1
            # if user closed window or if some key pressed
            if closed or ret != -1:
                break
    else:
        ret = cv2.waitKey(wait_time)


def show_result(img: str,
                result: Dict[int, float],
                text_color: str = 'green',
                font_scale: float = 0.5,
                row_width: int = 20,
                show: bool = False,
                win_name: str = '',
                wait_time: int = 0,
                out_file: Optional[str] = None) -> None:
    """Mark the prediction results on the picture."""
    img = imread(img, mode="RGB")
    img = img.copy()
    x, y = 0, row_width
    text_color = color_val(text_color)
    for k, v in result.items():
        if isinstance(v, float):
            v = f'{v:.2f}'
        label_text = f'{k}: {v}'
        cv2.putText(img, label_text, (x, y), cv2.FONT_HERSHEY_COMPLEX,
                    font_scale, text_color)
        y += row_width
    if out_file:
        show = False
        imwrite(img, out_file)

    if show:
        imshow(img, win_name, wait_time)


def index2label():
    """Dictionary output for image numbers and categories of the ImageNet dataset."""
    metafile = os.path.join(data_path, "ILSVRC2012_devkit_t12/data/meta.mat")
    meta = io.loadmat(metafile, squeeze_me=True)['synsets']

    nums_children = list(zip(*meta))[4]
    meta = [meta[idx] for idx, num_children in enumerate(nums_children) if num_children == 0]

    _, wnids, classes = list(zip(*meta))[:3]
    clssname = [tuple(clss.split(', ')) for clss in classes]
    wnid2class = {wnid: clss for wnid, clss in zip(wnids, clssname)}
    wind2class_name = sorted(wnid2class.items(), key=lambda x: x[0])

    mapping = {}
    for index, (_, class_name) in enumerate(wind2class_name):
        mapping[index] = class_name[0]
    return mapping


# Read data for inference
for i, image in enumerate(dataset_infer.create_dict_iterator(output_numpy=True)):
    image = image["image"]
    image = ms.Tensor(image)
    prob = model.predict(image)
    label = np.argmax(prob.asnumpy(), axis=1)
    mapping = index2label()
    output = {int(label): mapping[int(label)]}
    print(output)
    show_result(img="./dataset/infer/n01440764/ILSVRC2012_test_00000279.JPEG",
                result=output,
                out_file="./dataset/infer/ILSVRC2012_test_00000279.JPEG")

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer

推理過(guò)程完成后,在推理文件夾下可以找到圖片的推理結(jié)果,可以看出預(yù)測(cè)結(jié)果是Doberman,與期望結(jié)果相同,驗(yàn)證了模型的準(zhǔn)確性。

華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi),Huawei Cloud,人工智能,華為,transformer文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-619968.html

到了這里,關(guān)于華為開(kāi)源自研AI框架昇思MindSpore應(yīng)用案例:Vision Transformer圖像分類(lèi)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 任意模型都能蒸餾,異構(gòu)模型的知識(shí)蒸餾方法OFAKD已在昇思MindSpore開(kāi)源

    任意模型都能蒸餾,異構(gòu)模型的知識(shí)蒸餾方法OFAKD已在昇思MindSpore開(kāi)源

    自知識(shí)蒸餾方法在2014年被首次提出以來(lái),其開(kāi)始廣泛被應(yīng)用于模型壓縮領(lǐng)域。在更強(qiáng)大教師模型輔助監(jiān)督信息的幫助下,學(xué)生模型往往能夠?qū)崿F(xiàn)比直接訓(xùn)練更高的精度。然而,現(xiàn)有的知識(shí)蒸餾相關(guān)研究只考慮了同架構(gòu)模型的蒸餾方法,而忽略了教師模型與學(xué)生模型異構(gòu)的情形

    2024年02月22日
    瀏覽(18)
  • 論文精講 | 基于昇思MindSpore打造首個(gè)深度學(xué)習(xí)開(kāi)源視頻壓縮算法庫(kù)OpenDMC,支持跨平臺(tái)和多種評(píng)價(jià)指標(biāo)

    論文精講 | 基于昇思MindSpore打造首個(gè)深度學(xué)習(xí)開(kāi)源視頻壓縮算法庫(kù)OpenDMC,支持跨平臺(tái)和多種評(píng)價(jià)指標(biāo)

    論文標(biāo)題 OpenDMC: An Open-Source Library and Performance Evaluation for Deep-learning-based Multi-frame Compression 論文來(lái)源 ACM MultiMedia 論文鏈接 https://www.acmmm2023.org/open-source-program/ 代碼鏈接 https://openi.pcl.ac.cn/OpenDMC/OpenDMC 昇思MindSpore作為開(kāi)源的AI框架,為產(chǎn)學(xué)研和開(kāi)發(fā)人員帶來(lái)端邊云全場(chǎng)景協(xié)同、

    2024年02月02日
    瀏覽(109)
  • 【深度學(xué)習(xí)】基于華為MindSpore的手寫(xiě)體圖像識(shí)別實(shí)驗(yàn)

    【深度學(xué)習(xí)】基于華為MindSpore的手寫(xiě)體圖像識(shí)別實(shí)驗(yàn)

    1 實(shí)驗(yàn)介紹 1.1 簡(jiǎn)介 Mnist手寫(xiě)體圖像識(shí)別實(shí)驗(yàn)是深度學(xué)習(xí)入門(mén)經(jīng)典實(shí)驗(yàn)。Mnist數(shù)據(jù)集包含60,000個(gè)用于訓(xùn)練的示例和10,000個(gè)用于測(cè)試的示例。這些數(shù)字已經(jīng)過(guò)尺寸標(biāo)準(zhǔn)化并位于圖像中心,圖像是固定大小(28x28像素),其值為0到255。為簡(jiǎn)單起見(jiàn),每個(gè)圖像都被平展并轉(zhuǎn)換為784(28*28)個(gè)

    2023年04月08日
    瀏覽(29)
  • vue.js前端框架應(yīng)用案例

    Vue.js 是一種流行的前端框架,它可以幫助開(kāi)發(fā)者構(gòu)建單頁(yè)應(yīng)用(SPA)和復(fù)雜的用戶(hù)界面。以下是幾個(gè) Vue.js 的案例,涵蓋了不同領(lǐng)域的應(yīng)用: Vue.js 官方文檔 :Vue.js 的官方文檔本身就是一個(gè)使用 Vue.js 構(gòu)建的項(xiàng)目。它展示了 Vue.js 的各種功能和最佳實(shí)踐,包括組件、指令、混

    2024年02月21日
    瀏覽(27)
  • 手把手教你用MindSpore訓(xùn)練一個(gè)AI模型!

    手把手教你用MindSpore訓(xùn)練一個(gè)AI模型!

    首先我們要先了解深度學(xué)習(xí)的概念和AI計(jì)算框架的角色( https://zhuanlan.zhihu.com/p/463019160 ),本篇文章將演示怎么利用MindSpore來(lái)訓(xùn)練一個(gè)AI模型。和上一章的場(chǎng)景一致,我們要訓(xùn)練的模型是用來(lái)對(duì)手寫(xiě)數(shù)字圖片進(jìn)行分類(lèi)的LeNet5模型 請(qǐng)參考( http://yann.lecun.com/exdb/lenet/ )。 圖1 M

    2024年02月04日
    瀏覽(34)
  • 華為云Moderation案例分享—AI是如何代替人工審核直播及彈幕

    華為云Moderation案例分享—AI是如何代替人工審核直播及彈幕

    云服務(wù)、API、SDK,調(diào)試,查看,我都行 閱讀短文您可以學(xué)習(xí)到:人工智能AI之Moderation的直播審核、文本審核、清晰度檢測(cè)、供應(yīng)鏈扭曲矯正 classroom是基于華為云的云上軟件教學(xué)服務(wù),支持初級(jí)開(kāi)發(fā)者和高校師生實(shí)現(xiàn)備課、上課、作業(yè)、考試、實(shí)驗(yàn)、實(shí)訓(xùn)等全教學(xué)流程的線上

    2024年01月16日
    瀏覽(17)
  • 微軟面向未來(lái)的制造 | 羅技 AI | 谷歌1000 億美元|波士頓動(dòng)力Atlas | 靈感源自大腦...

    微軟面向未來(lái)的制造 | 羅技 AI | 谷歌1000 億美元|波士頓動(dòng)力Atlas | 靈感源自大腦...

    面向未來(lái)的制造:微軟發(fā)布從云端到工廠車(chē)間的全新工業(yè)人工智能創(chuàng)新技術(shù) 在全球最大的制造業(yè)創(chuàng)新盛會(huì)之一漢諾威工業(yè)博覽會(huì)(Hannover Messe)召開(kāi)之前,微軟宣布將為制造商提供新的人工智能和數(shù)據(jù)解決方案,幫助他們開(kāi)啟創(chuàng)新、實(shí)現(xiàn)智能工廠、優(yōu)化運(yùn)營(yíng)和提高員工生產(chǎn)力

    2024年04月27日
    瀏覽(27)
  • 華為ospf路由協(xié)議在局域網(wǎng)中的高級(jí)應(yīng)用案例

    華為ospf路由協(xié)議在局域網(wǎng)中的高級(jí)應(yīng)用案例

    關(guān)鍵配置: 1、出口為ospf區(qū)域0,下聯(lián)匯聚依次區(qū)域1、2…,非骨干全部為完全nssa區(qū)域 2、核心(abr)上對(duì)非骨干區(qū)域進(jìn)行路由匯總,用于解決出口兩臺(tái)路由的條目數(shù)量 3、ospf靜默接口配置在匯聚下聯(lián)接接入交換機(jī)的vlan 4、核心交換機(jī)配置黑洞路由,防止內(nèi)網(wǎng)用戶(hù)探測(cè)不存在的

    2024年02月16日
    瀏覽(20)
  • MindSpore AI科學(xué)計(jì)算系類(lèi) | VAE基于MindSpore Elec的特征域MT反演,提升大地電磁反演的精度和分辨率

    MindSpore AI科學(xué)計(jì)算系類(lèi) | VAE基于MindSpore Elec的特征域MT反演,提升大地電磁反演的精度和分辨率

    背景 昇思MindSpore聯(lián)合清華大學(xué)、華為先進(jìn)計(jì)算與存儲(chǔ)實(shí)驗(yàn)室合作構(gòu)建了基于變分自編碼器的特征域大地電磁反演算法,通過(guò)靈活嵌入多物理先驗(yàn)知識(shí)有效提升了復(fù)雜介質(zhì)地球物理反演的精度。 大地電磁(Magnetotelluric, MT)數(shù)據(jù)反演是通過(guò)地表測(cè)量的天然電磁場(chǎng)推斷地下介質(zhì)分

    2024年01月25日
    瀏覽(25)
  • 華為openEuler在服務(wù)器自動(dòng)化部署中的應(yīng)用案例

    華為openEuler在服務(wù)器自動(dòng)化部署中的應(yīng)用案例

    案例背景: ????????隨著云計(jì)算和大數(shù)據(jù)技術(shù)的不斷發(fā)展,服務(wù)器部署的效率和穩(wěn)定性成為企業(yè)關(guān)注的焦點(diǎn)。華為 openEuler 作為一款開(kāi)源的Linux發(fā)行版,提供了豐富的軟件包管理和系統(tǒng)優(yōu)化功能,非常適合用于構(gòu)建高效穩(wěn)定的服務(wù)器環(huán)境。 環(huán)境準(zhǔn)備: 選擇適配openEuler的服

    2024年02月19日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包