Implementierung von Selbstaufmerksamkeitsmechanismen für Computer Vision in PyTorch mit einsum und einops. Konzentriert sich auf Selbstaufmerksamkeitsmodule für Computer Vision.
$ pip install self-attention-cv
Es wäre schön, Pytorch in Ihrer Umgebung vorzuinstallieren, falls Sie keine GPU haben. Um die Tests vom Terminal $ pytest
aus auszuführen, müssen Sie möglicherweise vorher export PYTHONPATH=$PATHONPATH:`pwd`
ausführen.
import torch
from self_attention_cv import MultiHeadSelfAttention
model = MultiHeadSelfAttention ( dim = 64 )
x = torch . rand ( 16 , 10 , 64 ) # [batch, tokens, dim]
mask = torch . zeros ( 10 , 10 ) # tokens X tokens
mask [ 5 : 8 , 5 : 8 ] = 1
y = model ( x , mask )
import torch
from self_attention_cv import AxialAttentionBlock
model = AxialAttentionBlock ( in_channels = 256 , dim = 64 , heads = 8 )
x = torch . rand ( 1 , 256 , 64 , 64 ) # [batch, tokens, dim, dim]
y = model ( x )
import torch
from self_attention_cv import TransformerEncoder
model = TransformerEncoder ( dim = 64 , blocks = 6 , heads = 8 )
x = torch . rand ( 16 , 10 , 64 ) # [batch, tokens, dim]
mask = torch . zeros ( 10 , 10 ) # tokens X tokens
mask [ 5 : 8 , 5 : 8 ] = 1
y = model ( x , mask )
import torch
from self_attention_cv import ViT , ResNet50ViT
model1 = ResNet50ViT ( img_dim = 128 , pretrained_resnet = False ,
blocks = 6 , num_classes = 10 ,
dim_linear_block = 256 , dim = 256 )
# or
model2 = ViT ( img_dim = 256 , in_channels = 3 , patch_dim = 16 , num_classes = 10 , dim = 512 )
x = torch . rand ( 2 , 3 , 256 , 256 )
y = model2 ( x ) # [2,10]
import torch
from self_attention_cv . transunet import TransUnet
a = torch . rand ( 2 , 3 , 128 , 128 )
model = TransUnet ( in_channels = 3 , img_dim = 128 , vit_blocks = 8 ,
vit_dim_linear_mhsa_block = 512 , classes = 5 )
y = model ( a ) # [2, 5, 128, 128]
import torch
from self_attention_cv . bottleneck_transformer import BottleneckBlock
inp = torch . rand ( 1 , 512 , 32 , 32 )
bottleneck_block = BottleneckBlock ( in_channels = 512 , fmap_size = ( 32 , 32 ), heads = 4 , out_channels = 1024 , pooling = True )
y = bottleneck_block ( inp )
import torch
from self_attention_cv . pos_embeddings import AbsPosEmb1D , RelPosEmb1D
model = AbsPosEmb1D ( tokens = 20 , dim_head = 64 )
# batch heads tokens dim_head
q = torch . rand ( 2 , 3 , 20 , 64 )
y1 = model ( q )
model = RelPosEmb1D ( tokens = 20 , dim_head = 64 , heads = 3 )
q = torch . rand ( 2 , 3 , 20 , 64 )
y2 = model ( q )
import torch
from self_attention_cv . pos_embeddings import RelPosEmb2D
dim = 32 # spatial dim of the feat map
model = RelPosEmb2D (
feat_map_size = ( dim , dim ),
dim_head = 128 )
q = torch . rand ( 2 , 4 , dim * dim , 128 )
y = model ( q )
Vielen Dank an Alex Rogozhnikov @arogozhnikov für das tolle Einops-Paket. Für meine Neuimplementierungen habe ich Code aus vielen Repositories von Phil Wang @lucidrains studiert und ausgeliehen. Durch das Studium seines Codes ist es mir gelungen, Selbstaufmerksamkeit zu erlangen, NLP-Sachen zu entdecken, auf die in den Aufsätzen nie Bezug genommen wird, und von seinem sauberen Codierungsstil zu lernen.
@article{adaloglou2021transformer,
title = "Transformers in Computer Vision",
author = "Adaloglou, Nikolas",
journal = "https://theaisummer.com/",
year = "2021",
howpublished = {https://github.com/The-AI-Summer/self-attention-cv},
}
Wenn Ihnen dieses Repository wirklich gefällt und Sie es nützlich finden, denken Sie bitte darüber nach (★), es mit einem Sternchen zu versehen, damit es ein breiteres Publikum von Gleichgesinnten erreichen kann. Es wäre sehr dankbar :)!