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つは学習に使用する「オートエンコーダー」です。
-
BokehとPythonを使って垂直棒グラフを可視化する方法
Bokehは、データの可視化を支援するためのPythonパッケージであり、オープンソースプロジェクトとして公開されています。BokehはHTMLとJavaScriptを使ってプロットを描画するため、Webベースのダッシュボードを作成する際に特に有用です。BokehはNumPyやPandasなど、他のPythonパッケージと簡単に組み合わせて使用でき、インタラクティブなプロットやダッシュボードなどを生成することができます。BokehはデータソースをJSONファイルに変換します。このJSONファイルは、JavaScriptライブラリであるBokehJSへの入力として使われます。BokehJSはTy
-
PythonとMatplotlibで複数のプロットを1つの図に描画する方法
Matplotlibは、データ可視化のために広く利用されている人気のPythonパッケージです。データの可視化は非常に重要なステップです。生の数値を目で追ったり複雑な計算を実行したりしなくても、データの中で何が起きているのかを直感的に把握できるようになるからです。また、定量的な洞察を聴衆に対して効果的に伝える手段としても役立ちます。Matplotlibは、データをもとに2次元のプロットを作成するために使われます。オブジェクト指向のAPIを備えており、Pythonアプリケーションへプロットを簡単に組み込むことができます。IPythonシェル、Jupyter Notebook、Spyderなどの開