日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

快速學習一個算法,Vision Transformer

來源: 責編: 時間:2024-06-20 15:22:29 222觀看
導讀Vision Transformer(ViT)是一種基于自注意力機制的神經網絡架構,主要用于處理圖像數據。它是由谷歌研究人員在 2020 年提出的,標志著「將自然語言處理(NLP)中廣泛使用的 Transformer 模型成功應用于計算機視覺領域的一個重

Vision Transformer(ViT)是一種基于自注意力機制的神經網絡架構,主要用于處理圖像數據。d3G28資訊網——每日最新資訊28at.com

它是由谷歌研究人員在 2020 年提出的,標志著「將自然語言處理(NLP)中廣泛使用的 Transformer 模型成功應用于計算機視覺領域的一個重要進展。」d3G28資訊網——每日最新資訊28at.com

d3G28資訊網——每日最新資訊28at.com


d3G28資訊網——每日最新資訊28at.com

基本原理和架構

Vision Transformer 的核心思想是將圖像分解為一系列的小塊(稱為 patches),這些小塊在輸入網絡之前被展平并映射到高維空間。這與傳統的卷積神經網絡(CNN)不同,后者通常會使用卷積層來處理整個圖像并提取局部特征。d3G28資訊網——每日最新資訊28at.com

圖片圖片d3G28資訊網——每日最新資訊28at.com

1.圖像分塊

首先,ViT 將輸入圖像切割成固定大小的小塊(例如,16x16像素的塊)。每個塊被視為一個 “token”,與 NLP 中的單詞類似。d3G28資訊網——每日最新資訊28at.com

2.嵌入層

這些圖像塊(patches)被展平并通過一個線性層轉換成一系列的嵌入向量。d3G28資訊網——每日最新資訊28at.com

此外,還會添加一個可學習的 “class” 嵌入,用于聚合全局信息。d3G28資訊網——每日最新資訊28at.com

圖片圖片d3G28資訊網——每日最新資訊28at.com

3.位置編碼

為了保留圖像塊的位置信息,ViT 在嵌入向量中加入位置編碼,這是 Transformer 架構中的一個關鍵組成部分。d3G28資訊網——每日最新資訊28at.com

4.Transformer 編碼器

經過嵌入的圖像塊(現在作為序列的一部分)輸入到標準的 Transformer編碼器中。d3G28資訊網——每日最新資訊28at.com

編碼器使用多頭自注意力機制和前饋神經網絡來處理序列,允許模型捕獲塊之間的復雜關系。d3G28資訊網——每日最新資訊28at.com

5.分類頭

對于分類任務,Transformer 的輸出(特別是 [CLS] token 的輸出)會傳遞到一個前饋網絡(即分類頭),該網絡輸出最終的類別預測。d3G28資訊網——每日最新資訊28at.com

優缺點分析

優點

  • 強大的全局信息處理能力
    通過自注意力機制,ViT 可以在圖像的任何部分之間建立直接的聯系,有效捕捉全局依賴關系。
  • 高度靈活性
    ViT 模型可以很容易地調整到不同大小的輸入,且模型架構可擴展性強。
  • 更適合大規模數據集
    ViT 在大規模數據集上表現通常優于傳統 CNN,可以學習更復雜的視覺模式。

缺點

  • 需要更多的訓練數據
    ViT 依賴大量數據來訓練,以防止過擬合,對于數據較少的情況可能不如 CNN 有效。
  • 計算成本高
    由于需要計算長距離的依賴關系,ViT 在計算和內存需求上通常比CNN要高。

代碼實現

下面,我們一起來看一下如何使用 VIT 來預測一張圖片的類別d3G28資訊網——每日最新資訊28at.com

1.圖像分塊

import osimport copyimport mathimport typingimport cv2import numpy as npimport matplotlib.pyplot as pltimport torchimport torch.nn as nnmountains = np.load('mountains.npy')H = mountains.shape[0]W = mountains.shape[1]print('Mountain at Dusk is H =', H, 'and W =', W, 'pixels.')P = 20N = int((H*W)/(P**2))print('There will be', N, 'patches, each', P, 'by', str(P)+'.')fig = plt.figure(figsize=(10,6))plt.imshow(mountains, cmap='Purples_r')plt.hlines(np.arange(P, H, P)-0.5, -0.5, W-0.5, color='w')plt.vlines(np.arange(P, W, P)-0.5, -0.5, H-0.5, color='w')plt.xticks(np.arange(-0.5, W+1, 10), labels=np.arange(0, W+1, 10))plt.yticks(np.arange(-0.5, H+1, 10), labels=np.arange(0, H+1, 10))x_text = np.tile(np.arange(9.5, W, P), 3)y_text = np.repeat(np.arange(9.5, H, P), 5)for i in range(1, N+1):    plt.text(x_text[i-1], y_text[i-1], str(i), color='w', fnotallow='xx-large', ha='center')plt.text(x_text[2], y_text[2], str(3), color='k', fnotallow='xx-large', ha='center');

