# 【入門】Vision Transformerについてわかりやすく解説！Pythonで画像分類実装！

> 当サイト【スタビジ】の本記事では、Googleが2021年に発表し話題になった画像認識AIのVision Transformerについて解説していきます！2017年に発表されたTransformerのアーキテクチャをベースに画像認識に応用された手法！アーキテクチャ・性能・Pythonでの実装方法を見ていきましょう！

- URL: https://toukei-lab.com/vision-transformer
- 公開: 2023.09.27 / 更新: 2025.08.18
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、Googleが2021年に発表し話題になった画像認識AIのVision Transformerについて解説していきます！2017年に発表されたTransformerのアーキテクチャをベースに画像認識に応用された手法！アーキテクチャ・性能・Pythonでの実装方法を見ていきましょう！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

この記事では、Transformerを画像認識の世界に応用した手法であるVision Transformerについて解説していきます！

<mark>昨今様々なAI手法が登場して玉石混交状態になっていますが、各時代に注目されてきた主要な手法はおさえておくとよいでしょう！</mark>

Vision Transformerは論文発表時点でSOTA（State-of-the-Art※特定評価軸で最高評価）を獲得した手法なのです。

見ていきましょう！

以下の動画でもわかりやすく解説していますのであわせてチェックしてみてください！

