ホーム » AutoEncoder

AutoEncoder」カテゴリーアーカイブ

TensorFlow : TensorLayer : チュートリアル (2) 画像分類 / Autoencoder

TensorFlow : TensorLayer : チュートリアル (2) 画像分類 / Autoencoder (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/02/2018

* 本ページは、TensorLayer の以下のドキュメントの一部を翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

チュートリアル (2)

MNIST example を実行する

チュートリアルの最初のパートでは、TensorLayer のソース配布に含まれる MNIST サンプルを単に実行します。MNIST データセットは様々な画像処理システムを訓練するために一般に使用される 60000 手書き数字を含みます。

フォルダに入り tutorial_mnist.py サンプル・スクリプトを実行します :

python tutorial_mnist.py

総てが正しくセットアップされている場合、次のような出力を得るでしょう :

tensorlayer: GPU MEM Fraction 0.300000
Downloading train-images-idx3-ubyte.gz
Downloading train-labels-idx1-ubyte.gz
Downloading t10k-images-idx3-ubyte.gz
Downloading t10k-labels-idx1-ubyte.gz

X_train.shape (50000, 784)
y_train.shape (50000,)
X_val.shape (10000, 784)
y_val.shape (10000,)
X_test.shape (10000, 784)
y_test.shape (10000,)
X float32   y int64

[TL] InputLayer   input_layer (?, 784)
[TL] DropoutLayer drop1: keep: 0.800000
[TL] DenseLayer   relu1: 800, relu
[TL] DropoutLayer drop2: keep: 0.500000
[TL] DenseLayer   relu2: 800, relu
[TL] DropoutLayer drop3: keep: 0.500000
[TL] DenseLayer   output_layer: 10, identity

param 0: (784, 800) (mean: -0.000053, median: -0.000043 std: 0.035558)
param 1: (800,)     (mean:  0.000000, median:  0.000000 std: 0.000000)
param 2: (800, 800) (mean:  0.000008, median:  0.000041 std: 0.035371)
param 3: (800,)     (mean:  0.000000, median:  0.000000 std: 0.000000)
param 4: (800, 10)  (mean:  0.000469, median:  0.000432 std: 0.049895)
param 5: (10,)      (mean:  0.000000, median:  0.000000 std: 0.000000)
num of params: 1276810

layer 0: Tensor("dropout/mul_1:0", shape=(?, 784), dtype=float32)
layer 1: Tensor("Relu:0", shape=(?, 800), dtype=float32)
layer 2: Tensor("dropout_1/mul_1:0", shape=(?, 800), dtype=float32)
layer 3: Tensor("Relu_1:0", shape=(?, 800), dtype=float32)
layer 4: Tensor("dropout_2/mul_1:0", shape=(?, 800), dtype=float32)
layer 5: Tensor("add_2:0", shape=(?, 10), dtype=float32)

learning_rate: 0.000100
batch_size: 128

Epoch 1 of 500 took 0.342539s
  train loss: 0.330111
  val loss: 0.298098
  val acc: 0.910700
Epoch 10 of 500 took 0.356471s
  train loss: 0.085225
  val loss: 0.097082
  val acc: 0.971700
Epoch 20 of 500 took 0.352137s
  train loss: 0.040741
  val loss: 0.070149
  val acc: 0.978600
Epoch 30 of 500 took 0.350814s
  train loss: 0.022995
  val loss: 0.060471
  val acc: 0.982800
Epoch 40 of 500 took 0.350996s
  train loss: 0.013713
  val loss: 0.055777
  val acc: 0.983700
...

このサンプルスクリプトは、多層パーセプトロン、ドロップアウト、Dropconnect, Stacked Denoising Autoencoder そして畳込みニューラルネットワークを含む、異なるモデルを試すことを可能にします。if __name__ == ‘__main__’: から異なるモデルを選択します。

main_test_layers(model='relu')
main_test_denoise_AE(model='relu')
main_test_stacked_denoise_AE(model='relu')
main_test_cnn_layer()

 

MNIST サンプルを理解する

さてそれを起こすために何が必要かを調査しましょう!追随するために、ソースコードを開いてください。

 

Preface

貴方が気づく最初のことは TensorLayer の他にも、numpy と tensorflow もインポートすることです :

import tensorflow as tf
import tensorlayer as tl
from tensorlayer.layers import set_keep
import numpy as np
import time

既知のように、TensorLayer は TensorFlow の上に構築されています、それは何某かのタスクを手伝う補足であり、置き換えではありません。TensorLayer を幾つかの vanilla TensorFlow コードと常に混在させるでしょう。set_keep は Denoising Autoencoder を使用するとき確率を保持する placeholder にアクセスするために使用されます。

 

データをロードする

コードの最初のピースは関数 load_mnist_dataset() を定義します。その目的は MNIST データセットを (もしそれがまだダウンロードされていないのであれば) ダウンドードしてそれを通常の numpy 配列の形式で返すことです。関連するような TensorLayer は全くありませんので、このチュートリアルのためには、それを次のように認識できます :

X_train, y_train, X_val, y_val, X_test, y_test = \
                  tl.files.load_mnist_dataset(shape=(-1,784))

X_train.shape は (50000, 784) です、これは次のように解釈されます: 50,000 画像と各画像は 784 ピクセルを持ちます。y_train.shape は単純に (50000,) です、これは X_train の同じ長さのベクトルで各画像のために整数クラスラベルを与えます – つまり、(数字を描いた人間の注釈者に従う) 画像で示される 0 と 9 の間の数字です 。

畳み込みニューラルネットワーク・サンプルのためには、MNIST は次のように 4D バージョンとしてロードされます :

X_train, y_train, X_val, y_val, X_test, y_test = \
            tl.files.load_mnist_dataset(shape=(-1, 28, 28, 1))

X_train.shape は (50000, 28, 28, 1) で、これはそれぞれ 1 チャネル、28 行と 28 列を持つ 50,000 画像を表します。チャネル 1 はそれがグレースケール画像であるためで、総てのピクセルは 1 つの値だけを持ちます。

 

モデルを構築する

これは TensorLayer が介入するところです。それは層を作成してスタックあるいはマージすることにより任意に構造化されたニューラルネットワークを定義することを可能にします。

上で言及したように、tutorial_mnist.py は 4 つのタイプのモデルをサポートし、そして同じインターフェイスの容易に交換可能な関数を通してそれを実装しています。最初に総てのステップを詳細に説明する固定されたアーキテクチャの多層パーセプトロン (MLP) を作成する関数を定義します。それから Denoising Autoencoder (DAE) を実装し、その後で総ての Denoising Autoencoder をスタックしてそれらを再調整します。加えて、tutorial_mnist_simple.py で MNIST データセットのための単純なサンプル、tutorial_cifar10_tfrecord.py で CIFAR-10 データセットのための CNN サンプル。

 

多層パーセプトロン (MLP)

最初のスクリプト main_test_layers() はそれぞれ 800 ユニットの 2 つの隠れ層を作成し、10 ユニットの softmax 出力層が続きます。それは入力データに 20% ドロップアウトそして隠れ層に 50% ドロップアウトを適用します。

データをネットワークに供給するために、TensorFlow placeholder が次のように定義される必要があります。ここで None はコンパイルの後ネットワークが任意のバッチサイズの入力データを受け取ることを意味します。x は X_train データを保持するために使用されて y_ は y_train データを保持するために使用されます。前もってバッチサイズを知りこの柔軟性を必要としない場合には、ここでバッチサイズを与えるべきです – 特に畳み込み層のためには、これは TensorFlow にある最適化を適用することを可能にします。

x = tf.placeholder(tf.float32, shape=[None, 784], name='x')
y_ = tf.placeholder(tf.int64, shape=[None, ], name='y_')

TensorFlow の各ニューラルネットワークの基礎はネットワークに続いて供給される入力データを表わす InputLayer インスタンスです。InputLayer はどのような特定のデータにもまだ結び付けられていないことに注意してください。

network = tl.layers.InputLayer(x, name='input')

最初の隠れ層を追加する前に、入力データに 20% ドロップアウトを適用します。これは DropoutLayer インスタンスを通して実現されます :

network = tl.layers.DropoutLayer(network, keep=0.8, name='drop1')

最初のコンストラクタ引数は incoming 層であることに注意してください、2 番目の引数は活性値のための保持確率です。さて続いて 800 ユニットの最初の完全結合隠れ層で進めます。DenseLayer をスタックするとき注意してください。

network = tl.layers.DenseLayer(network, n_units=800, act = tf.nn.relu, name='relu1')

再度、最初のコンストラクタ引数は network の上にネットワークをスタックしていることを意味しています。n_units はこの完全結合層に対するユニット数を与えます。act は活性化関数を取り、それらの幾つかは tensorflow.nn と tensorlayer.activation で定義されます。ここでは rectifier を選択しましたので、ReLU を得ます。50 % のドロップアウト、もう一つの 800-ユニット dense 層と再度 50 % ドロップアウトを追加します :

network = tl.layers.DropoutLayer(network, keep=0.5, name='drop2')
network = tl.layers.DenseLayer(network, n_units=800, act = tf.nn.relu, name='relu2')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop3')

最後に、完全結合出力層を追加します、この n_units はクラス数に等しいです。softmax は計算をスピードアップするために内部的には tf.nn.sparse_softmax_cross_entropy_with_logits() で実装されていますので、 最後の層では identity を使用することに注意してください、より詳細は tl.cost.cross_entropy() で。

network = tl.layers.DenseLayer(network,
                              n_units=10,
                              act = tf.identity,
                              name='output')

上で言及したように、各層はその incoming 層(s) にリンクされていますので、TensorLayer のネットワークにアクセスするためには出力層が必要なだけです :

y = network.outputs
y_op = tf.argmax(tf.nn.softmax(y), 1)
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(y, y_))

