精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現最先進的蒙版自編碼器(MAE)

人工智能 機器視覺
今天,我深入探討視覺變換器之后計算機視覺領域最重要的突破之一:蒙版自編碼器(MAE)。

今天,我深入探討視覺變換器之后計算機視覺領域最重要的突破之一:蒙版自編碼器(MAE)。簡要回顧一下它的工作原理:

以下是工作步驟:

  • 圖像被分割成塊。
  • 這些塊的一個子集被隨機蒙版。
  • 只有可見的塊被送入編碼器(這很關鍵)。
  • 解碼器接收編碼器的壓縮表示,并嘗試使用可見和蒙版的塊重建整個圖像。
  • 僅在蒙版塊上計算損失。

導入

  • einops:用于其“repeat”函數
  • architectures.vit:標準ViT變換器的架構,我使用的是在“如何訓練ViT?”中提供的。

import torch
from torch import nn
import torch.nn.functional as F
from einops import repeat

from architectures.vit import Transformer

設置MAE類:

class MAE(nn.Module):
    def __init__(
        self,
        *,
        encoder,
        decoder_dim,
        masking_ratio=0.75,
        decoder_depth=1,
        decoder_heads=8,
        decoder_dim_head=64
    ):
        super().__init__()
        # Ensure the masking ratio is valid
        assert 0 < masking_ratio < 1, 'masking ratio must be between 0 and 1'
        self.masking_ratio = masking_ratio

我們定義一個從PyTorch的nn.Module繼承的MAE類。

  • 編碼器:我們的視覺變換器模型。
  • decoder_dim:解碼器嵌入空間的維度(例如512)。
  • masking_ratio:要蒙版的塊的比例(文章發現75%是最優的)。
  • 其他解碼器配置,如深度、頭和頭維度,這些都是變換器的標準。
  • 我們斷言蒙版比例在0和1之間。

塊:

        # Save the encoder (a Vision Transformer to be trained)
        self.encoder = encoder

        # Extract the number of patches and the encoder's dimensionality from the positional embeddings
        num_patches, encoder_dim = encoder.pos_embedding.shape[-2:]

        # Separate the patch embedding layers from the encoder
        # The first layer converts the image into patches
        self.to_patch = encoder.to_patch_embedding[0]
        # The remaining layers embed the patches
        self.patch_to_emb = nn.Sequential(*encoder.to_patch_embedding[1:])

發生了什么?

我們存儲編碼器并提取必要信息,如塊的數量和編碼器的輸出維度。

我們分離塊嵌入過程:

  • self.to_patch:這層將圖像分割成較小的塊。
  • self.patch_to_emb:這將每個塊嵌入到向量空間。
# Determine the dimensionality of the pixel values per patch
pixel_values_per_patch = encoder.to_patch_embedding[2].weight.shape[-1]

我們計算每個塊中的像素值數量,稍后會需要。

設置解碼器

self.enc_to_dec:如果編碼器和解碼器的維度不同,我們相應地映射它們。通常編碼器較大且維度較高(例如1024),而解碼器可以更淺且維度較?。ɡ?12),但我們需要一個適配器將編碼器的維度映射到解碼器的維度。

self.mask_token:一個可學習的標記,代表解碼器的蒙版塊。當塊被蒙版時,這是解碼器看到的標記。

我們初始化解碼器變換器和其他重建所需的層。

self.decoder = Transformer(
    dim=decoder_dim,
    depth=decoder_depth,
    heads=decoder_heads,
    dim_head=decoder_dim_head,
    mlp_dim_ratio=4
)
# Positional embeddings for the decoder tokens
self.decoder_pos_emb = nn.Embedding(num_patches, decoder_dim)
# Linear layer to reconstruct pixel values from decoder outputs
self.to_pixels = nn.Linear(decoder_dim, pixel_values_per_patch)

到目前為止,你的MAE類應該像這樣初始化:

class MAE(nn.Module):
    def __init__(
        self,
        *,
        encoder,
        decoder_dim,
        masking_ratio=0.75,
        decoder_depth=1,
        decoder_heads=8,
        decoder_dim_head=64
    ):
        super().__init__()
        # Ensure the masking ratio is valid
        assert 0 < masking_ratio < 1, 'masking ratio must be between 0 and 1'
        self.masking_ratio = masking_ratio

        # Save the encoder (a Vision Transformer to be trained)
        self.encoder = encoder

        # Extract the number of patches and the encoder's dimensionality from the positional embeddings
        num_patches, encoder_dim = encoder.pos_embedding.shape[-2:]

        # Separate the patch embedding layers from the encoder
        # The first layer converts the image into patches
        self.to_patch = encoder.to_patch_embedding[0]
        # The remaining layers embed the patches
        self.patch_to_emb = nn.Sequential(*encoder.to_patch_embedding[1:])

        # Determine the dimensionality of the pixel values per patch
        pixel_values_per_patch = encoder.to_patch_embedding[2].weight.shape[-1]

        # Set up decoder parameters
        self.decoder_dim = decoder_dim
        # Map encoder dimensions to decoder dimensions if they differ
        self.enc_to_dec = (
            nn.Linear(encoder_dim, decoder_dim)
            if encoder_dim != decoder_dim
            else nn.Identity()
        )
        # Learnable mask token for masked patches
        self.mask_token = nn.Parameter(torch.randn(decoder_dim))
        # Define the decoder transformer
        self.decoder = Transformer(
            dim=decoder_dim,
            depth=decoder_depth,
            heads=decoder_heads,
            dim_head=decoder_dim_head,
            mlp_dim_ratio=4
        )
        # Positional embeddings for the decoder tokens
        self.decoder_pos_emb = nn.Embedding(num_patches, decoder_dim)
        # Linear layer to reconstruct pixel values from decoder outputs
        self.to_pixels = nn.Linear(decoder_dim, pixel_values_per_patch)

太好了!現在讓我們看看如何在前向傳遞中使用這些不同的部分,這有點像拼圖。

前向傳遞

讓我們走過前向函數,它定義了我們的模型如何處理輸入數據。

def forward(self, img):
    device = img.device

    # Convert the input image into patches
    patches = self.to_patch(img)  # Shape: (batch_size, num_patches, patch_size)
    batch_size, num_patches, *_ = patches.shape

    # Embed the patches using the encoder's patch embedding layers
    tokens = self.patch_to_emb(patches)  # Shape: (batch_size, num_patches, encoder_dim)

開始非常標準,我們只需要將“將圖像塊化”操作與“投影到標記”操作分解,因為我們使用原始塊作為計算損失的基準。

  • 前向方法以圖像張量img作為輸入。
  • 我們獲取張量所在的設備(CPU或GPU)。
  • 我們將圖像分割成塊。
  • 我們獲得批量大小和塊的數量。
  • 每個塊被嵌入到一個向量中。

位置編碼:

# Add positional embeddings to the tokens
if self.encoder.pool == "cls":
    # If using CLS token, skip the first positional embedding
    tokens += self.encoder.pos_embedding[:, 1 : num_patches + 1]
elif self.encoder.pool == "mean":
    # If using mean pooling, use all positional embeddings
    tokens += self.encoder.pos_embedding.to(device, dtype=tokens.dtype)

我們為每個標記添加位置信息,以便模型知道每個塊來自哪里。如果有額外的CLS標記,我們需要跳過它,因為它不是圖像的一部分。

蒙版和編碼

現在我們來到最有趣的部分,蒙版圖像。

# Determine the number of patches to mask
num_masked = int(self.masking_ratio * num_patches)

# Generate random indices for masking
rand_indices = torch.rand(batch_size, num_patches, device=device).argsort(dim=-1)
masked_indices = rand_indices[:, :num_masked]
unmasked_indices = rand_indices[:, num_masked:]

我們根據我們的蒙版比例計算我們將蒙版多少塊。

我們為每個塊序列生成一個隨機排列。

我們相應地定義masked_indices和unmasked_indices。

# Select the tokens corresponding to unmasked patches
batch_range = torch.arange(batch_size, device=device)[:, None]
tokens = tokens[batch_range, unmasked_indices]