圖片圖片d3G28資訊網——每日最新資訊28at.com

通過展平這些色塊,我們可以看到生成的 token。我們以色塊 12 為例,因為它包含四種不同的色調。d3G28資訊網——每日最新資訊28at.com

print('Each patch will make a token of length', str(P**2)+'.')patch12 = mountains[40:60, 20:40]token12 = patch12.reshape(1, P**2)fig = plt.figure(figsize=(10,1))plt.imshow(token12, aspect=10, cmap='Purples_r')plt.clim([0,1])plt.xticks(np.arange(-0.5, 401, 50), labels=np.arange(0, 401, 50))plt.yticks([])

圖片圖片d3G28資訊網——每日最新資訊28at.com

2.嵌入層

從圖像中提取 token 后,通常使用線性投影來更改 token 的長度。d3G28資訊網——每日最新資訊28at.com

class Patch_Tokenization(nn.Module):    def __init__(self,                img_size: tuple[int, int, int]=(1, 1, 60, 100),                patch_size: int=50,                token_len: int=768):        super().__init__()        self.img_size = img_size        C, H, W = self.img_size        self.patch_size = patch_size        self.token_len = token_len        assert H % self.patch_size == 0, 'Height of image must be evenly divisible by patch size.'        assert W % self.patch_size == 0, 'Width of image must be evenly divisible by patch size.'        self.num_tokens = (H / self.patch_size) * (W / self.patch_size)        ## Defining Layers        self.split = nn.Unfold(kernel_size=self.patch_size, stride=self.patch_size, padding=0)        self.project = nn.Linear((self.patch_size**2)*C, token_len)    def forward(self, x):        x = self.split(x).transpose(1,0)        x = self.project(x)        return x

請注意,這兩個 assert 語句確保圖像尺寸可以被塊大小整除。實際分割成塊的操作是使用 torch.nn.Unfold 層實現的。d3G28資訊網——每日最新資訊28at.com

x = torch.from_numpy(mountains).unsqueeze(0).unsqueeze(0).to(torch.float32)token_len = 768print('Input dimensions are/n/tbatchsize:', x.shape[0], '/n/tnumber of input channels:', x.shape[1], '/n/timage size:', (x.shape[2], x.shape[3]))# Define the Modulepatch_tokens = Patch_Tokenization(img_size=(x.shape[1], x.shape[2], x.shape[3]),                                    patch_size = P,                                    token_len = token_len)x = patch_tokens.split(x).transpose(2,1)print('After patch tokenization, dimensions are/n/tbatchsize:', x.shape[0], '/n/tnumber of tokens:', x.shape[1], '/n/ttoken length:', x.shape[2])x = patch_tokens.project(x)print('After projection, dimensions are/n/tbatchsize:', x.shape[0], '/n/tnumber of tokens:', x.shape[1], '/n/ttoken length:', x.shape[2])

圖片圖片d3G28資訊網——每日最新資訊28at.com

從上圖可以看到,經過線性投影層后,token 的維度變成了 768 維。d3G28資訊網——每日最新資訊28at.com

3.位置編碼

接下來將一個空白 token(稱為預測標記)添加到圖像 token 之前。「此 token 將在編碼器的輸出中用于進行預測。」d3G28資訊網——每日最新資訊28at.com

它從空白(相當于零)開始,以便它可以從其他圖像 token 中獲取信息。d3G28資訊網——每日最新資訊28at.com

pred_token = torch.zeros(1, 1, x.shape[2]).expand(x.shape[0], -1, -1)x = torch.cat((pred_token, x), dim=1)

然后,我們為 token 添加一個位置嵌入。d3G28資訊網——每日最新資訊28at.com

位置嵌入允許 transformer 理解圖像標記的順序。d3G28資訊網——每日最新資訊28at.com