ここで、network.output は network からの (one hot フォーマットの) 10 identity 出力で、y_op は整数出力ですクラスインデックスを表します。一方で cost はターゲットと予測ラベルの間の交差エントロピーです。

 

Denoising Autoencoder (DAE)

オートエンコーダは教師なし学習モデルで、表現特徴を抽出することができ、それはデータの学習生成モデルと Greedy layer-wise な事前訓練のためにより広く使用されるようになりました。vanilla オートエンコーダについては、深層学習チュートリアル を見てください。

スクリプト main_test_denoise_AE() は 50% の corrosion 率を持つ Denoising Autoencoder を実装しています。オートエンコーダは次のように定義されます、ここではオートエンコーダは DenseLayer で表わされます :

network = tl.layers.InputLayer(x, name='input_layer')
network = tl.layers.DropoutLayer(network, keep=0.5, name='denoising1')
network = tl.layers.DenseLayer(network, n_units=200, act=tf.nn.sigmoid, name='sigmoid1')
recon_layer1 = tl.layers.ReconLayer(network,
                                    x_recon=x,
                                    n_units=784,
                                    act=tf.nn.sigmoid,
                                    name='recon_layer1')

DenseLayer を訓練するためには、単純に ReconLayer.pretrain() を実行します、denoising Autoencoder を使用する場合、corrosion 層 (DropoutLayer) の名前が次のように指定される必要があります。特徴画像をセーブするために、save を True に設定します。異なるアーキテクチャとアプリケーションにより多くの種類の pre-train メトリクスがあります。sigmoid 活性のためには、オートエンコーダは KL ダイバージェンスを使用して実装できます、一方で rectifier のためには、活性出力の L1 正則化が出力をスパースにすることができます。そのため ReconLayer のデフォルトの挙動は KLD だけを提供して sigmoid 活性化関数のために交差エントロピーそして rectifying 活性化関数のために活性出力の L1 と平均二乗誤差 (mean-squared-error) です。貴方自身の pre-train メトリクスを達成するために ReconLayer を修正することを勧めます。