# Select the original patches that are masked (for reconstruction loss)
masked_patches = patches[batch_range, masked_indices]

# Encode the unmasked tokens using the encoder's transformer
encoded_tokens = self.encoder.transformer(tokens)

我們選擇剛剛定義的masked_indices對應的masked_patches。

我們只保留未蒙版塊的標記以進行編碼。

解碼

現在讓我們進入最令人興奮但也最難的部分,解碼!

# Map encoded tokens to decoder dimensions if necessary
decoder_tokens = self.enc_to_dec(encoded_tokens)

# Add positional embeddings to the decoder tokens of unmasked patches
unmasked_decoder_tokens = decoder_tokens + self.decoder_pos_emb(unmasked_indices)

# Create mask tokens for the masked patches and add positional embeddings
mask_tokens = repeat(self.mask_token, 'd -> b n d', b=batch_size, n=num_masked)
mask_tokens = mask_tokens + self.decoder_pos_emb(masked_indices)

# Initialize the full sequence of decoder tokens
decoder_sequence = torch.zeros(
  batch_size, num_patches, self.decoder_dim, device=device
)
# Place unmasked decoder tokens and mask tokens in their original positions
decoder_sequence[batch_range, unmasked_indices] = unmasked_decoder_tokens
decoder_sequence[batch_range, masked_indices] = mask_tokens

# Decode the full sequence
decoded_tokens = self.decoder(decoder_sequence)

# Extract the decoded tokens corresponding to the masked patches
masked_decoded_tokens = decoded_tokens[batch_range, masked_indices]
  • 我們調整編碼標記以匹配解碼器預期的輸入大小self.enc_to_dec
  • 我們向解碼器標記添加位置嵌入。
  • 對于蒙版位置,我們使用蒙版標記并添加位置嵌入。
  • 我們通過將未蒙版和蒙版標記放回其原始位置來重建完整序列。
  • 我們將完整序列傳遞給解碼器。
  • 我們提取對應于蒙版塊的解碼標記。
# Reconstruct the pixel values from the masked decoded tokens
pred_pixel_values = self.to_pixels(masked_decoded_tokens)

# Compute the reconstruction loss (mean squared error)
recon_loss = F.mse_loss(pred_pixel_values, masked_patches)
return recon_loss
  • 我們嘗試重建蒙版塊的原始像素值。
  • 我們通過將重建的塊與原始蒙版塊進行比較來計算L2損失。

參考資料:

  • 參考代碼:https://github.com/FrancoisPorcher/awesome-ai-tutorials?source=post_page-----6f454b736087--------------------------------
  • 論文:https://arxiv.org/abs/2111.06377
  • 參考代碼:https://github.com/lucidrains/vit-pytorch
責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2025-04-10 11:52:55

2021-03-29 11:37:50

人工智能深度學習

2021-03-22 10:52:13

人工智能深度學習自編碼器

2022-09-13 15:26:40

機器學習算法數據

2021-02-20 20:57:16

深度學習編程人工智能

2017-07-19 13:40:42

卷積自編碼器降噪

2024-06-18 08:52:50

LLM算法深度學習

2018-05-21 08:22:14

自編碼器協同過濾深度學習

2017-11-10 12:45:16

TensorFlowPython神經網絡

2020-04-26 11:26:02

人臉合成編碼器數據

2022-04-02 21:46:27

深度學習編碼器圖像修復

2017-12-26 10:48:37

深度學習原始數據

2025-04-10 06:30:00

2017-07-03 07:14:49

深度學習無監督學習稀疏編碼

2024-11-13 16:24:33

ViT架構PyTorch

2014-08-07 10:49:20

debugdebug技巧

2013-09-16 09:41:13

400G網絡處理器思科網絡處理器

2021-11-02 20:44:47

數字化

2014-08-07 10:03:31

debug技巧原則

2012-04-10 16:55:22

PowerSmart編碼器
點贊
收藏

51CTO技術棧公眾號

