# SwiftFormer

## Ikhtisar

Model SwiftFormer diusulkan dalam [SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications](https://huggingface.co/papers/2303.15446) oleh Abdelrahman Shaker, Muhammad Maaz, Hanoona Rasheed, Salman Khan, Ming-Hsuan Yang, Fahad Shahbaz Khan.

Paper SwiftFormer memperkenalkan mekanisme atensi aditif efisien yang baru, yang secara efektif menggantikan operasi perkalian matriks kuadratik dalam komputasi self-attention dengan perkalian element-wise linier. Serangkaian model yang disebut 'SwiftFormer' dibangun berdasarkan hal ini, yang mencapai kinerja state-of-the-art dalam hal akurasi dan kecepatan inferensi mobile. Bahkan varian kecil mereka mencapai akurasi top-1 ImageNet1K 78,5% dengan latensi hanya 0,8 ms di iPhone 14, yang lebih akurat dan 2× lebih cepat dibandingkan MobileViT-v2.

Abstrak dari makalah tersebut adalah sebagai berikut:

*Self-attention telah menjadi pilihan defacto untuk menangkap konteks global dalam berbagai aplikasi visi. Namun, kompleksitas komputasi kuadratisnya terhadap resolusi gambar membatasi penggunaannya dalam aplikasi real-time, terutama untuk deployment pada perangkat mobile dengan sumber daya terbatas. Meskipun pendekatan hibrida telah diusulkan untuk menggabungkan keunggulan konvolusi dan self-attention demi trade-off kecepatan-akurasi yang lebih baik, operasi perkalian matriks yang mahal dalam self-attention tetap menjadi bottleneck. Dalam karya ini, kami memperkenalkan mekanisme additive attention efisien yang baru, yang secara efektif menggantikan operasi perkalian matriks kuadratis dengan perkalian element-wise linier. Desain kami menunjukkan bahwa interaksi key-value dapat digantikan dengan lapisan linier tanpa mengorbankan akurasi. Berbeda dengan metode state-of-the-art sebelumnya, formulasi self-attention yang efisien memungkinkan penggunaannya di semua tahap jaringan. Dengan menggunakan additive attention efisien yang kami usulkan, kami membangun serangkaian model yang disebut "SwiftFormer" yang mencapai kinerja state-of-the-art dalam hal akurasi dan kecepatan inferensi mobile. Varian kecil kami mencapai akurasi top-1 ImageNet-1K sebesar 78,5% dengan latensi hanya 0,8 ms di iPhone 14, yang lebih akurat dan 2x lebih cepat dibandingkan MobileViT-v2.*

Model ini disumbangkan oleh [shehan97](https://huggingface.co/shehan97). Kode aslinya dapat ditemukan [di sini](https://github.com/Amshaker/SwiftFormer).

## SwiftFormerConfig[[transformers.SwiftFormerConfig]]

#### transformers.SwiftFormerConfig[[transformers.SwiftFormerConfig]]

```python
transformers.SwiftFormerConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, image_size: int | list[int] | tuple[int, int] = 224, num_channels: int = 3, depths: list[int] | tuple[int, ...] = (3, 3, 6, 4), embed_dims: list[int] | tuple[int, ...] = (48, 56, 112, 220), mlp_ratio: int = 4, downsamples: list[bool] | tuple[bool, ...] = (True, True, True, True), hidden_act: str = 'gelu', down_patch_size: int | list[int] | tuple[int, int] = 3, down_stride: int = 2, down_pad: int = 1, drop_path_rate: float | int = 0.0, drop_mlp_rate: float | int = 0.0, drop_conv_encoder_rate: float | int = 0.0, use_layer_scale: bool = True, layer_scale_init_value: float = 1e-05, batch_norm_eps: float = 1e-05)
```

[Sumber](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/swiftformer/configuration_swiftformer.py#L24)

**Parameter:**

image_size (`Union[int, list[int], tuple[int, int]]`, *opsional*, defaultnya `224`) : Ukuran (resolusi) dari setiap gambar.

num_channels (`int`, *opsional*, default `3`) : Jumlah saluran input.

depths (`Union[list[int], tuple[int, ...]]`, *opsional*, defaultnya `(3, 3, 6, 4)`) : Kedalaman setiap lapisan dalam Transformer.

embed_dims (`list[int]`, *opsional*, defaultnya `[48, 56, 112, 220]`) : Dimensi embedding di setiap tahap

mlp_ratio (`int`, *opsional*, defaultnya `4`) : Rasio dimensi tersembunyi MLP terhadap dimensi embedding.

downsamples (`list[bool]`, *opsional*, defaultnya `[True, True, True, True]`) : Apakah akan melakukan downsampling input di antara dua tahap.

hidden_act (`str`, *opsional*, defaultnya `gelu`) : Fungsi aktivasi non-linear (fungsi atau string) di decoder. Misalnya, `"gelu"`, `"relu"`, `"silu"`, dan sebagainya.

down_patch_size (`int`, *opsional*, defaultnya 3) : Ukuran patch pada lapisan downsampling.

down_stride (`int`, *opsional*, defaultnya 2) : Stride dari kernel konvolusi pada lapisan downsampling.

down_pad (`int`, *opsional*, default 1) : Padding pada lapisan downsampling.

drop_path_rate (`Union[float, int]`, *opsional*, defaultnya `0.0`) : Tingkat drop path untuk fusi patch.

drop_mlp_rate (`float`, *opsional*, default 0.0) : Tingkat dropout untuk komponen MLP dari SwiftFormer.

drop_conv_encoder_rate (`float`, *opsional*, default 0.0) : Tingkat dropout untuk komponen ConvEncoder dari SwiftFormer.

use_layer_scale (`bool`, *opsional*, defaultnya `True`) : Apakah akan menskalakan output dari token mixers.

layer_scale_init_value (`float`, *opsional*, default `1e-05`) : Skala yang digunakan pada lapisan self-attention. 0.1 untuk base, 1e-6 untuk large. Setel 0 untuk menonaktifkan layer scale.

batch_norm_eps (`float`, *opsional*, defaultnya `1e-05`) : Epsilon yang digunakan oleh lapisan normalisasi batch.

Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari SwiftFormerModel. Kelas ini digunakan untuk membuat instans model Swiftformer sesuai dengan argumen yang ditentukan, yang mendefinisikan arsitektur model. Membuat instans konfigurasi dengan nilai bawaan akan menghasilkan konfigurasi yang serupa dengan konfigurasi dari [MBZUAI/swiftformer-xs](https://huggingface.co/MBZUAI/swiftformer-xs)

Objek konfigurasi mewarisi dari [PreTrainedConfig](/docs/transformers/v5.23.0/id/main_classes/configuration#transformers.PreTrainedConfig) dan dapat digunakan untuk mengontrol keluaran model. Baca dokumentasi dari [PreTrainedConfig](/docs/transformers/v5.23.0/id/main_classes/configuration#transformers.PreTrainedConfig) untuk informasi lebih lanjut.

Contoh:

```python
>>> from transformers import SwiftFormerConfig, SwiftFormerModel

>>> # Initializing a SwiftFormer swiftformer-base-patch16-224 style configuration
>>> configuration = SwiftFormerConfig()

>>> # Initializing a model (with random weights) from the swiftformer-base-patch16-224 style configuration
>>> model = SwiftFormerModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

## SwiftFormerModel[[transformers.SwiftFormerModel]]

#### transformers.SwiftFormerModel[[transformers.SwiftFormerModel]]

```python
transformers.SwiftFormerModel(config: SwiftFormerConfig)
```

[Sumber](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/swiftformer/modeling_swiftformer.py#L405)

**Parameter:**

config ([SwiftFormerConfig](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerConfig)) : Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode [from_pretrained()](/docs/transformers/v5.23.0/id/main_classes/model#transformers.PreTrainedModel.from_pretrained) untuk memuat bobot model.

Model Swiftformer polos yang menghasilkan hidden-states mentah tanpa head spesifik di atasnya.

Model ini mewarisi dari [PreTrainedModel](/docs/transformers/v5.23.0/id/main_classes/model#transformers.PreTrainedModel). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka ini untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran input embeddings, memangkas heads, dll.)

Model ini juga merupakan subclass dari [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#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[[transformers.SwiftFormerModel.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Sumber](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/swiftformer/modeling_swiftformer.py#L416)

**Parameter:**

pixel_values (`torch.Tensor` dengan bentuk `(batch_size, num_channels, image_size, image_size)`, *opsional*) : Tensor yang sesuai dengan gambar input. Nilai piksel dapat diperoleh menggunakan [ViTImageProcessor](/docs/transformers/v5.23.0/id/model_doc/vit#transformers.ViTImageProcessor). Lihat [ViTImageProcessor.__call__()](/docs/transformers/v5.23.0/id/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) untuk detailnya (`processor_class` menggunakan [ViTImageProcessor](/docs/transformers/v5.23.0/id/model_doc/vit#transformers.ViTImageProcessor) untuk memproses gambar).

output_hidden_states (`bool`, *opsional*) : Apakah akan mengembalikan hidden states dari semua lapisan. Lihat `hidden_states` di bawah tensor yang dikembalikan untuk detail lebih lanjut.

return_dict (`bool`, *opsional*) : Apakah akan mengembalikan [ModelOutput](/docs/transformers/v5.23.0/id/main_classes/output#transformers.utils.ModelOutput) alih-alih tuple biasa.

**Mengembalikan:** `BaseModelOutputWithNoAttention` atau `tuple(torch.Tensor)`

`BaseModelOutputWithNoAttention` atau tuple dari `torch.Tensor` (jika `return_dict=False` dilewatkan atau ketika `config.return_dict=False`) yang terdiri dari berbagai elemen tergantung pada konfigurasi ([SwiftFormerConfig](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerConfig)) dan input.

Metode forward dari [SwiftFormerModel](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerModel) menimpa metode khusus `__call__`.

Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance `Module` setelahnya 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.Tensor` dengan bentuk `(batch_size, num_channels, height, width)`) -- Urutan hidden-state pada keluaran lapisan terakhir model.
- **hidden_states** (`tuple(torch.Tensor)`, *opsional*, dikembalikan ketika `output_hidden_states=True` dilewatkan atau ketika `config.output_hidden_states=True`) -- Tuple dari `torch.Tensor` (satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap lapisan) dengan bentuk `(batch_size, num_channels, height, width)`.

  Hidden-states model pada output setiap layer ditambah output embedding awal yang opsional.

Contoh:

```python
```

## SwiftFormerForImageClassification[[transformers.SwiftFormerForImageClassification]]

#### transformers.SwiftFormerForImageClassification[[transformers.SwiftFormerForImageClassification]]

```python
transformers.SwiftFormerForImageClassification(config: SwiftFormerConfig)
```

[Sumber](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/swiftformer/modeling_swiftformer.py#L449)

**Parameter:**

config ([SwiftFormerConfig](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerConfig)) : Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode [from_pretrained()](/docs/transformers/v5.23.0/id/main_classes/model#transformers.PreTrainedModel.from_pretrained) untuk memuat bobot model.

Model Swiftformer dengan kepala klasifikasi gambar di bagian atas, misalnya untuk ImageNet.

Model ini mewarisi dari [PreTrainedModel](/docs/transformers/v5.23.0/id/main_classes/model#transformers.PreTrainedModel). Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka ini untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran input embeddings, memangkas heads, dll.)

Model ini juga merupakan subclass dari [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#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[[transformers.SwiftFormerForImageClassification.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, labels: typing.Optional[torch.Tensor] = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Sumber](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/swiftformer/modeling_swiftformer.py#L466)

**Parameter:**

pixel_values (`torch.Tensor` dengan bentuk `(batch_size, num_channels, image_size, image_size)`, *opsional*) : Tensor yang sesuai dengan gambar input. Nilai piksel dapat diperoleh menggunakan [ViTImageProcessor](/docs/transformers/v5.23.0/id/model_doc/vit#transformers.ViTImageProcessor). Lihat [ViTImageProcessor.__call__()](/docs/transformers/v5.23.0/id/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) untuk detailnya (`processor_class` menggunakan [ViTImageProcessor](/docs/transformers/v5.23.0/id/model_doc/vit#transformers.ViTImageProcessor) untuk memproses gambar).

labels (`torch.LongTensor` dengan bentuk `(batch_size,)`, *opsional*) : Label untuk menghitung loss klasifikasi/regresi gambar. Indeks harus berada dalam `[0, ..., config.num_labels - 1]`. Jika `config.num_labels == 1`, loss regresi dihitung (Mean-Square loss). Jika `config.num_labels > 1`, loss klasifikasi dihitung (Cross-Entropy).

output_hidden_states (`bool`, *opsional*) : Apakah akan mengembalikan hidden states dari semua lapisan. Lihat `hidden_states` di bawah tensor yang dikembalikan untuk detail lebih lanjut.

return_dict (`bool`, *opsional*) : Apakah akan mengembalikan [ModelOutput](/docs/transformers/v5.23.0/id/main_classes/output#transformers.utils.ModelOutput) alih-alih tuple biasa.

**Mengembalikan:** [ImageClassifierOutputWithNoAttention](/docs/transformers/v5.23.0/id/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) atau `tuple(torch.Tensor)`

A [ImageClassifierOutputWithNoAttention](/docs/transformers/v5.23.0/id/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) atau tuple dari `torch.Tensor` (jika `return_dict=False` dilewatkan atau ketika `config.return_dict=False`) yang terdiri dari berbagai elemen tergantung pada konfigurasi ([SwiftFormerConfig](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerConfig)) dan input.

Metode forward dari [SwiftFormerForImageClassification](/docs/transformers/v5.23.0/id/model_doc/swiftformer#transformers.SwiftFormerForImageClassification) menimpa metode khusus `__call__`.

Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance `Module` setelahnya alih-alih fungsi ini, karena yang pertama menangani langkah-langkah pra-pemrosesan dan pasca-pemrosesan, sedangkan yang kedua mengabaikannya secara diam-diam.

- **loss** (`torch.Tensor` dengan bentuk `(1,)`, *opsional*, dikembalikan saat `labels` disediakan) -- Loss klasifikasi (atau regresi jika config.num_labels==1).
- **logits** (`torch.Tensor` dengan bentuk `(batch_size, config.num_labels)`) -- Skor klasifikasi (atau regresi jika config.num_labels==1) (sebelum SoftMax).
- **hidden_states** (`tuple(torch.Tensor)`, *opsional*, dikembalikan ketika `output_hidden_states=True` dilewatkan atau ketika `config.output_hidden_states=True`) -- Tuple dari `torch.Tensor` (satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap tahap) dengan bentuk `(batch_size, num_channels, height, width)`. Hidden-states (juga disebut feature maps) dari model pada output dari setiap tahap.

Contoh:

```python
>>> from transformers import AutoImageProcessor, SwiftFormerForImageClassification
>>> import torch
>>> from datasets import load_dataset

>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]

>>> image_processor = AutoImageProcessor.from_pretrained("MBZUAI/swiftformer-xs")
>>> model = SwiftFormerForImageClassification.from_pretrained("MBZUAI/swiftformer-xs")

>>> 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])
...
```

