KerasからPyTorchに乗り換えた理由: PyTorchの自由度に感動！

![Keras-or-PyTorch-1140x337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3246879/655316b4-4b13-c26a-c555-104d1b74e0ef.png)
画像引用元：https://deepsense.ai/keras-or-pytorch/

# はじめに
こんにちは！今日は僕がディープラーニングのフレームワークとして**Keras**から**PyTorch**に乗り換えた理由についてお話しします。最初はKerasのシンプルさに魅了されていたんですが、いくつかの問題に直面し、最終的にはPyTorchに移行しました。そのきっかけや、PyTorchの素晴らしい点を紹介します！


## 1. 最初はKerasの簡単さに感動！でも…。

ディープラーニングを始めた当初、**Keras**はとてもシンプルで、初心者にとって夢のようなフレームワークでした。わずか数行でモデルが作れるのは驚きでしたし、「これなら自分でもできる！」と思ったんです。

たとえば、以下のようにすぐにモデルが作れます：

```python
from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_data, train_labels, epochs=10)
```

この簡単さには本当に感動しました。Kerasを使えば、複雑なモデルでもサクサク作れてしまう！と。しかし、この「簡単さ」が後々、僕を**デバッグ地獄**に追い込むとは夢にも思いませんでした…。


## 2. デバッグが大変！Kerasの落とし穴

Kerasの最大の魅力は、その**抽象化されたAPI**であり、簡単にモデルを構築できる点です。しかし、**この抽象化が逆に問題**でした。特に複雑なカスタムレイヤーを作成した際に、その問題は明らかになりました。

### 例: カスタムレイヤーでの問題

僕はカスタムレイヤーを作り、自分のモデルに組み込もうとしました。コード自体はエラーもなく動いたのですが、なぜかモデルの出力が全く意味不明なものに…。デバッグしても、**Kerasのエラーメッセージは非常に抽象的**で、どこに問題があるのかさっぱり分からなかったんです。
コードは正しく動いているように見えるのに、出力は正しくない。エラーメッセージも**どこで何が起きているのか全く教えてくれない**ので、デバッグが非常に困難でした。


## 3. 決定的な理由: Kerasの`.h5`ファイル問題

その後、Kerasのアップデートによって、これまで保存していた**`.h5`ファイルが開かなくなる**という大きな問題に直面しました。

```python
model = tf.keras.models.load_model('model.h5')
```

プロジェクトがエラーを出し続け、以前に保存していたモデルファイルがまったく使えなくなってしまったのです。Kerasのバージョン互換性の問題が原因でしたが、この時点で僕は「**もっと柔軟で信頼できるフレームワークを探す**」決意を固めました。


## 4. PyTorchに移行：衝撃の出会い

こうして僕は、Kerasから**PyTorch**へ乗り換えることにしました。正直最初は、PyTorchのコードがKerasに比べて少し冗長に感じました。しかし、使い始めてすぐに感じたのが、**柔軟性の高さとデバッグのしやすさ**でした。

### デバッグが圧倒的に簡単

PyTorchでは、Pythonの標準デバッグツールがそのまま使えます。Kerasのように抽象化されたAPIの内部で何が起こっているのか見えにくくなることがありません。**エラーが出た場所を正確に特定し、デバッグできる**のが大きな魅力です。

```python
import torch
import torch.nn as nn

class CustomLayer(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(CustomLayer, self).__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        return self.linear(x)

model = nn.Sequential(
    CustomLayer(784, 64),
    nn.ReLU(),
    nn.Linear(64, 10)
)

# データとモデルを渡して学習
output = model(torch.randn(64, 784))
```

PyTorchでは、エラーが出た際にもその場でデバッグができ、さらに途中の出力を確認しながら進められるため、Kerasで感じたデバッグの難しさが解消されました。



## 5. PyTorchに乗り換えた理由1: Grad-CAMの実装が圧倒的に簡単

次に感動したのが、**Grad-CAM**（Gradient-weighted Class Activation Mapping）の実装がとても簡単だったことです。Grad-CAMは画像分類モデルが「どこに注目して判断を下しているか」を視覚的に確認できる技術で、Kerasで試みた際には計算グラフへのアクセスが非常に難しかったです。

しかし、PyTorchでは計算グラフに簡単にアクセスできるため、Grad-CAMの実装がスムーズに進みました。以下はその実装例です：

```python
import torch
import torch.nn as nn
from torchvision import models

# 事前学習済みのResNet50を使う
model = models.resnet50(pretrained=True)

# 勾配を保存するためのフックを登録
gradients = None
def save_gradients(grad):
    global gradients
    gradients = grad

# 最後の畳み込み層にフックをかける
target_layer = model.layer4[2].conv3
target_layer.register_backward_hook(save_gradients)
```

PyTorchでは、**わずかなコードで計算グラフにアクセス可能**で、Grad-CAMの実装もとても簡単です。この柔軟性とデバッグのしやすさが、Kerasにはない大きな利点です。


## 6. PyTorchに乗り換えた理由2: 転移学習にはtimmライブラリが最強

さらに僕がPyTorchに感動したのが、**timmライブラリ**の存在です。timmは、最新の事前学習済みモデルが豊富に揃っていて、**転移学習**が非常に簡単に行えるライブラリです。

Kerasでも転移学習は可能ですが、timmの使い勝手は圧倒的でした。以下のコードで簡単にEfficientNetを使って転移学習が行えます。

```python
import timm

# 事前学習済みのEfficientNetをロード
model = timm.create_model('efficientnet_b0', pretrained=True)
model.eval()
```

たった数行でEfficientNetのような強力なモデルを利用できるのは非常に便利です。**最新の研究成果をすぐに試せる**という点で、timmは研究者やエンジニアにとって頼もしいツールです。

## Keras vs PyTorch: 比較まとめ

### **Kerasの良い点**
- **簡単で直感的なAPI**：初心者でも数行のコードでモデルが作れる。
- **すぐに使える高レベルの抽象化**：基本的なモデルならすぐに動かせる。

### **PyTorchの良い点**
- **Grad-CAMの実装が容易**：モデルの解釈を簡単に行える。
- **timmライブラリによる強力な転移学習**：最新のモデルが数行で使え、転移学習が非常にシンプル。
- **デバッグが簡単**：エラーが発生しても、どこで何が起きているのか追跡しやすい。

僕自身、Kerasの便利さに最初は惹かれていましたが、最終的に**柔軟性やデバッグのしやすさ**を重視して**PyTorchに乗り換える決断をしました**。PyTorchのGrad-CAMやtimmライブラリを活用することで、より深くモデルを理解し、効率よく実験を進められるようになったのが大きなポイントです。


## 最後に
Kerasも素晴らしいツールですが、**特に複雑なモデルの解釈や転移学習が必要なシーン**では、PyTorchがとても強力です。もし、今Kerasを使っていて「もう少し深くモデルに踏み込みたい」「デバッグをしやすくしたい」と思っているなら、ぜひPyTorchを試してみてください！