精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91麻豆精品国产91久久久使用方法 | 欧美人伦禁忌dvd放荡欲情| 日本一区二区免费看| 国产精品久久综合青草亚洲AV| 欧美一区视频| 日韩精品一区二区三区第95| 国产91色在线观看| 污网站在线免费看| 99视频一区二区三区| 国产女精品视频网站免费| 国产一级片免费| 成人在线亚洲| 亚洲精品按摩视频| 一级黄色香蕉视频| 91福利在线尤物| 国产三级欧美三级日产三级99| 91久久精品视频| 69成人免费视频| 欧美人成在线| 色偷偷噜噜噜亚洲男人的天堂| 欧亚乱熟女一区二区在线| 欧美aaa级| 日本福利一区二区| 三上悠亚久久精品| а√中文在线8| 国产精品无圣光一区二区| 国产综合第一页| 99在线小视频| 久久99精品一区二区三区| 欧洲美女免费图片一区| 精品无码人妻一区二区三区品| 日韩免费视频| 亚洲一区二区久久久| 屁屁影院国产第一页| 亚洲超碰在线观看| 91精品福利在线一区二区三区 | 国产精品视频二| 淫片在线观看| 欧美国产国产综合| 日本一区二区在线视频| 你懂的视频在线播放| 99re热这里只有精品免费视频 | 免费在线观看污网站| 国产精品迅雷| 色综合咪咪久久| 国模无码视频一区二区三区| 成人在线免费观看黄色| 亚洲综合精品久久| 免费网站永久免费观看| 日韩伦理av| 亚洲一区国产视频| 日韩免费在线观看av| 亚洲制服国产| 亚洲午夜在线观看视频在线| 中文字幕日韩精品无码内射| 日本一本在线免费福利| 亚洲一区视频在线| 免费毛片网站在线观看| 岛国在线视频网站| 狠狠躁18三区二区一区| 免费观看精品视频| 秋霞国产精品| 欧美电影一区二区三区| 在线视频日韩欧美| 1204国产成人精品视频| 亚洲国产日韩欧美综合久久| 五十路六十路七十路熟婆 | 国产suv精品一区二区三区| 97免费高清电视剧观看| 亚洲欧美国产高清va在线播放| 成人禁用看黄a在线| 精品久久中出| 成人在线观看黄色| 亚洲丝袜自拍清纯另类| 黄色成人在线免费观看| 蜜臀久久精品| 欧美伊人久久大香线蕉综合69| 午夜久久福利视频| 亚洲日本视频在线| 亚洲欧洲午夜一线一品| 久久av红桃一区二区禁漫| 欧美日韩国产探花| 欧美一区二三区| 97超碰人人草| 99在线热播精品免费| 亚洲一区三区电影在线观看| 在线观看免费视频你懂的| 天天综合天天做天天综合| wwwwxxxx日韩| 综合激情久久| 国产一区二区三区视频| 欧美激情一区二区视频| 美女尤物久久精品| 91影视免费在线观看| 亚洲第一大网站| 国产日韩av一区二区| 91精品一区二区三区四区| 免费在线小视频| 91精品国产综合久久小美女| 熟妇高潮精品一区二区三区| 91tv官网精品成人亚洲| 日本精品久久电影| www.av日韩| 欧美极品xxx| www.xxx麻豆| 日韩有码欧美| 亚洲视频在线观看免费| 久青草视频在线观看| 蜜臀av一区二区三区| 精品一区二区三区日本| 超碰个人在线| 欧美日韩一区二区三区高清| 网站免费在线观看| 欧美精品色网| 国产主播欧美精品| 国产理论电影在线观看| 天天色图综合网| 精品人妻一区二区乱码| 欧美成人激情| 国产精品老女人视频| 蜜臀av在线观看| 亚洲视频一二三| 在线黄色免费观看| 久久99蜜桃| 欧美一级淫片aaaaaaa视频| 亚洲第一页综合| 亚洲欧美日韩国产手机在线| 一区二区xxx| 女人av一区| 78色国产精品| 日批视频在线播放| 亚洲午夜成aⅴ人片| 日本一区二区三区在线免费观看| 色乱码一区二区三区网站| 日本中文字幕成人| 你懂的视频在线免费| 精品久久久久久电影| 国产女人18毛片水真多18| 欧美在线精品一区| 99re在线视频上| 免费网站在线观看人| 日韩亚洲欧美在线| 欧美成人精品激情在线视频| 国产综合成人久久大片91| 中国人体摄影一区二区三区| 91精品麻豆| 久久在线观看视频| www.com欧美| 午夜视黄欧洲亚洲| 97人妻天天摸天天爽天天| 亚久久调教视频| 美脚丝袜一区二区三区在线观看| 在线观看v片| 国产亚洲激情视频在线| 欧美另类高清videos的特点| 中文字幕av不卡| 污污的视频免费| 亚洲最新av| 97人人澡人人爽| 高清视频在线观看三级| 日韩精品在线观看网站| 伊人久久久久久久久久久久| 日本一区二区免费在线| 黄色片免费网址| 国产精品www.| 久久精品午夜一区二区福利| 怡红院成人在线| 久久亚洲影音av资源网| 后入内射欧美99二区视频| 婷婷久久综合九色综合伊人色| 亚洲天堂网一区二区| 日本va欧美va精品发布| 男人的天堂成人| 久久电影在线| 国产精品极品美女在线观看免费| 男女啪啪在线观看| 精品国产髙清在线看国产毛片| 91久久国产视频| 欧美国产激情二区三区 | 亚洲综合影院| 国产欧美日产一区| 欧美激情一区二区三区成人| 性猛交xxxx乱大交孕妇印度| 无吗不卡中文字幕| 国产激情av在线| 国产精品中文有码| 欧美三级在线观看视频| 不卡日本视频| 粉嫩高清一区二区三区精品视频| 欧美电影网址| 精品自在线视频| 国产精品人人爽人人爽| 精品欧美不卡一区二区在线观看| 欧美少妇bbb| 青青草成人免费| 久久九九久久九九| 亚洲女人在线观看| 丝袜美腿亚洲综合| 日韩精品免费一区| blacked蜜桃精品一区| 国产不卡一区二区三区在线观看 | 亚洲91精品在线| 91女主播在线观看| 日韩av最新在线观看| 国产又黄又猛又爽| 黑人精品xxx一区一二区| 婷婷社区五月天| 久久久www免费人成精品| 日本成人在线免费| 免费高清在线一区| 免费观看国产精品视频| 91精品亚洲| 欧美日韩一区二区三区免费| 91精品短视频| 成人日韩在线电影| 国精产品一区一区三区四川| 性欧美办公室18xxxxhd| aa在线视频| 日韩一区二区在线视频| 国模精品一区二区| 亚洲精品国产福利| 亚洲a视频在线| 欧美一区二区播放| 中文字幕一级片| 91福利国产精品| 91在线视频在线观看| 亚洲18色成人| 国产亚洲精品码| 亚洲蜜臀av乱码久久精品| 91禁男男在线观看| 国产偷国产偷精品高清尤物| 日本高清www| 99re成人精品视频| 污污内射在线观看一区二区少妇 | 好吊视频在线观看| 26uuu亚洲综合色欧美| 午夜不卡久久精品无码免费| 国产盗摄女厕一区二区三区| 亚洲第一成肉网| 寂寞少妇一区二区三区| 超碰在线97免费| 美女久久久精品| 高清av免费看| 麻豆成人久久精品二区三区红| 91蝌蚪视频在线观看| 久久久久久久欧美精品| 国产成人a亚洲精v品无码| 中日韩男男gay无套| 浮妇高潮喷白浆视频| 一区二区久久| 欧美精品第三页| 免费观看久久久4p| 欧美日韩精品区别| 国产剧情在线观看一区二区| 91亚洲一区二区| 国产美女视频91| 国产精品无码自拍| 99久久精品国产麻豆演员表| 免费在线观看你懂的| 国产视频一区在线播放| 欧美成人午夜剧场免费观看| 国产区精品在线| 欧美不卡视频一区| 神马午夜电影一区二区三区在线观看 | 国产亚洲精久久久久久| 免费观看a级片| 综合色中文字幕| 久久这里只有精品国产| 狠狠做深爱婷婷久久综合一区| 久久久久久久久久成人| 3751色影院一区二区三区| www.激情五月.com| 精品视频一区在线视频| 成人在线播放视频| 欧美区在线播放| 男人久久天堂| 国产成人激情小视频| 国产精品igao视频网网址不卡日韩| 国产激情美女久久久久久吹潮| 亚洲精品亚洲人成在线| 亚洲一卡二卡三卡| 国产精品videosex极品| 精品视频一区二区在线| 狠狠色丁香婷综合久久| 国产成人精品无码片区在线| 国产欧美日韩在线视频| 中文字幕在线2021| 欧美视频精品一区| 国产又粗又黄又爽| 亚洲精品电影在线| 日本在线免费| 欧美在线激情网| 不卡一区视频| 欧美一区少妇| 欧美色一级片| 久久av红桃一区二区小说| 国产黄色片免费看| 欧美日韩电影在线播放| 刘亦菲久久免费一区二区| 中文字幕在线观看日韩| 看黄在线观看| 亚洲精品日韩av| 欧美精品一区二区久久| 成品人视频ww入口| 毛片av一区二区| 亚洲欧美视频在线播放| 亚洲欧美日韩一区| 亚洲精品91天天久久人人| 欧美精品一区二区久久久| 蜜芽在线免费观看| 日本成人免费在线| 国产成人在线中文字幕| 日本特级黄色大片| 视频一区中文字幕国产| yy6080午夜| 夜夜操天天操亚洲| 国产精品伊人久久| 在线日韩av观看| 日产福利视频在线观看| 成人免费在线看片| 91久久电影| 免费涩涩18网站入口| 91色在线porny| 欧美日韩中文视频| 日韩欧美一卡二卡| 看黄网站在线观看| 国产欧美精品一区二区| 西野翔中文久久精品国产| 日本阿v视频在线观看| 国产一区高清在线| 国产喷水在线观看| 欧美日韩精品一区二区天天拍小说 | 亚洲精品xxxx| 91超碰在线免费| 粉嫩高清一区二区三区精品视频 | 91国产高清在线| www.豆豆成人网.com| 日产精品久久久久久久蜜臀| 国产精品一区久久久久| 波多野结衣家庭教师| 欧美精品日日鲁夜夜添| 日本中文在线观看| 成人激情春色网| 亚洲成人三区| 亚洲欧美一区二区三区不卡| 亚洲人一二三区| 国产精品永久久久久久久久久| 日韩视频免费中文字幕| 成人在线视频国产| 今天免费高清在线观看国语| 国产成人av一区二区三区在线 | 久久亚洲欧洲| 久久精品三级视频| 欧美日韩成人激情| av片在线观看免费| 国产 高清 精品 在线 a| 欧美午夜a级限制福利片| 亚洲中文字幕无码一区| 精品色蜜蜜精品视频在线观看| 你懂的在线视频| 国产精品久久久久久久久久免费| 日韩欧美字幕| 成人免费黄色av| 五月天一区二区三区| 蜜桃视频在线播放| 国产欧美一区二区三区在线看| 亚洲国产精品综合久久久| 久久久久99人妻一区二区三区| 亚洲国产精品人人做人人爽| 欧美日韩国产综合视频| 国产日韩欧美成人| 欧美天堂亚洲电影院在线观看| 中文字幕在线免费看线人| 在线欧美一区二区| www在线观看播放免费视频日本| 国产伦视频一区二区三区| 肉色丝袜一区二区| 国产又黄又爽又无遮挡| 日韩电影中文 亚洲精品乱码| 成人av色网站| 欧美久久久久久久久久久久久久| 久久在线观看免费| 亚洲无码精品国产| 97视频免费在线看| 波多野结衣在线观看一区二区| 五月天六月丁香| 色综合欧美在线| 日韩精品分区| 亚洲高清不卡一区| 成人免费观看av| 一区二区视频免费| 97人人爽人人喊人人模波多| 日韩大片在线播放| 怡红院一区二区| 欧美精品v国产精品v日韩精品| 毛片在线网站| 超薄肉色丝袜足j调教99| 久久久天堂av| 肥臀熟女一区二区三区| 国产精品色婷婷视频|