recon_layer1.pretrain(sess,
                      x=x,
                      X_train=X_train,
                      X_val=X_val,
                      denoise_name='denoising1',
                      n_epoch=200,
                      batch_size=128,
                      print_freq=10,
                      save=True,
                      save_name='w1pre_')

加えて、スクリプト main_test_stacked_denoise_AE() は一つのネットワークにどのように複数のオートエンコーダをスタックして再調整するかを示します。

 

畳み込みニューラルネットワーク (CNN)

最後に、main_test_cnn_layer() は 2 つの CNN 層と max pooling ステージ、完全結合隠れ層そして完全結合出力層を作成します。より多くの CNN サンプルは tutorial_cifar10_tfrecord.py のような他のサンプルで見つかります。

network = tl.layers.Conv2d(network, 32, (5, 5), (1, 1),
        act=tf.nn.relu, padding='SAME', name='cnn1')
network = tl.layers.MaxPool2d(network, (2, 2), (2, 2),
        padding='SAME', name='pool1')
network = tl.layers.Conv2d(network, 64, (5, 5), (1, 1),
        act=tf.nn.relu, padding='SAME', name='cnn2')
network = tl.layers.MaxPool2d(network, (2, 2), (2, 2),
        padding='SAME', name='pool2')

network = tl.layers.FlattenLayer(network, name='flatten')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop1')
network = tl.layers.DenseLayer(network, 256, act=tf.nn.relu, name='relu1')
network = tl.layers.DropoutLayer(network, keep=0.5, name='drop2')
network = tl.layers.DenseLayer(network, 10, act=tf.identity, name='output')

 

