Transformers documentation
Pyramid Vision Transformer V2 (PVTv2)
Model ini dipublikasikan di HF papers pada 2021-06-25 dan disumbangkan ke Hugging Face Transformers pada 2024-03-13.
Pyramid Vision Transformer V2 (PVTv2)
Ikhtisar
Model PVTv2 diusulkan dalam PVT v2: Improved Baselines with Pyramid Vision Transformer oleh Wenhai Wang, Enze Xie, Xiang Li, Deng-Ping Fan, Kaitao Song, Ding Liang, Tong Lu, Ping Luo, dan Ling Shao. Sebagai varian yang ditingkatkan dari PVT, model ini meninggalkan position embeddings dan mengandalkan informasi posisi yang dikodekan melalui zero-padding serta overlapping patch embeddings. Ketidaktergantungan pada position embeddings ini menyederhanakan arsitektur dan memungkinkan inferensi dijalankan pada resolusi apa pun tanpa perlu melakukan interpolasi.
Struktur encoder PVTv2 telah berhasil diimplementasikan untuk mencapai skor state-of-the-art pada Segformer untuk segmentasi semantik, GLPN untuk kedalaman monokular, dan Panoptic Segformer untuk segmentasi panoptik.
PVTv2 termasuk dalam keluarga model yang disebut hierarchical transformers , yang melakukan adaptasi pada lapisan transformer untuk menghasilkan peta fitur multi-skala. Berbeda dengan struktur kolom Vision Transformer (ViT) yang kehilangan detail halus, peta fitur multi-skala dikenal mampu mempertahankan detail tersebut dan membantu kinerja pada tugas prediksi padat. Dalam kasus PVTv2, hal ini dicapai dengan menghasilkan token patch gambar menggunakan konvolusi 2D dengan kernel yang tumpang tindih di setiap lapisan encoder.
Fitur multi-skala dari transformer hierarkis memungkinkan model ini dengan mudah menggantikan model backbone computer vision tradisional yang umum digunakan, seperti ResNet, dalam arsitektur yang lebih besar. Baik Segformer maupun Panoptic Segformer menunjukkan bahwa konfigurasi yang menggunakan PVTv2 sebagai backbone secara konsisten melampaui kinerja konfigurasi dengan backbone ResNet yang berukuran serupa.
Fitur kuat lainnya dari PVTv2 adalah pengurangan kompleksitas pada lapisan self-attention yang disebut Spatial Reduction Attention (SRA), yang menggunakan lapisan konvolusi 2D untuk memproyeksikan hidden states ke resolusi yang lebih kecil sebelum diproses dengan query, sehingga meningkatkan kompleksitas self-attention menjadi $O(n^2/R)$, dengan sebagai rasio reduksi spasial (sr_ratio, atau dikenal sebagai ukuran kernel dan stride dalam konvolusi 2D).
SRA diperkenalkan dalam PVT, dan merupakan metode reduksi kompleksitas perhatian default yang digunakan dalam PVTv2. Namun, PVTv2 juga memperkenalkan opsi untuk menggunakan mekanisme self-attention dengan kompleksitas linear yang terkait dengan ukuran gambar, yang mereka sebut “Linear SRA”. Metode ini menggunakan average pooling untuk mengurangi hidden states menjadi ukuran tetap yang tidak bergantung pada resolusi aslinya (meskipun ini secara inheren lebih lossy daripada SRA reguler). Opsi ini dapat diaktifkan dengan mengatur linear_attention menjadi True di PVTv2Config.
Abstrak dari makalah
Transformer baru-baru ini menunjukkan kemajuan yang menjanjikan di bidang computer vision. Dalam karya ini, kami menyajikan baseline baru dengan meningkatkan Pyramid Vision Transformer (PVT v1) asli melalui penambahan tiga desain, yaitu (1) lapisan attention dengan kompleksitas linear, (2) patch embedding yang tumpang tindih, dan (3) jaringan feed-forward berbasis convolution. Dengan modifikasi ini, PVT v2 mengurangi kompleksitas komputasi PVT v1 menjadi linear dan mencapai peningkatan signifikan pada tugas-tugas vision fundamental seperti klasifikasi, deteksi, dan segmentasi. Yang patut dicatat, PVT v2 yang diusulkan mencapai performa yang setara atau lebih baik dibandingkan karya-karya terbaru seperti Swin Transformer. Kami berharap karya ini akan memfasilitasi penelitian Transformer state-of-the-art di bidang computer vision. Kode tersedia di https://github.com/whai362/PVT.
Model ini disumbangkan oleh FoamoftheSea. Kode aslinya dapat ditemukan di sini.
Tips penggunaan
PVTv2 adalah model transformer hierarkis yang telah menunjukkan kinerja yang kuat dalam klasifikasi citra dan berbagai tugas lainnya, digunakan sebagai backbone untuk segmentasi semantik di Segformer, estimasi kedalaman monokular di GLPN, dan segmentasi panoptik di Panoptic Segformer, secara konsisten menunjukkan kinerja yang lebih tinggi dibandingkan konfigurasi ResNet yang serupa.
Hierarchical transformers seperti PVTv2 mencapai efisiensi data dan parameter yang lebih unggul pada data gambar dibandingkan dengan arsitektur transformer murni, dengan mengintegrasikan elemen desain dari convolutional neural networks (CNN) ke dalam encoder mereka. Hal ini menciptakan arsitektur terbaik dari kedua dunia yang menyuntikkan bias induktif yang berguna dari CNN, seperti translation equivariance dan locality, ke dalam jaringan, sambil tetap menikmati manfaat dari respons data dinamis dan pemodelan hubungan global yang disediakan oleh mekanisme self-attention dari transformers.
PVTv2 menggunakan patch embeddings yang tumpang tindih untuk membuat peta fitur multi-skala, yang kemudian diberi informasi lokasi menggunakan zero-padding dan konvolusi depth-wise.
Untuk mengurangi kompleksitas pada lapisan attention, PVTv2 melakukan reduksi spasial pada hidden states menggunakan strided 2D convolution (SRA) atau fixed-size average pooling (Linear SRA). Meskipun secara inheren lebih lossy, Linear SRA memberikan performa yang mengesankan dengan kompleksitas linear terhadap ukuran gambar. Untuk menggunakan Linear SRA pada lapisan self-attention, setel
linear_attention=TruediPvtV2Config.PvtV2Model adalah encoder transformer hierarkis (yang juga sering disebut sebagai Mix Transformer atau MiT dalam literatur). PvtV2ForImageClassification menambahkan kepala klasifikasi sederhana di atasnya untuk melakukan Image Classification.
PvtV2Backbonedapat digunakan dengan sistem AutoBackbone dalam arsitektur yang lebih besar seperti Deformable DETR.Bobot pretrained ImageNet untuk semua ukuran model dapat ditemukan di hub.
Cara terbaik untuk memulai dengan PVTv2 adalah dengan memuat checkpoint pretrained dengan ukuran yang Anda pilih menggunakan
AutoModelForImageClassification:
import requests
import torch
from PIL import Image
from transformers import AutoImageProcessor, AutoModelForImageClassification
model = AutoModelForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0", device_map="auto")
image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))Untuk menggunakan PVTv2 sebagai backbone untuk arsitektur yang lebih kompleks seperti DeformableDETR, Anda dapat menggunakan AutoBackbone (model ini memerlukan fine-tuning karena Anda mengganti backbone pada model pretrained dan diinisialisasi dengan bobot acak):
import requests
import torch
from PIL import Image
from transformers import AutoConfig, AutoImageProcessor, AutoModelForObjectDetection
model = AutoModelForObjectDetection.from_config(
config=AutoConfig.from_pretrained(
"SenseTime/deformable-detr",
backbone_config=AutoConfig.from_pretrained("OpenGVLab/pvt_v2_b5"),
),
)
image_processor = AutoImageProcessor.from_pretrained("SenseTime/deformable-detr")
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
processed = image_processor(image)
outputs = model(torch.tensor(processed["pixel_values"]))Performa PVTv2 pada ImageNet-1K berdasarkan ukuran model (B0-B5):
| Metode | Ukuran | Acc@1 | #Parameter (Juta) |
|---|---|---|---|
| PVT-V2-B0 | 224 | 70.5 | 3.7 |
| PVT-V2-B1 | 224 | 78.7 | 14.0 |
| PVT-V2-B2-Linear | 224 | 82.1 | 22.6 |
| PVT-V2-B2 | 224 | 82.0 | 25.4 |
| PVT-V2-B3 | 224 | 83.1 | 45.2 |
| PVT-V2-B4 | 224 | 83.6 | 62.6 |
| PVT-V2-B5 | 224 | 83.8 | 82.0 |
PvtV2Config
kelas transformers.PvtV2Config
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Noneimage_size: int | list[int] | tuple[int, int] | dict = 224num_channels: int = 3num_encoder_blocks: int = 4depths: list[int] | tuple[int, ...] = (2, 2, 2, 2)sr_ratios: list[int] | tuple[int, ...] = (8, 4, 2, 1)hidden_sizes: list[int] | tuple[int, ...] = (32, 64, 160, 256)patch_sizes: list[int] | tuple[int, ...] = (7, 3, 3, 3)strides: list[int] | tuple[int, ...] = (4, 2, 2, 2)num_attention_heads: list[int] | tuple[int, ...] = (1, 2, 5, 8)mlp_ratios: list[int] | tuple[int, ...] = (8, 8, 4, 4)hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0initializer_range: float = 0.02drop_path_rate: float | int = 0.0layer_norm_eps: float = 1e-06qkv_bias: bool = Truelinear_attention: bool = False_out_features: list[str] | None = None_out_indices: list[int] | None = None )
Parameter
- image_size (
Union[int, list[int], tuple[int, int], dict], opsional, default224) — Ukuran (resolusi) dari setiap gambar. - num_channels (
int, opsional, defaultnya3) — Jumlah saluran input. - num_encoder_blocks (
[int], opsional, default 4) — Jumlah blok encoder (yaitu tahap dalam encoder Mix Transformer). - depths (
Union[list[int], tuple[int, ...]], opsional, default(2, 2, 2, 2)) — Kedalaman setiap layer dalam Transformer. - sr_ratios (
list[int], opsional, default[8, 4, 2, 1]) — Rasio reduksi spasial di setiap blok encoder. - hidden_sizes (
Union[list[int], tuple[int, ...]], opsional, default(32, 64, 160, 256)) — Dimensi (hidden size) pada setiap tahap model. - patch_sizes (
list[int], opsional, default[7, 3, 3, 3]) — Ukuran patch untuk patch embedding yang tumpang tindih sebelum setiap blok encoder. - strides (
list[int], opsional, default[4, 2, 2, 2]) — Stride untuk patch embedding yang tumpang tindih sebelum setiap blok encoder. - num_attention_heads (
list[int], opsional, default[1, 2, 5, 8]) — Jumlah attention head untuk setiap lapisan attention di setiap blok encoder Transformer. - mlp_ratios (
list[int], opsional, default[8, 8, 4, 4]) — Rasio ukuran lapisan tersembunyi dibandingkan dengan ukuran lapisan input dari Mix FFNs dalam blok encoder. - hidden_act (
str, opsional, defaultnyagelu) — Fungsi aktivasi non-linear (fungsi atau string) di decoder. Misalnya,"gelu","relu","silu", dan sebagainya. - hidden_dropout_prob (
Union[float, int], opsional, default0.0) — Probabilitas dropout untuk semua lapisan fully connected di embeddings, encoder, dan pooler. - attention_probs_dropout_prob (
Union[float, int], opsional, default0.0) — Rasio dropout untuk probabilitas perhatian. - initializer_range (
float, opsional, defaultnya0.02) — Standar deviasi dari truncated_normal_initializer untuk menginisialisasi semua matriks bobot. - drop_path_rate (
Union[float, int], opsional, defaultnya0.0) — Tingkat drop path untuk fusi patch. - layer_norm_eps (
float, opsional, defaultnya1e-06) — Epsilon yang digunakan oleh lapisan normalisasi lapisan. - qkv_bias (
bool, opsional, defaultnyaTrue) — Apakah akan menambahkan bias ke queries, keys, dan values. - linear_attention (
bool, opsional, defaultFalse) — Gunakan kompleksitas linear attention. Jika diatur ke True,sr_ratiodiabaikan dan average pooling digunakan untuk reduksi dimensi pada lapisan attention alih-alih strided convolution.
Ini adalah kelas konfigurasi untuk menyimpan konfigurasi PvtV2Model. Kelas ini digunakan untuk membuat instans model Pvt V2 berdasarkan argumen yang ditentukan, sehingga mendefinisikan arsitektur model. Membuat instans konfigurasi dengan nilai bawaan akan menghasilkan konfigurasi yang serupa dengan konfigurasi OpenGVLab/pvt_v2_b0
Objek konfigurasi mewarisi dari PreTrainedConfig dan dapat digunakan untuk mengontrol output model. Baca dokumentasi dari PreTrainedConfig untuk informasi lebih lanjut.
Contoh:
>>> from transformers import PvtV2Model, PvtV2Config
>>> # Initializing a pvt_v2_b0 style configuration
>>> configuration = PvtV2Config()
>>> # Initializing a model from the OpenGVLab/pvt_v2_b0 style configuration
>>> model = PvtV2Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configPvtForImageClassification
kelas transformers.PvtV2ForImageClassification
< source >( config: PvtV2Config )
Parameter
- config (PvtV2Config) — Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode from_pretrained() untuk memuat bobot model.
Model transformer Pvt-v2 dengan kepala klasifikasi gambar di atasnya (lapisan linear di atas keadaan tersembunyi akhir dari token [CLS]), misalnya untuk ImageNet.
Model ini mewarisi dari PreTrainedModel. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran embedding input, memangkas kepala, dll.)
Model ini juga merupakan subclass dari torch.nn.Module PyTorch. Gunakan sebagai PyTorch Module biasa dan merujuk ke dokumentasi PyTorch untuk semua hal yang berkaitan dengan penggunaan dan perilaku umum.
forward
< source >( pixel_values: typing.Optional[torch.Tensor]labels: typing.Optional[torch.Tensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → ImageClassifierOutput or tuple(torch.Tensor)
Parameter
- pixel_values (
torch.Tensordengan bentuk(batch_size, num_channels, image_size, image_size), opsional) — Tensor yang sesuai dengan gambar input. Nilai piksel dapat diperoleh menggunakan PvtImageProcessor. Lihat PvtImageProcessor.call() untuk detailnya (processor_classmenggunakan PvtImageProcessor untuk memproses gambar). - labels (
torch.LongTensordengan bentuk(batch_size,), opsional) — Label untuk menghitung loss klasifikasi/regresi gambar. Indeks harus berada dalam[0, ..., config.num_labels - 1]. Jikaconfig.num_labels == 1, loss regresi dihitung (Mean-Square loss). Jikaconfig.num_labels > 1, loss klasifikasi dihitung (Cross-Entropy). - output_attentions (
bool, opsional) — Apakah akan mengembalikan tensor attentions dari semua lapisan attention. Lihatattentionsdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - output_hidden_states (
bool, opsional) — Apakah akan mengembalikan hidden states dari semua lapisan. Lihathidden_statesdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - return_dict (
bool, opsional) — Apakah akan mengembalikan ModelOutput alih-alih tuple biasa.
Mengembalikan
ImageClassifierOutput atau tuple(torch.Tensor)
A ImageClassifierOutput atau tuple dari
torch.Tensor (jika return_dict=False dilewatkan atau ketika config.return_dict=False) yang terdiri dari berbagai
elemen tergantung pada konfigurasi (PvtV2Config) dan input.
Metode forward dari PvtV2ForImageClassification menimpa metode khusus __call__.
Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance
Modulesetelahnya alih-alih fungsi ini, karena yang pertama menangani langkah-langkah pra-pemrosesan dan pasca-pemrosesan, sedangkan yang kedua mengabaikannya secara diam-diam.
loss (
torch.Tensordengan bentuk(1,), opsional, dikembalikan saatlabelsdisediakan) — Loss klasifikasi (atau regresi jika config.num_labels==1).logits (
torch.Tensordengan bentuk(batch_size, config.num_labels)) — Skor klasifikasi (atau regresi jika config.num_labels==1) (sebelum SoftMax).hidden_states (
tuple(torch.Tensor), opsional, dikembalikan saatoutput_hidden_states=Truedilewatkan atau saatconfig.output_hidden_states=True) — Tuple daritorch.Tensor(satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap tahap) dengan bentuk(batch_size, sequence_length, hidden_size). Hidden-states (juga disebut feature maps) dari model pada output dari setiap tahap.attentions (
tuple(torch.Tensor), opsional, dikembalikan saatoutput_attentions=Truedilewatkan atau saatconfig.output_attentions=True) — Tuple daritorch.Tensor(satu untuk setiap layer) dengan bentuk(batch_size, num_heads, patch_size, sequence_length).Bobot perhatian setelah softmax perhatian, digunakan untuk menghitung rata-rata berbobot di kepala perhatian diri (self-attention).
Contoh:
>>> from transformers import AutoImageProcessor, PvtV2ForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> model = PvtV2ForImageClassification.from_pretrained("OpenGVLab/pvt_v2_b0")
>>> inputs = image_processor(image, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
...PvtModel
kelas transformers.PvtV2Model
< source >( config: PvtV2Config )
Parameter
- config (PvtV2Config) — Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode from_pretrained() untuk memuat bobot model.
Model Pvt V2 polos yang menghasilkan hidden-states mentah tanpa head spesifik di atasnya.
Model ini mewarisi dari PreTrainedModel. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran embedding input, memangkas kepala, dll.)
Model ini juga merupakan subclass dari torch.nn.Module PyTorch. Gunakan sebagai PyTorch Module biasa dan merujuk ke dokumentasi PyTorch untuk semua hal yang berkaitan dengan penggunaan dan perilaku umum.
forward
< source >( pixel_values: Tensoroutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → BaseModelOutput or tuple(torch.Tensor)
Parameter
- pixel_values (
torch.Tensordengan bentuk(batch_size, num_channels, image_size, image_size)) — Tensor yang sesuai dengan gambar input. Nilai piksel dapat diperoleh menggunakan PvtImageProcessor. Lihat PvtImageProcessor.call() untuk detailnya (processor_classmenggunakan PvtImageProcessor untuk memproses gambar). - output_attentions (
bool, opsional) — Apakah akan mengembalikan tensor attentions dari semua lapisan attention. Lihatattentionsdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - output_hidden_states (
bool, opsional) — Apakah akan mengembalikan hidden states dari semua lapisan. Lihathidden_statesdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - return_dict (
bool, opsional) — Apakah akan mengembalikan ModelOutput alih-alih tuple biasa.
Mengembalikan
BaseModelOutput atau tuple(torch.Tensor)
A BaseModelOutput atau tuple dari
torch.Tensor (jika return_dict=False dilewatkan atau ketika config.return_dict=False) yang terdiri dari berbagai
elemen tergantung pada konfigurasi (PvtV2Config) dan input.
Metode forward dari PvtV2Model menimpa metode khusus __call__.
Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance
Modulesetelahnya alih-alih fungsi ini, karena yang pertama menangani langkah-langkah pra-pemrosesan dan pasca-pemrosesan, sedangkan yang kedua mengabaikannya secara diam-diam.
last_hidden_state (
torch.Tensordengan bentuk(batch_size, sequence_length, hidden_size)) — Urutan hidden-states pada keluaran lapisan terakhir model.hidden_states (
tuple(torch.Tensor), opsional, dikembalikan saatoutput_hidden_states=Truedilewatkan atau saatconfig.output_hidden_states=True) — Tuple daritorch.Tensor(satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap lapisan) dengan bentuk(batch_size, sequence_length, hidden_size).Hidden-states model pada output setiap layer ditambah output embedding awal yang opsional.
attentions (
tuple(torch.Tensor), opsional, dikembalikan saatoutput_attentions=Truedilewatkan atau saatconfig.output_attentions=True) — Tuple daritorch.Tensor(satu untuk setiap layer) dengan bentuk(batch_size, num_heads, sequence_length, sequence_length).Bobot perhatian setelah softmax perhatian, digunakan untuk menghitung rata-rata berbobot di kepala perhatian diri (self-attention).