Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python(TensorFlow・Keras)でエンコーダーとデコーダーを使ってオートエンコーダーを構築する方法

TensorFlowは、Googleが提供する機械学習フレームワークです。オープンソースとして公開されており、Pythonと組み合わせて、アルゴリズムの実装やディープラーニングアプリケーションの開発など、幅広い用途に活用できます。研究目的から本番環境での運用まで、多くの場面で採用されている信頼性の高いフレームワークです。

Windows環境に「tensorflow」パッケージをインストールするには、以下のコマンドを実行します。

pip install tensorflow

TensorFlowとテンソルの基本

テンソル(Tensor)は、TensorFlowで使われる基本的なデータ構造です。データフローグラフと呼ばれる計算グラフの各ノード(辺)をつなぐ役割を担います。テンソルは、多次元配列やリストと考えると分かりやすいでしょう。

Kerasとは何か

Kerasは、ONEIROSプロジェクト(Open ended Neuro-Electronic Intelligent Robot Operating System)の研究の一環として開発された、Pythonで書かれたディープラーニングAPIです。高レベルAPIとして設計されており、生産性の高いインターフェースを通じて機械学習の問題を効率的に解決できるのが特徴です。KerasはTensorFlowフレームワーク上で動作し、素早く実験を行えるよう、機械学習ソリューションの開発に不可欠な抽象化機能やビルディングブロックを提供します。

KerasはTensorFlowパッケージにすでに含まれているため、以下のようにインポートするだけで利用できます。

import tensorflow
from tensorflow import keras

Keras関数型API(Functional API)の特徴

Kerasの関数型APIを使うと、Sequential APIで作成したモデルよりも柔軟なモデルを構築できます。非線形トポロジーを持つモデルにも対応でき、レイヤーの共有や複数の入出力を持つモデルも扱えます。

一般的にディープラーニングモデルは、複数のレイヤーからなる有向非巡回グラフ(DAG)として表現されます。関数型APIは、このレイヤーグラフの構築を容易にするツールなのです。

以下のコードはGoogle Colaboratoryで実行しています。Google Colabを使うと、ブラウザ上でPythonコードを実行でき、環境構築は不要でGPUにも無料でアクセスできます。ColaboratoryはJupyter Notebookをベースに構築されています。

サンプルコード:エンコーダーとデコーダーによるオートエンコーダーの構築

それでは、エンコーダーとデコーダーを組み合わせてオートエンコーダーを生成するコードを見てみましょう。

encoder_input = keras.Input(shape=(28, 28, 1), name="img")
print("Adding layers to the model")
x = layers.Conv2D(16, 3, activation="relu")(encoder_input)
x = layers.Conv2D(32, 3, activation="relu")(x)
x = layers.MaxPooling2D(3)(x)
x = layers.Conv2D(32, 3, activation="relu")(x)
x = layers.Conv2D(16, 3, activation="relu")(x)
print("Performing global max pooling")
encoder_output = layers.GlobalMaxPooling2D()(x)
print("Creating a model using the layers")
encoder = keras.Model(encoder_input, encoder_output, name="encoder")
print("More information about the model")
encoder.summary()

print("Reshaping the layers in the model")
x = layers.Reshape((4, 4, 1))(encoder_output)
x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
x = layers.Conv2DTranspose(32, 3, activation="relu")(x)
x = layers.UpSampling2D(3)(x)
x = layers.Conv2DTranspose(16, 3, activation="relu")(x)
decoder_output = layers.Conv2DTranspose(1, 3, activation="relu")(x)

autoencoder = keras.Model(encoder_input, decoder_output, name="autoencoder")
print("More information about the autoencoder")
autoencoder.summary()

コード引用元:
https://www.tensorflow.org/guide/keras/functional

実行結果