モデルを訓練する

tutorial_mnist.py スクリプトの残りの部分はセットアップして交差エントロピーだけを使用して MNIST データセットに渡り訓練ループを実行することを処理します。

 

Dataset iteration

iteration 関数は、与えられた項目数のミニバッチでそれぞれ入力データとターゲットの 2 つの numpy 配列 に渡り同期的に反復するためのものです。より多くの iteration 関数は tensorlayer.iterate で見つかります。

tl.iterate.minibatches(inputs, targets, batchsize, shuffle=False)

 

損失と更新式

続けて、訓練で最小化されるべき損失式を作成します :

y = network.outputs
y_op = tf.argmax(tf.nn.softmax(y), 1)
cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(y, y_))

より多くの損失または正則化はここで適用できます。例えば、重み行列上の max-norm を適用するために、次の行を追加できます。

cost = cost + tl.cost.maxnorm_regularizer(1.0)(network.all_params[0]) +
              tl.cost.maxnorm_regularizer(1.0)(network.all_params[2])

解いている問題に依拠して、異なる損失関数が必要となるでしょう、より多くは tensorlayer.cost を見てください。変数を得るために、network.all_params を使用する以外に、特定の変数を文字列名で得るために tl.layers.get_variables_with_name を使用することもできます。

ここでモデルと損失関数を持ち、ネットワークを訓練するための更新式/演算を作成します。TensorLayer は多くの optimizer を提供しません、代わりに TensorFlow の optimizer を使用しました :

train_params = network.all_params
train_op = tf.train.AdamOptimizer(learning_rate, beta1=0.9, beta2=0.999,
    epsilon=1e-08, use_locking=False).minimize(cost, var_list=train_params)

ネットワークを訓練するために、feed_dict へデータと 保持確率を供給しました。

feed_dict = {x: X_train_a, y_: y_train_a}
feed_dict.update( network.all_drop )
sess.run(train_op, feed_dict=feed_dict)

その一方で、検証とテストについては、少し異なる方法を使用します。総ての Dropout, Dropconnect, Corrosion 層は無効にされる必要があります。総ての network.all_drop を 1 に設定するために tl.utils.dict_to_one を使用します。

dp_dict = tl.utils.dict_to_one( network.all_drop )
feed_dict = {x: X_test_a, y_: y_test_a}
feed_dict.update(dp_dict)
err, ac = sess.run([cost, acc], feed_dict=feed_dict)

評価のためには、分類精度のための式を作成します :

correct_prediction = tf.equal(tf.argmax(y, 1), y_)
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

 

What Next?

私達はまた tutorial_cifar10_tfrecord.py でより多くの進んだ画像分類サンプルを持ちます。コードとノートを読み、より多くの訓練データをどのように生成するかそして local response normalization とは何かを理解してください。その後で、残差ネットワークを実装することを試してください (Hint: you may want to use the Layer.outputs)。

 

