目次
概要
Auto Encoder について解説し、Pytorch Lightning を使用した実装例を紹介します。
Auto Encoder
オートエンコーダ (Auto Encoder) はラベル付けされていないデータの特徴量表現を学習するためのニューラルネットワークの一種です。
Auto Encoder は、入力を特徴量に変換したのち、その特徴量から再び、入力と同じ画像を生成できるように学習します。特徴量の次元は入力データより小さいので、学習が上手くいった場合は、もとのデータを表現可能な特徴量を学習できたことになります。
手順
1. 必要なモジュールを import する
In [1]:
2. LightningDataModule を作成する
今回は入力データに MNIST を使用します。
In [2]:
3. LightningModule を作成する
LightningModule にモデルや各処理を定義します。 モデルの構造ですが、
- 784次元の入力層
- 64次元の全結合層
- ReLU
- 32次元の全結合層
- 64次元の全結合層
- ReLU
- 784次元の全結合層
となっており、入力画像と同じ画像を出力することが学習の目標なので、入力画像と出力画像の差異を mse_loss()
で計算します。
In [3]:
4. 学習途中の生成結果を画像化するコールバック関数を作成する
AutoEncoder の学習過程の生成結果を画像化するコールバック関数を作成します。
- 生成する枚数を torch.utils.data.DataLoader() のバッチサイズに指定し、検証用のデータセットから画像を取得します。
- (N, C, H, W) -> (N, C H W) に形状を変更します。
- Auto Encoder に入力し、画像を生成します。
- (N, C H W) -> (N, C, H, W) に形状を変更します。
- torchvision.utils.make_grid() で画像を結合します。
- torchvision.utils.save_image() で画像を保存します。
[blogcard url=”https://pystyle.info/pytorch-make-grid”]
In [4]:
5. Trainer を作成して、学習する
In [5]:
GPU available: True, used: True
TPU available: False, using: 0 TPU cores
IPU available: False, using: 0 IPUs
LOCAL_RANK: 0 – CUDA_VISIBLE_DEVICES: [0]
| Name | Type | Params
—————————————
0 | encoder | Sequential | 52.3 K
1 | decoder | Sequential | 53.1 K
—————————————
105 K Trainable params
0 Non-trainable params
105 K Total params
0.422 Total estimated model params size (MB)
genereated
ディレクトリに学習途中の生成画像の例が保存されます。

Auto Encoder で次元削減
学習した Auto Encoder の Encoder で抽出した特徴量を使って、学習してみます。
- 学習した Auto Encoder の Encoder で (784,) -> (32,) に次元削減する
- SVM で学習する
- 精度を計算する
In [6]:
In [7]:
accuracy: 92.70%
784次元の入力データを32次元に削減しても精度が出ているので、Encoder によって次元削減が上手く行えていることがわかりました。
コメント