Adding layers to the model
Performing global max pooling
Creating a model using the layers
More information about the model
Model: "encoder"
_________________________________________________________________
Layer (type)                Output Shape              Param #
=================================================================
img (InputLayer)            [(None, 28, 28, 1)]       0
_________________________________________________________________
conv2d (Conv2D)             (None, 26, 26, 16)        160
_________________________________________________________________
conv2d_1 (Conv2D)           (None, 24, 24, 32)        4640
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 8, 8, 32)         0
_________________________________________________________________
conv2d_2 (Conv2D)           (None, 6, 6, 32)          9248
_________________________________________________________________
conv2d_3 (Conv2D)           (None, 4, 4, 16)          4624
_________________________________________________________________
global_max_pooling2d (Global (None, 16)               0
=================================================================
Total params: 18,672
Trainable params: 18,672
Non-trainable params: 0
_________________________________________________________________
Reshaping the layers in the model
More information about the autoencoder
Model: "autoencoder"
_________________________________________________________________
Layer (type)                Output Shape              Param #
=================================================================
img (InputLayer)            [(None, 28, 28, 1)]       0
_________________________________________________________________
conv2d (Conv2D)             (None, 26, 26, 16)        160
_________________________________________________________________
conv2d_1 (Conv2D)           (None, 24, 24, 32)        4640
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 8, 8, 32)         0
_________________________________________________________________
conv2d_2 (Conv2D)           (None, 6, 6, 32)          9248
_________________________________________________________________
conv2d_3 (Conv2D)           (None, 4, 4, 16)          4624
_________________________________________________________________
global_max_pooling2d (Global (None, 16)               0
_________________________________________________________________
reshape (Reshape)           (None, 4, 4, 1)           0
_________________________________________________________________
conv2d_transpose (Conv2DTran (None, 6, 6, 16)         160
_________________________________________________________________
conv2d_transpose_1 (Conv2DTr (None, 8, 8, 32)         4640
_________________________________________________________________
up_sampling2d (UpSampling2D) (None, 24, 24, 32)       0
_________________________________________________________________
conv2d_transpose_2 (Conv2DTr (None, 26, 26, 16)       4624
_________________________________________________________________
conv2d_transpose_3 (Conv2DTr (None, 28, 28, 1)        145
=================================================================
Total params: 28,241
Trainable params: 28,241
Non-trainable params: 0
_________________________________________________________________

コードの解説

  • まず、モデルにレイヤーを追加していきます。
  • 追加したレイヤーに対してグローバル最大プーリング(Global Max Pooling)を実行します。
  • これらのレイヤーを使ってモデルを作成します。
  • 「summary」メソッドを呼び出すことで、モデルの詳細情報を確認できます。
  • 関数型APIでは、レイヤーグラフの入力と出力を指定してモデルを構築します。
  • つまり、1つのレイヤーグラフから複数のモデルを生成できるということです。
  • この例では、同じレイヤースタックを使って2つのモデルをインスタンス化しています。1つは画像入力を16次元のベクトルへ変換する「エンコーダー」、もう1つは学習に使用する「オートエンコーダー」です。
  1. BokehとPythonを使って垂直棒グラフを可視化する方法

    Bokehは、データの可視化を支援するためのPythonパッケージであり、オープンソースプロジェクトとして公開されています。BokehはHTMLとJavaScriptを使ってプロットを描画するため、Webベースのダッシュボードを作成する際に特に有用です。BokehはNumPyやPandasなど、他のPythonパッケージと簡単に組み合わせて使用でき、インタラクティブなプロットやダッシュボードなどを生成することができます。BokehはデータソースをJSONファイルに変換します。このJSONファイルは、JavaScriptライブラリであるBokehJSへの入力として使われます。BokehJSはTy

  2. PythonとMatplotlibで複数のプロットを1つの図に描画する方法

    Matplotlibは、データ可視化のために広く利用されている人気のPythonパッケージです。データの可視化は非常に重要なステップです。生の数値を目で追ったり複雑な計算を実行したりしなくても、データの中で何が起きているのかを直感的に把握できるようになるからです。また、定量的な洞察を聴衆に対して効果的に伝える手段としても役立ちます。Matplotlibは、データをもとに2次元のプロットを作成するために使われます。オブジェクト指向のAPIを備えており、Pythonアプリケーションへプロットを簡単に組み込むことができます。IPythonシェル、Jupyter Notebook、Spyderなどの開