以上






TensorFlow で CNN AutoEncoder – Oxford 17 Flowers –

TensorFlow で CNN AutoEncoder – Oxford 17 Flowers –

先に MNIST と CIFAR-10 を題材に Convolutional AutoEncoder を実装して視覚化してみましたが、より現実的な画像サイズである Oxford 17 Flowers にトライしてみます。というか、ここからが本番です。

Convolutional AutoEncoder に使用したモデルは手始めに CIFAR-10 と同じものを使いました。
つまり Encoder として (畳込み層 + MaxPooling 層) x 3 の単純なもので、そして decode された画像を元画像と比較し、encode された画像、特徴マップを可視化します。

最初にテスト・サンプル画像をカテゴリー毎に1 枚選んで 17 枚をまとめて、decode した画像群をトレーニング epochs 毎にリスト表示します :

【元サンプル画像】
ae_oxf17f_list_samples.01

【1 epoch】
1 epoch だと RGB の 3 チャネルが復元できていません :
ae_oxf17f_list_decoded.01

【10 epochs】
ある程度の復元はできていますが、細部はまだ再現されていません :
ae_oxf17f_list_decoded.10

【50 epochs】
復元度は高くなりましたがまだ十分だとは言えません。
トレーニング不足かもしれませんが、このあたりが限界かもしれません :
ae_oxf17f_list_decoded.50

 
次に個別のサンプル画像を適当に選択して epochs 別に decoded 画像を比較してみます :

元サンプル画像

1 epoch

ae_oxf17f_sample.01.09

ae_oxf17f_decoded.01.09

10 epochs

50 epochs

ae_oxf17f_decoded.10.09

ae_oxf17f_decoded.50.09

別例をもう一つ :

元サンプル画像

1 epoch

ae_oxf17f_sample.01.06

ae_oxf17f_decoded.01.06

10 epochs

50 epochs

ae_oxf17f_decoded.10.06

ae_oxf17f_decoded.50.06

ついでこのサンプル画像をエンコードした出力マップを epochs 別に表示します :

【Encoded 画像 : 1 epoch】
ae_oxf17f_encoded.01.06

【Encoded 画像 : 10 epochs】
ae_oxf17f_encoded.10.06

【Encoded 画像 : 50 epochs】
ae_oxf17f_encoded.50.06

別例を幾つか掲示しておきます。
それぞれ、サンプル画像、50 epochs 後の decoded 画像、そして encoded 画像群です :

 

ae_oxf17f_sample.50.05

ae_oxf17f_decoded.50.05

 

ae_oxf17f_encoded.50.05

 

ae_oxf17f_sample.50.10

ae_oxf17f_decoded.50.10

 

ae_oxf17f_encoded.50.10

 

ae_oxf17f_sample.50.16

ae_oxf17f_decoded.50.16

 

ae_oxf17f_encoded.50.16

 

以上

TensorFlow で CNN AutoEncoder – CIFAR-10 –

TensorFlow で CNN AutoEncoder – CIFAR-10 –

先に MNIST を題材に Convolutional AutoEncoder を実装して視覚化してみました(TensorFlow で CNN AutoEncoder – MNIST –)が、CIFAR-10 でも試しておきます。

CIFAR-10 は機械学習定番のベンチマークとして使用され、RGB 32×32 ピクセル画像を 10 カテゴリーに渡って分類するものです : 飛行機、自動車、鳥、猫、鹿、犬、蛙、馬、船そしてトラック。

CIFAR-10 の詳細は TensorFlow : Tutorials : 畳込み ニューラルネットワーク を参照してください。

Convolutional AuoEncoder

AutoEncoder に使用するモデルは Encoder として畳込み層を3層使用する単純なものです。
そして decode された画像を元画像と比較し、encode された画像、特徴マップを可視化します。

最初にテスト・サンプル画像を頭から 40 枚まとめて、decode した画像群をトレーニング epochs 毎にリスト表示します :

【元サンプル画像】
ae_cifar10_list_samples.01

【1 epoch】
1 epoch だと RGB の 3 チャネルが復元できていません :
ae_cifar10_list_decoded.01

