Implementación de mecanismos de autoatención para visión por computadora en PyTorch con einsum y einops. Enfocado en módulos de autoatención de visión por computadora.
$ pip install self-attention-cv
Sería bueno preinstalar pytorch en su entorno, en caso de que no tenga una GPU. Para ejecutar las pruebas desde la terminal $ pytest
es posible que necesites ejecutar export PYTHONPATH=$PATHONPATH:`pwd`
antes.
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 )
Gracias a Alex Rogozhnikov @arogozhnikov por el fantástico paquete einops. Para mis reimplementaciones, estudié y tomé prestado código de muchos repositorios de Phil Wang @lucidrains. Al estudiar su código, logré captar la atención personal, descubrir cosas de PNL que nunca se mencionan en los artículos y aprender de su estilo de codificación limpio.
@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},
}
Si realmente le gusta este repositorio y lo encuentra útil, considere (★) destacarlo para que pueda llegar a una audiencia más amplia de personas con ideas afines. ¡Sería muy apreciado :)!