::youtube{#YLKYadQeG3g}

## Vision Transformerとは？

Vision Transformer(ViT)とは2021年にGoogleから発表された[画像認識](/python-image)用の[transformer](/transformer)です。

論文は以下です。

:::box
[AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE](https://arxiv.org/pdf/2010.11929.pdf)
:::

transformerは2017年にGoogleから発表され、従来のリカレント層などを使わず**Attention層だけを使い**高い精度を達成しました。

このtransformerのアーキテクチャを元に[自然言語処理](/natural-language-python)ではなく画像認識の領域に応用したのがVision Transformerなのです。

transformerについて詳しくは以下の記事にまとめていますので是非チェックしてみてください！

<https://toukei-lab.com/transformer>

それでは実際にVision Transformerがどんな手法なのか見ていきましょう！

論文からアーキテクチャを拝借しちゃいましょう！

Vision Transformerは以下のようなアーキテクチャになっています。

![vision transformer](/wp-content/uploads/2023/09/1a59fab5aaf6697a564c94b0484ca787.png)

非常にシンプルでほぼTransformerのアーキテクチャと変わりません。

一応以下がTransformerの論文に記載されているアーキテクチャです。

![Transformer](/wp-content/uploads/2023/03/Transformer2.jpg)

Transformerでは文章を分かち書きしたもの（例：私 / は / 猫 / を / 飼っている）をエンコーダーに入れておりましたが、画像認識では画像を分割したもの（Patch）をエンコーダーに投入しています。

:::box
**少し表現が違うのですが、Vision Transformerも元祖transformerもどちらも入力をEmbedding（ベクトル化）して位置関係を考慮（Position Encoding / Position Embedding）してMulti Attention層と正規化と通常の多層パーセプトロン（MLP / Feed Forward）の組み合わせでアーキテクチャが構築されています。**
:::

<mark>位置関係を考慮してる部分はそれぞれVision TransformerではPosition Encoding 、Transoformerでは Position Embeddingと表現されているのが分かりますね！</mark>

また、Vision TransoformerのMLPは多層パーセプトロンを表現しており、Transoformerのアーキテクチャの中だとFeed Forwardにあたります。

順番が前後しているところはありますが、大枠はどちらも変わっていないことが分かるでしょう！

## Vision Transformerのパフォーマンス

それでは続いてVision Transformerのパフォーマンスについて見ていきましょう！

![vision Transformer](/wp-content/uploads/2023/09/6f3df76ab482d1bc0df6099eb74f7cdb.png)

様々な画像データセットで各手法の精度を比較した結果が掲載されています。

ちなみに[ImageNet](/imagenet)は画像データセットの中でも非常に古くから使用されている有名なデータセットです。

これを画像分類の識別精度を表しており、100%に近ければ近いほど良いスコアとなります。

<mark>結果を見るとViT（Vision Transformer）-H/14のモデルがほとんどのデータセットで最高評価を出力していることが分かります。</mark>

H/14やL/16というのはモデルのバリエーションを表しており、HがHuge、LがLargeで以下のような違いがあります。

![vision Transformer](/wp-content/uploads/2023/09/a0fd09c9578400c6f8e2cbf8c9ef313a.png)

<mark>シンプルにHugeの方がモデルが複雑になっているので計算量は多くなりますが精度は高くなりますね。</mark>

また14, 16はPatch Sizeのことで、1枚の画像をPatch Sizeに分割してモデルにインプットするので小さい方が細部を学習してモデルの精度が上がると考えられます。

## Vision Transformerを実装

それでは簡易的にVision TransformerをPythonで実装していきましょう！

今回は[Google Colab](/google-colaboratory)を使っていきます。

事前にランタイムのタイプをGPUにしておいてください。

![Google Colab版Stable Diffusionの立ち上げ方法から使い方までを徹底解説！ | romptn Magazine](https://romptn.com/article/wp-content/uploads/2023/08/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-316.png)

必要なライブラリをインポートしていきます。

```python
import torch
from vit_pytorch import ViT
from torchvision import transforms
from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader, Subset
import numpy as np
```

[Pytorch](/pytorch)のライブラリを使っていきます。

続いて、データの前処理とデータセットの準備を行っていきます。

```python
# データの前処理とデータセットの準備
transform = transforms.Compose([
    transforms.Resize((32, 32)),
    transforms.ToTensor(),
])

train_dataset = CIFAR10(root='./data', train=True, transform=transform, download=True)
indices = np.random.choice(len(train_dataset), size=5000, replace=False)
train_subset = Subset(train_dataset, indices)
train_loader = DataLoader(train_subset, batch_size=32, shuffle=True)
```

ここでは「CIFAR10」というデータセットを利用していきます。CIFAR10は比較的小規模な画像データセットです。

ただそれでも学習するには時間がかかるのでここでは5000枚ランダムサンプリングして学習していきます。

続いてモデルの定義です。

学習にかかる時間を早めるため小さいモデルで定義します。

```python
model = ViT(
    image_size=32,
    patch_size=8,
    num_classes=10,
    dim=128,
    depth=3,
    heads=2,
    mlp_dim=256,
)

# 損失関数と最適化手法の定義
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
```

パラメータは以下の通りです。

:::box
image_size: 入力画像のサイズ。\
patch_size: 画像をどのサイズのパッチに分割するか。\
num_classes: 分類するクラスの数。\
dim: 埋め込みの次元数。\
depth: Transformer ブロックの数。\
heads: Transformer 内の multi-head attention のヘッド数。\
mlp_dim: Transformer 内のMLPの次元数。
:::

また、[損失関数](/loss-function)と最適化手法の定義をしています。

CrossEntropyLoss は、クラス分類タスクにおける標準的な損失関数です。

Adam は最適化アルゴリズムの一つで、ここでは学習率を 0.001 に設定しています。

続いて実際に学習を進めていきます。

エポック数は10回と少なめにしています。

```python
# 学習ループ
num_epochs = 10
for epoch in range(num_epochs):
    model.train()
    for batch_idx, (data, targets) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(data)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

        if batch_idx % 10 == 0:
            print(f"Epoch {epoch}/{num_epochs} - Batch {batch_idx}/{len(train_loader)} - Loss: {loss.item()}")
```

結果は、、、38.7%となりました。10個の多クラス分類ですが、それでも低い精度。

<mark>今回はテスト実装ということでなるべく早く実行するためにCIFAR10という小規模なデータセットから5000個ランダムサンプリングし、モデルも小規模にしたのでこのような精度になりましたが、もっと大規模データセットを使って複雑なモデルで学習すれば精度が高くなるはずです！</mark>

興味のある方は試してみてください！

## Vision Transformer　まとめ

ここまでご覧いただきありがとうございました！

本記事では、Vision Transformerについて解説してきました。

transformerの登場でAI業界に大きなブレークスルーが起き、そこから日々さらなる進化を遂げています。

最新の生成系AIについて知りたいという方はぜひ[スタビジアカデミー](https://toukei-lab.com/achademy/)の大規模言語モデル・生成系AIコースを覗いてみてください！

:::box
[スタビジアカデミー：大規模言語モデル（LLM）・生成系AIコース](https://toukei-lab.com/achademy/courses/llm/)
:::

[「スタアカ（スタビジアカデミー）」](https://toukei-lab.com/achademy/)は当メディアが運営するAI特化の教育サービス。興味のある方はチェックしてみてください！

:::box
**AIデータサイエンス特化スクール「スタアカ」**

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)
:::

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}