【10 epochs】
10 epochs で肉眼では殆ど差異が分からなくなります :
ae_cifar10_list_decoded.10

【30 epochs】
念のため、30 epochs, 50 epochs トレーニングしました :
ae_cifar10_list_decoded.30

【50 epochs】
ae_cifar10_list_decoded.50

 
次に個別のサンプル画像を適当に選択して epochs 別に decoded 画像を比較してみます。
画像リストでも見て取れたように、1 epoch では 3 チャネルが復元できていませんが、10 epochs 以後はほぼ完全に復元できています :

元サンプル画像

1 epoch

ae_cifar10_sample.01.01

ae_cifar10_decoded.01.01

10 epochs

50 epochs

ae_cifar10_decoded.10.01

ae_cifar10_decoded.50.01

以下は同じサンプル画像を encode した出力マップを epochs 別に表示したものです。
トレーニングが進むと特徴抽出が先鋭化します :

【Encode 画像 : 1 epoch】
ae_cifar10_encoded.01.01

【Encode 画像 : 10 epochs】
ae_cifar10_encoded.10.01

【Encode 画像: 50 epochs】
ae_cifar10_encoded.50.01

 
別例を幾つか掲示しておきます。
それぞれ、サンプル画像、50 epochs 後の decoded 画像、そして encoded 画像群です :

馬の全体画像 :

 

ae_cifar10_sample.50.13

ae_cifar10_decoded.50.13

 

ae_cifar10_encoded.50.13

犬の正面画像 :

 

ae_cifar10_sample.50.16

ae_cifar10_decoded.50.16

 

ae_cifar10_encoded.50.16

ステルス戦闘機の画像でしょうか、encoded 画像は分かりやすいです :

 

ae_cifar10_sample.50.21

ae_cifar10_decoded.50.21

 

ae_cifar10_encoded.50.21

馬の横顔 :

 

ae_cifar10_sample.50.17

ae_cifar10_decoded.50.17

 

ae_cifar10_encoded.50.17

 

以上

TensorFlow で CNN AutoEncoder – MNIST –

TensorFlow で CNN AutoEncoder – MNIST –

AutoEncoder はモデルの事前トレーニングをはじめとして様々な局面で必要になりますが、基本的には Encoder となる積層とそれを逆順に積み重ねた Decoder を用意するだけですので TensorFlow で簡単に実装できます。

今回は MNIST を題材として最初に MLP ベースの AutoEncoder を復習した後に、畳込み AutoEncoder (Convolutional AutoEncoder) を実装し、encode された特徴マップを視覚化し、decode された画像を元画像と比較してみます。

TensorFlow で MLP AutoEncoder

MLP ベースの AutoEncoder の実装は非常に簡単です。
完全結合層を並べて encoder とし、逆順の積層を decoder とするだけです。

以下の例では単純化のために encoder を1層のみとし、元画像と decode された画像を比較してみます :

【元サンプル画像】
サンプル画像は MNIST のテスト用画像を頭から 40 個集めたものです :
ae_mlp_mnist_list_samples.01

【1 epoch】
1 epoch 後の decode された画像。
一応それらしい画像は出力されていますが、薄ぼんやりしていて分かりにくいです :
ae_mlp_mnist_list_decoded.01

【1 epoch(明るさ・輝度調整)】
明るさと輝度を調整してみました。元画像と比べると数字を構成する骨格自体が異なっているものも目立ちます :
ae_mlp_mnist_list_decoded.01b

【5 epochs(明るさ・輝度調整)】
やはり raw 出力では見て取れないので、明るさ・輝度を調整した後の画像を掲示しています :
ae_mlp_mnist_list_decoded.05b

【10 epochs(明るさ・輝度調整)】
だいぶ一致してきましたが細部が表現できていません :
ae_mlp_mnist_list_decoded.10b

TensorFlow で Convolutional Autoencoder

単層 MLP では十分な表現力が得られないので Convolutional Autoencoder にしてみます。
基本的な考え方は同じで、畳込み層を3層とする、ConvNet の基本モデルを使用しました。
但し、encode された画像を見やすくするために encoder 最終層の出力サイズは大きくなるように調整しています。