def get_sinusoid_encoding(num_tokens, token_len):    def get_position_angle_vec(i):        return [i / np.power(10000, 2 * (j // 2) / token_len) for j in range(token_len)]    sinusoid_table = np.array([get_position_angle_vec(i) for i in range(num_tokens)])    sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2])    sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2])     return torch.FloatTensor(sinusoid_table).unsqueeze(0)PE = get_sinusoid_encoding(x.shape[1]+1, x.shape[2])print('Position embedding dimensions are/n/tnumber of tokens:', PE.shape[1], '/n/ttoken length:', PE.shape[2])x = x + PEprint('Dimensions with Position Embedding are/n/tbatchsize:', x.shape[0], '/n/tnumber of tokens:', x.shape[1], '/n/ttoken length:', x.shape[2])

4.編碼器

編碼器是模型實際從圖像 token 中學習的地方。d3G28資訊網——每日最新資訊28at.com

編碼器主要由注意力模塊和神經網絡模塊組成。d3G28資訊網——每日最新資訊28at.com

NoneFloat = typing.Union[None, float]class Attention(nn.Module):    def __init__(self,                 dim: int,                chan: int,                num_heads: int=1,                qkv_bias: bool=False, qk_scale: Nnotallow=None):        super().__init__()                self.num_heads = num_heads        self.chan = chan        self.head_dim = self.chan // self.num_heads        self.scale = qk_scale or self.head_dim ** -0.5        self.qkv = nn.Linear(dim, chan * 3, bias=qkv_bias)        self.proj = nn.Linear(chan, chan)    def forward(self, x):        if self.chan % self.num_heads != 0:            raise ValueError('"Chan" must be evenly divisible by "num_heads".')        B, N, C = x.shape        qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, self.head_dim).permute(2, 0, 3, 1, 4)                q, k, v = qkv[0], qkv[1], qkv[2]        ## Calculate Attention        attn = (q * self.scale) @ k.transpose(-2, -1)        attn = attn.softmax(dim=-1)              x = (attn @ v).transpose(1, 2).reshape(B, N, self.chan)        x = self.proj(x)        ## Skip Connection Layer        v = v.transpose(1, 2).reshape(B, N, self.chan)        x = v + x             return xclass NeuralNet(nn.Module):    def __init__(self,       in_chan: int,       hidden_chan: Nnotallow=None,       out_chan: Nnotallow=None,       act_layer = nn.GELU):        super().__init__()        ## Define Number of Channels        hidden_chan = hidden_chan or in_chan        out_chan = out_chan or in_chan        ## Define Layers        self.fc1 = nn.Linear(in_chan, hidden_chan)        self.act = act_layer()        self.fc2 = nn.Linear(hidden_chan, out_chan)    def forward(self, x):        x = self.fc1(x)        x = self.act(x)        x = self.fc2(x)        return xclass Encoding(nn.Module):    def __init__(self,       dim: int,       num_heads: int=1,       hidden_chan_mul: float=4.,       qkv_bias: bool=False,       qk_scale: Nnotallow=None,       act_layer=nn.GELU,        norm_layer=nn.LayerNorm):        super().__init__()        ## Define Layers        self.norm1 = norm_layer(dim)        self.attn = Attention(dim=dim,                            chan=dim,                            num_heads=num_heads,                            qkv_bias=qkv_bias,                            qk_scale=qk_scale)        self.norm2 = norm_layer(dim)        self.neuralnet = NeuralNet(in_chan=dim,                                hidden_chan=int(dim*hidden_chan_mul),                                out_chan=dim,                                act_layer=act_layer)    def forward(self, x):        x = x + self.attn(self.norm1(x))        x = x + self.neuralnet(self.norm2(x))        return x

現在,我們將通過一個注意力模塊。d3G28資訊網——每日最新資訊28at.com

E = Encoding(dim=x.shape[2], num_heads=4, hidden_chan_mul= 1.5 , qkv_bias= False , qk_scale= None , act_layer=nn.GELU, norm_layer=nn.LayerNorm) y = E.norm1(x)print('After norm, dimensions are/n/tbatchsize:', y.shape[0], '/n/tnumber of tokens:', y.shape[1], '/n/ttoken size:', y.shape[2])y = E.attn(y)print('After attention, dimensions are/n/tbatchsize:', y.shape[0], '/n/tnumber of tokens:', y.shape[1], '/n/ttoken size:', y.shape[2])y = y + xprint('After split connection, dimensions are/n/tbatchsize:', y.shape[0], '/n/tnumber of tokens:', y.shape[1], '/n/ttoken size:', y.shape[2])

接下來,我們經過一個神經網絡模塊。d3G28資訊網——每日最新資訊28at.com

z = E.norm2(y)print('After norm, dimensions are/n/tbatchsize:', z.shape[0], '/n/tnumber of tokens:', z.shape[1], '/n/ttoken size:', z.shape[2])z = E.neuralnet(z)print('After neural net, dimensions are/n/tbatchsize:', z.shape[0], '/n/tnumber of tokens:', z.shape[1], '/n/ttoken size:', z.shape[2])z = z + yprint('After split connection, dimensions are/n/tbatchsize:', z.shape[0], '/n/tnumber of tokens:', z.shape[1], '/n/ttoken size:', z.shape[2])

圖片圖片d3G28資訊網——每日最新資訊28at.com

「這就是單個編碼器的全部內容!由于最終尺寸與初始尺寸相同,因此模型可以輕松地將 token 傳遞到多個編碼器。」d3G28資訊網——每日最新資訊28at.com

5.分類頭

經過編碼器后,模型要做的最后一件事就是進行預測。d3G28資訊網——每日最新資訊28at.com

norm = nn.LayerNorm(token_len)z = norm(z)pred_token = z[:, 0]head = nn.Linear(pred_token.shape[-1], 1)pred = head(pred_token)print('Length of prediction:', (pred.shape[0], pred.shape[1]))print('Prediction:', float(pred))


d3G28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-95161-0.html快速學習一個算法,Vision Transformer

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 解鎖Python神器Vars:讓你的代碼瞬間脫穎而出!

下一篇: 突發奇想!Vue3 實現消息無限滾動的新思路!

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 小紅書1周漲粉49W+,我總結了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人“珍藏”是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對“勢”的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 與兆芯合作 聯想推出全新旗艦版筆記本電腦開天N7系列

    聯想與兆芯合作推出全新聯想旗艦版筆記本電腦開天 N7系列。這個系列采用兆芯KX-6640MA處理器平臺,KX-6640MA 處理器是采用了陸家嘴架構,16nm 工藝,4 核 4 線
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美激情第六页| 亚洲欧美日韩精品久久亚洲区| 国产农村妇女精品| 国产日韩欧美精品| 在线电影院国产精品| 亚洲精品一二区| 亚洲一区二区精品| 久久精品欧美| 欧美—级在线免费片| 国产精品免费aⅴ片在线观看| 国产一区二区三区黄| 亚洲精品偷拍| 欧美一区二粉嫩精品国产一线天| 老司机成人网| 国产精品电影观看| 一区二区在线视频| 亚洲视频www| 久久久亚洲人| 欧美日韩中文字幕在线| 激情成人综合| 亚洲婷婷综合久久一本伊一区| 久久精品视频在线播放| 欧美伦理91i| 国产亚洲精品高潮| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲永久在线| 欧美成人精品高清在线播放| 国产精品免费网站在线观看| 在线精品视频一区二区| 亚洲制服av| 欧美不卡视频一区| 国产免费一区二区三区香蕉精| 亚洲国产精品一区制服丝袜| 亚洲欧美一区二区三区久久| 欧美成人综合在线| 国产手机视频一区二区| 夜夜嗨一区二区| 久久久久久欧美| 国产精品久久国产愉拍| 亚洲激情国产精品| 欧美专区在线观看| 欧美系列亚洲系列| 亚洲电影一级黄| 欧美一级久久| 国产精品超碰97尤物18| 亚洲片在线观看| 久久久www成人免费无遮挡大片 | 在线看欧美日韩| 亚洲欧美一区二区激情| 欧美日韩国产在线观看| 亚洲国产mv| 久久精品国产亚洲一区二区| 国产精品久久久久久av福利软件| 亚洲精品日本| 狼狼综合久久久久综合网| 国产婷婷色一区二区三区| 一区二区三区欧美| 欧美国产专区| 亚洲国产精品成人va在线观看| 久久成人这里只有精品| 国产精品美女一区二区在线观看| 亚洲精品乱码久久久久久久久 | 国产精品yjizz| 99国产麻豆精品| 欧美黑人多人双交| 亚洲国产一区二区三区a毛片| 久久久久久综合| 国产亚洲欧美日韩在线一区| 亚洲欧美视频| 国产精品乱子久久久久| 亚洲一区二区少妇| 国产精品草草| 亚洲一二区在线| 国产精品美女久久久久久久| 亚洲午夜精品久久久久久浪潮 | 久久精品国产亚洲aⅴ| 国产欧美日韩不卡免费| 亚洲欧美日韩综合aⅴ视频| 国产精品久线观看视频| 亚洲综合99| 国产精品裸体一区二区三区| 亚洲欧美日韩天堂| 国产欧美精品xxxx另类| 欧美专区中文字幕| 国产亚洲一区精品| 久久精品中文| 伊人久久成人| 欧美fxxxxxx另类| 亚洲人人精品| 欧美三级电影精品| 亚洲小视频在线| 国产精品美女| 久久精品91久久久久久再现| 红桃视频一区| 欧美成人精品不卡视频在线观看 | 欧美一二三视频| 国产在线麻豆精品观看| 久久一综合视频| 亚洲区一区二| 欧美日韩免费看| 亚洲摸下面视频| 国产婷婷色一区二区三区在线| 久久精品男女| 91久久久亚洲精品| 欧美性猛片xxxx免费看久爱| 亚洲欧美国产精品桃花| 国产亚洲精品bt天堂精选| 久久综合给合| 日韩午夜电影av| 国产精品高潮呻吟久久| 欧美一区二区三区四区在线| 一区二区在线视频观看| 欧美国产日韩一区二区三区| 夜夜爽www精品| 国产日本欧美一区二区三区在线| 久久久久久久尹人综合网亚洲| 亚洲国产高清aⅴ视频| 欧美日韩综合久久| 欧美一级免费视频| 亚洲国产精品一区二区www| 欧美三区美女| 久久国产日韩| 亚洲精品久久视频| 国产精品美女久久久久av超清| 久久久高清一区二区三区| 亚洲精品一区二区在线| 国产精品亚洲一区二区三区在线| 久久人人爽人人| 一区二区三区偷拍| 一区在线免费| 欧美午夜理伦三级在线观看| 久久精彩免费视频| 一区二区高清在线| 激情五月综合色婷婷一区二区| 欧美日韩99| 久久国产精品亚洲77777| 亚洲精品日韩久久| 国产手机视频精品| 欧美日韩三级视频| 久久久久久久综合日本| 中文高清一区| …久久精品99久久香蕉国产| 国产精品海角社区在线观看| 久久男人资源视频| 亚洲一二三区精品| 亚洲国产视频一区二区| 国产欧美日韩精品在线| 欧美精品一区二区久久婷婷| 久久精品99国产精品日本| 一本色道久久88综合亚洲精品ⅰ | 欧美日韩国产片| 久久噜噜噜精品国产亚洲综合| 一本久久综合亚洲鲁鲁| 在线观看精品| 国产日韩欧美夫妻视频在线观看| 欧美精品一区二区久久婷婷| 久久精品国产精品亚洲| 亚洲午夜精品一区二区| 最新国产成人av网站网址麻豆| 国产欧美一区二区白浆黑人| 欧美日本韩国一区二区三区| 久久女同互慰一区二区三区| 亚洲欧美精品在线观看| 亚洲精一区二区三区| 尹人成人综合网| 国产免费观看久久| 欧美日韩在线观看视频| 欧美成人免费小视频| 久久精品人人做人人爽| 亚洲免费在线看| 99re66热这里只有精品4 | 久久成人18免费网站| 亚洲欧美日韩精品久久久| 日韩一区二区精品| 亚洲第一天堂av| 国内精品美女av在线播放| 国产精品亚洲综合| 欧美先锋影音| 欧美日韩一区二区三区在线观看免| 美女国内精品自产拍在线播放| 久久成人综合视频| 欧美一级电影久久| 亚洲欧美久久| 亚洲网站在线| 一本一本久久a久久精品综合麻豆| 亚洲国产精品一区二区第四页av | 99精品视频免费全部在线| 在线观看欧美精品| 国内精品久久久久国产盗摄免费观看完整版| 国产精品日韩二区| 国产精品久久久久毛片大屁完整版 | 久久天天躁狠狠躁夜夜爽蜜月 | 欧美日本精品| 欧美精品1区2区| 欧美福利专区| 欧美福利视频网站| 欧美顶级少妇做爰| 欧美激情五月| 欧美激情综合色| 欧美日韩成人网| 欧美日韩一级视频| 欧美午夜在线观看| 国产精品自拍网站| 国产三级精品三级|