スポンサーリンク

【Python】オートエンコーダで画像を分類する方法ご紹介。

Keras
スポンサーリンク

今回の記事はPythonのKerasでオートエンコーダのAIモデルを作成し、画像を分類する方法をご紹介します。こちらCNNを利用したモデルは一般的に良く生地になっていますが、オートエンコーダの形式のモデルの作り方はあまり記事が内容に感じたので一度まとめて見た記事になります。是非ご参照ください。

スポンサーリンク

Pythonで機械学習を行う準備

まずはPythonで機械学習を行うための環境を準備しましょう。

いくつか方法はあります。

①Pythonをインストール
②Anacondaをインストール
③Google colabを利用する
④DockerにPython環境を用意する

①の場合はPythonをインストールするのみです。公式サイトから行って見てください。Macの方も標準で2系は入っていますが、使用するのは3系なのVersion3のものをインストールしましょう。
Pythonのインストール手順。

②は非常に簡単でAnacondaをインストールするのみです。
Anacondaインストール手順。

③も簡単でGoogle colabで環境を作ります。
Google colab登録手順。

④はローカルで作業をする場合はおすすめの方法です。
DockerでPython環境構築手順。

それぞれリンク記事を用意しておくのでそちらをご確認ください。

オートエンコーダとは?

オートエンコーダを簡単に言うと入力と出力が同じになるニューラルネットで、次元圧縮を隠れそうで行うのですが、どの次元を削除できるかと言う点から教師なし学習を行い学習モデルを作成する手順です。

詳しく知りたい方は下記記事でご紹介しているのでご確認ください。
オートエンコーダとは?

Pythonでオートエンコーダモデル作成と画像を分類する方法

コード自体は転がっているものを使用しています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
from keras import layers
from keras import models
from keras import callbacks
from keras.datasets import mnist
from matplotlib import pyplot as plt
from matplotlib import cm

def main():
    # MNIST データセットを読み込む
    (x_train, train), (x_test, y_test) = mnist.load_data()
    image_height, image_width = 28, 28
    # 中間層で圧縮される次元数
    encoding_dim = 36  # 中間層の出力を 6 x 6 の画像として可視化するため

    # Flatten
    x_train = x_train.reshape(x_train.shape[0], image_height * image_width)
    x_test = x_test.reshape(x_test.shape[0], image_height * image_width)

    # Min-Max Normalization
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train = (x_train - x_train.min()) / (x_train.max() - x_train.min())
    x_test = (x_test - x_test.min()) / (x_test.max() - x_test.min())

    # 中間層が一層だけの単純な AutoEncoder
    model = models.Sequential()
    model.add(layers.Dense(encoding_dim, activation='relu',
                           input_shape=(image_height * image_width,)))
    model.add(layers.Dense(image_height * image_width,
                           activation='sigmoid'))

    # モデルの構造を確認する
    print(model.summary())

    model.compile(optimizer='adam',
                  loss='binary_crossentropy')

    fit_callbacs = [
        callbacks.EarlyStopping(monitor='val_loss',
                                patience=5,
                                mode='min')
    ]

    # モデルを学習させる
    model.fit(x_train, x_train,
              epochs=100,
              batch_size=256,
              shuffle=True,
              validation_data=(x_test, x_test),
              callbacks=fit_callbacs,
              )

    # テストデータの損失を確認しておく
    score = model.evaluate(x_test, x_test, verbose=0)
    print('test xentropy:', score)

    # 学習済みのモデルを元に、次元圧縮だけするモデルを用意する
    encoder = models.clone_model(model)
    encoder.compile(optimizer='adam',
                    loss='binary_crossentropy')
    encoder.set_weights(model.get_weights())
    # 最終段のレイヤーを取り除く
    encoder.pop()

    # テストデータからランダムに 10 点を選び出す
    p = np.random.random_integers(0, len(x_test), 10)
    x_test_sampled = x_test[p]
    # 選びだしたサンプルを AutoEncoder にかける
    x_test_sampled_pred = model.predict_proba(x_test_sampled,
                                              verbose=0)
    # 次元圧縮だけする場合
    x_test_sampled_enc = encoder.predict_proba(x_test_sampled,
                                               verbose=0)

    # 処理結果を可視化する
    fig, axes = plt.subplots(3, 10)
    for i, label in enumerate(y_test[p]):
        # 元画像を上段に表示する
        img = x_test_sampled[i].reshape(image_height, image_width)
        axes[0][i].imshow(img, cmap=cm.gray_r)
        axes[0][i].axis('off')
        axes[0][i].set_title(label, color='red')
        # AutoEncoder で次元圧縮した画像を下段に表示する
        enc_img = x_test_sampled_enc[i].reshape(6, 6)
        axes[1][i].imshow(enc_img, cmap=cm.gray_r)
        axes[1][i].axis('off')
        # AutoEncoder で復元した画像を下段に表示する
        pred_img = x_test_sampled_pred[i].reshape(image_height, image_width)
        axes[2][i].imshow(pred_img, cmap=cm.gray_r)
        axes[2][i].axis('off')

    plt.show()


if __name__ == '__main__':
    main()

このような出力がされればモデルが作成されています。

こちらは簡単な手書き文字の判別を行なったものになりますが、このような状況ではやはりCNNの方が精度自体は高いと思われます。

次回はこのオートエンコーダモデルで実際にオリジナル画像を食わせて結果を出力させて見たいと思います。

では今回の記事は以上です。他にも多数の記事を記載しているので是非参考にして見て下さい。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

Keras
スポンサーリンク
スポンサーリンク
ともぶろぐ

コメント

タイトルとURLをコピーしました