最初は MLP の場合と同様に decode した画像を元画像と比較してみます :

【元サンプル画像】
元サンプル画像は MLP と同じものを使います :
ae_mnist_list_samples.01

【1 epoch】
1 epoch で既に十分 decode できています。明るさ・輝度の調整も必要ありません :
ae_mnist_list_decoded.01

【50 epochs】
50 epochs トレーニングした後の decode された画像では細部がよりクリアになっています :
ae_mnist_list_decoded.50

念のために単一のサンプル画像と decode された画像をトレーニング epochs で比較してみましたが、微細な違いはあるもののほぼ完璧に decode できています :

元サンプル画像

1 epoch

ae_mnist_sample.01.03

ae_mnist_decoded.01.03

10 epochs

50 epochs

ae_mnist_decoded.10.03

ae_mnist_decoded.50.03

Convolutional Autoencoder で encode された画像

次に encode された画像をやはり epochs 数別に比較してみます。
以下は上の “0” の画像を encode した画像 (= encoder の特徴出力マップ) です。
トレーニングが進むにつれて特徴の掴みかたがより的確になっています :

【1 epoch】
ae_mnist_encoded.01.03

【10 epochs】
ae_mnist_encoded.10.03

【50 epochs】
ae_mnist_encoded.50.03

他の数字でも確認しておきます。
元サンプル画像、50 epochs 後の decode された画像、そして 50 epochs 後の encode された画像群の順です :

ae_mnist_sample.50.00

ae_mnist_decoded.50.00

ae_mnist_encoded.50.00

ae_mnist_sample.50.04

ae_mnist_decoded.50.04

ae_mnist_encoded.50.04

ae_mnist_sample.50.61

ae_mnist_decoded.50.61

ae_mnist_encoded.50.61

ae_mnist_sample.50.02

ae_mnist_decoded.50.02

ae_mnist_encoded.50.02

 
以上

TensorFlow で AutoEncoder

TensorFlow で AutoEncoder

AutoEncoder

AutoEncoder は普通の多層 NN を用いますが、教師なし学習で、encode/decode 層を用意して入力サンプル・データと同じ出力が得られるように訓練します。言い換えれば、入力サンプル・データと同じパターンが復号(再構築)できれば特徴を上手くつかまえた隠れ層が得られることになります。特徴を上手くつかまえたまま次元削減ができるとも言えますし、その隠れ層(中間層)の出力はデータ表現とも考えられます。

AutoEncoder の実装については以下が十分過ぎるほど詳しいです。1層から始めて多層は deep autoencoder として一応区別されていて、denoising や convolutional autoencoder、更には sequence-to-sequence autoencoder についても説明されています :

 
今回は試していませんが、denoising autoencoder については以下も参考になります :

AutoEncoder for MNIST, using TensorFlow

AutoEncoder は TensorFlow のチュートリアルに含まれていても良いように思いますが、(把握している限りでは)見当たらないので MNIST を題材にして簡単に試しておきました。

といっても基本形を試すだけならやることは簡単で、モデルとしては Encoder / Decoder として FC 層を用意するだけです。1層でも良いのですが、2層ずつ用意してみました。当然、多層になれば再構築の結果も多少良くなります :

入力 (748)
Encoder : FC (256)
Encoder : FC (64)
Decoder : FC (256)
Decoder : FC (784)

 
そして入出力ともに(ラベル Y は使わずに)訓練サンプル X で訓練します。損失グラフは以下のように普通な感じです :
autoencoder_loss2

 
訓練は 10 epochs 程度で十分でした。
以下は validation data を使って適当な epochs 後に再構築を試してみました。特に問題ないように見受けられますが、MNIST だと簡単過ぎるかもしれません。

1 epoch
autoencoder_mnist_gray_1epochs2

5 epochs
autoencoder_mnist_gray_5epochs2b

20 epochs
autoencoder_mnist_gray_20epochs2

 
Autoencoder では denoising が話題になりやすいですが、convolutional autoencoder も(上手く機能するのであれば)実用性がありそうです。

 
以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com