日韩av电影手机在线| 日韩丝袜美女视频| 色一情一乱一伦一区二区三区| 日韩中文字幕高清| 日韩夫妻性生活xx| 日韩无一区二区| 超碰网在线观看| 黄av在线免费观看| 不卡的av电影| 国产美女扒开尿口久久久| 欧美日韩在线观看免费| 亚洲精品小区久久久久久| 欧美美女喷水视频| 成 年 人 黄 色 大 片大 全| 成人福利在线| 成人一级片网址| 国产精品揄拍500视频| 日韩三级小视频| 99精品小视频| 亚洲人成电影网站色| 欧美一级大片免费看| 我爱我色成人网| 亚洲成av人在线观看| 色姑娘综合av| 污污网站免费在线观看| 黄页视频在线91| 国产精品视频大全| 国产精品777777| 亚洲婷婷在线| 蜜臀久久99精品久久久久久宅男 | 中文字幕永久在线视频| 1024精品一区二区三区| 久久久黄色av| 欧美性生交大片| av中文字幕一区二区| 日韩大陆欧美高清视频区| 国产大学生av| 国产一区二区三区免费观看在线| 欧美网站大全在线观看| 欧美日韩亚洲一| 91九色美女在线视频| 亚洲综合色网站| 警花观音坐莲激情销魂小说| av午夜在线| 国产欧美日韩综合| 欧美xxxx黑人又粗又长密月| 天天在线女人的天堂视频| 成人污视频在线观看| 97av自拍| 成人h动漫精品一区二区无码 | 欧美被日视频| 国产精品嫩草99a| 神马欧美一区二区| wwwww在线观看免费视频| 久久久久久一二三区| 久久久久久亚洲精品不卡4k岛国 | 在线播放亚洲激情| 性猛交ⅹxxx富婆video | 免费在线观看污污视频| 午夜精品一区| 亚洲欧洲日韩在线| 婷婷视频在线播放| 91精品久久| 夜夜亚洲天天久久| 欧美不卡在线播放| 深夜在线视频| 欧美性黄网官网| 国产精品人人妻人人爽人人牛| 蜜臀国产一区| 欧美亚洲国产bt| 激情在线观看视频| 97久久亚洲| 精品一区二区三区四区| 免费黄色在线视频| 久久精品国产www456c0m| 久久久999精品视频| 亚洲av鲁丝一区二区三区| 精品成人久久| 国产精品18久久久久久首页狼| а中文在线天堂| 国产一区二区在线观看免费| 国产精品成人观看视频免费| 水中色av综合| 国产精品久久久久一区| www.在线观看av| 国产高清不卡| 69久久99精品久久久久婷婷| 免费观看一区二区三区| 中文字幕中文字幕精品| 日韩一区av在线| 日产亚洲一区二区三区| 天堂精品中文字幕在线| 91一区二区三区| 秋霞av在线| 亚洲免费在线观看视频| 免费国产黄色网址| 99九九久久| 亚洲国产精品yw在线观看| 懂色av蜜桃av| 136国产福利精品导航网址| 国产成人短视频| 国产特级aaaaaa大片| 91女厕偷拍女厕偷拍高清| 一区二区三区国产福利| 成年人黄色大片在线| 欧美日韩精品免费| 亚洲精品乱码久久久久久久| 围产精品久久久久久久| 欧美亚洲成人精品| 国产人妖在线播放| 国产片一区二区三区| 91黄色在线看| 欧美网站免费| 亚洲老板91色精品久久| 精品一级少妇久久久久久久| 男女男精品网站| 欧美日本韩国国产| 国产啊啊啊视频在线观看| 欧美色大人视频| 日本黄色网址大全| 狠狠入ady亚洲精品| 国产精品一二三在线| 偷拍自拍在线| 午夜久久久久久久久久一区二区| 污污的视频免费观看| 国产乱码精品一区二区三区四区| 久久久久久久999| 国产农村妇女毛片精品久久| 国产偷v国产偷v亚洲高清| 久无码久无码av无码| 国产美女精品视频免费播放软件| 亚洲午夜久久久影院| 精品91久久久| 成人一级黄色片| 成年在线观看视频| 成人日韩视频| 色久欧美在线视频观看| 波多野结衣电影在线播放| 99re亚洲国产精品| 国产欧美日韩网站| 国产精品对白久久久久粗| 久久国产加勒比精品无码| 91 中文字幕| 国产精品久久久久久久久久久免费看 | 天天操天天操天天干| 亚洲综合无码一区二区| 男女污污视频网站| 亚洲破处大片| 91gao视频| 99自拍视频在线观看| 91精品国产综合久久久久久久久久| 人妻大战黑人白浆狂泄| 久久精品系列| 日本一区美女| 精品久久在线| 久久精品国产一区二区三区 | 中文字幕这里只有精品| 亚洲精品国产精品国自产在线| 日韩精品在线免费看| av高清久久久| 成人午夜视频免费在线观看| 精品久久91| 国产色综合天天综合网| 久热国产在线| 欧美不卡一区二区三区四区| 国产精品99无码一区二区| 不卡一区二区在线| 欧美亚洲另类色图| 精品国产一区二区三区久久久樱花 | 国产真实乱子伦精品视频| 400部精品国偷自产在线观看| 免费观看亚洲视频大全| 久久久久久97| 免费a在线观看| 欧美三级中文字| 男人的天堂久久久| av午夜一区麻豆| 久久久久国产精品熟女影院| 久久综合国产| 国产色综合一区二区三区| 亚洲欧洲自拍| 久久久www成人免费精品| 亚洲第一视频在线| 色婷婷av一区二区三区软件| 欧美日韩国产黄色| 成人自拍视频在线观看| 欧美视频在线观看网站| 精品国产精品国产偷麻豆| 5g国产欧美日韩视频| 两个人看的在线视频www| 日韩中文在线中文网三级| 亚洲精品免费在线观看视频| 日本丰满少妇一区二区三区| 久久中文免费视频| 国产欧美一区二区精品忘忧草| 91欧美一区二区三区| 午夜在线精品| 经典三级在线视频| 宅男在线一区| aa成人免费视频| 91精品店在线| 97视频com| 岛国成人毛片| 亚洲人成自拍网站| 亚洲第九十九页| 欧美日韩国产高清一区二区三区 | 欧美一区1区三区3区公司| 在线视频成人| 国产成人精品av在线| 污的网站在线观看| 综合国产在线观看| 日韩福利一区二区| 欧美成人精品二区三区99精品| 奴色虐av一区二区三区| 亚洲国产精品一区二区久久恐怖片| 婷婷色一区二区三区| www.欧美亚洲| 深爱五月综合网| 另类小说欧美激情| 激情婷婷综合网| 一本不卡影院| 亚洲精品久久久久久久蜜桃臀| 欧美激情另类| 色播亚洲婷婷| 国产欧美日韩| 欧美另类视频在线| 天堂av一区二区三区在线播放| 产国精品偷在线| 精品一区二区三区中文字幕在线 | 亚洲激情综合网| 特级西西人体高清大胆| 久久久久久综合| 亚洲av无码国产精品久久| 成人黄色在线视频| 性生交大片免费看l| 精品亚洲国产成人av制服丝袜| www日韩在线观看| 久久久亚洲人| 无码人妻丰满熟妇区五十路百度| 99热这里只有成人精品国产| 999久久欧美人妻一区二区| 中文字幕一区二区三区乱码图片 | 亚洲最大成人综合网| 337p粉嫩大胆色噜噜噜噜亚洲| 少妇伦子伦精品无吗| 国产成人av电影在线观看| 国产不卡的av| 国产一区二区电影| 日本人dh亚洲人ⅹxx| 国产激情精品久久久第一区二区 | 国产色婷婷亚洲99精品小说| 亚洲精品理论片| 26uuu精品一区二区| 爱爱的免费视频| 久久久影视传媒| 黄色三级生活片| 国产精品午夜春色av| 久草手机视频在线观看| 亚洲欧美另类久久久精品| av成人免费网站| 亚洲图片欧美综合| 国产精品suv一区二区三区| 日韩欧美在线视频日韩欧美在线视频| 亚洲精品午夜国产va久久成人| 色哟哟一区二区在线观看| 波多野结衣家庭主妇| 欧美喷水一区二区| 国产高清视频免费| 欧美精品一区视频| 你懂的在线网址| 色狠狠av一区二区三区香蕉蜜桃| 国产高清一区二区三区视频 | 亚洲天堂av女优| 91在线导航| 色中色综合影院手机版在线观看| 国产精品69xx| 国产精品99久久99久久久二8| 久久精品黄色| 国产精品久久久久久久久久久久午夜片| 林ゆな中文字幕一区二区| 日韩福利视频| 欧美二区视频| 亚洲精品乱码久久久久久自慰| 奇米888四色在线精品| gogo亚洲国模私拍人体| 91丝袜国产在线播放| 国产白丝一区二区三区| 亚洲午夜久久久久久久久电影网| 国产精品va无码一区二区三区| 欧美日韩国产高清一区二区| 日韩在线视频第一页| 一本大道久久加勒比香蕉| caoporn免费在线| 热久久99这里有精品| 国产精品国产三级在线观看| 国产一区二区无遮挡| 婷婷综合社区| 日韩中文字幕二区| 国产经典欧美精品| 日韩影视一区二区三区| 一区二区欧美国产| 中文字幕av免费观看| 亚洲国产日韩精品在线| 黄色在线论坛| 日本一区二区三区四区视频| 日韩精品成人| 亚洲欧美日韩精品久久久| 亚洲精品少妇| 在线观看视频你懂得| 国产日本欧美一区二区| 国产在线视频99| 3atv在线一区二区三区| 成人影院免费观看| 97国产suv精品一区二区62| 精品中文字幕一区二区三区四区| 欧美日韩精品免费看| 亚洲精品日本| 国产精品91av| 亚洲视频在线一区| 一区二区三区麻豆| 亚洲精品日韩在线| av资源网在线播放| 97超级碰碰| 亚洲久久久久| 老司机久久精品| 国产精品视频第一区| 国产精品男女视频| 亚洲国产精品大全| 欧美xxxx做受欧美88bbw| 91亚洲精品久久久久久久久久久久| 黑人操亚洲人| 久久国产色av免费观看| 久久亚洲精华国产精华液| 国产性生活网站| 欧美tickling网站挠脚心| 超碰公开在线| 亚洲最大成人免费视频| 亚洲人成免费网站| www.久久久久久久久久久| 亚洲天堂久久久久久久| 91精品人妻一区二区三区果冻| 中文字幕日韩有码| 国产一区影院| 亚洲日本无吗高清不卡| 麻豆免费看一区二区三区| 自拍偷拍你懂的| 欧美日韩国产大片| 老司机99精品99| 亚洲自拍偷拍区| 欧美特黄视频| 国产又粗又猛又色| 欧美日韩在线影院| 久久精品a一级国产免视看成人| 全球成人中文在线| 免费av一区二区三区四区| 亚洲少妇第一页| 国产精品久久久久久久久免费桃花| 911美女片黄在线观看游戏| 久久国产精品久久久| 136福利精品导航| 东北少妇不带套对白| 91女厕偷拍女厕偷拍高清| 无码人妻丰满熟妇精品| 中文日韩电影网站| 亚洲18在线| 污污污污污污www网站免费| 91视频91自| 精品国产青草久久久久96| 久久精品国产一区| 激情av综合| 亚洲五月天综合| 自拍av一区二区三区| 亚洲第一精品网站| 欧美亚洲视频一区二区| 成人在线丰满少妇av| 午夜免费福利网站| 五月天一区二区三区| 黄色片在线免费观看| 成人国产在线激情| 亚洲国产日本| 毛片视频免费播放| 精品少妇一区二区三区| 欧产日产国产精品视频| 一区二区在线观看网站| 成人午夜视频免费看| 亚洲高清视频免费观看| 欧美日韩第一页| 国产欧美一区二区三区精品观看 | 99久久精品国产一区| 日韩乱码一区二区三区| 欧美猛男性生活免费| 美女久久久久| 日韩女优在线视频| 在线观看视频91| 激情网站在线| 天堂av一区二区| 成人午夜视频网站| 国产又粗又黄又爽| 热re91久久精品国99热蜜臀| 亚洲人metart人体|