横800ピクセル、縦600ピクセルで800×600=48万ピクセル=48万ピクセル(メガピクセル=100万ピクセル)の画像となります。 解像度1024×768の画像は、1024列と768行のグリッドなので、1024×768=0.78メガピクセルになります。
MNIST
MNISTデータベース(修正国立標準技術研究所データベース)は手書き数字の大規模データベースで、さまざまな画像処理システムのトレーニングによく使用されます。 Kerasのトレーニングデータセットは6万レコードで、テストデータセットは1万レコードである。 各レコードは28×28ピクセルです。
どのように見えるのでしょうか。 matplotlib
とその画像機能imshow()
を使って、最初の10レコードを表示してみよう。
学習用に画像データを重ねる
モデル学習用のニューラルネットワークのフレームワークに合わせるために、28×28=784個の値すべてを1列で重ねられるようにするのです。 最初のレコードの積み重ねられた列は次のようになります。 (x_train.reshape(1,784)
を使用):
次に、図(B)に示すように、標準的なニューラルネットワークでモデルを学習させることができます。 784個の値のそれぞれが入力層のノードとなる。 しかし待てよ、データを積み重ねるときに多くの情報を失ってはいないだろうか? そうなんです。 画像の空間的・時間的な関係が捨象されてしまったのです。 これは大きな情報損失です。 それでは、畳み込みオートエンコーダがどのように空間的、時間的情報を保持できるのか見てみましょう。
Why Are Convolutional Autoencoders Suitable for Image Data?
データの切り出しや積層を行うと大きな情報損失が見られることがわかりますね。 コンボリューションオートエンコーダは、データを積み重ねるのではなく、入力された画像データの空間情報をそのままに、コンボリューション層と呼ばれる部分で情報を緩やかに抽出します。 図(D)は、平坦な2次元画像から太い正方形(Conv1)を抽出し、さらに長い立方体(Conv2)、さらに長い立方体(Conv3)へと続いている様子を示している。 この処理は、データの空間的な関係を保持するためのものである。 これがオートエンコーダーにおける符号化処理である。 中央は、隠れ層が10ニューロンで構成される完全連結型オートエンコーダである。 その後、立方体を平坦化し、2次元の平面画像にするデコード処理がある。 図(D)では、エンコーダーとデコーダーは対称になっている。 対称である必要はありませんが、「オートエンコーダによる異常検出を簡単に」で説明したように、多くの実務家はこのルールをそのまま採用しています。
コンボリューションオートエンコーダの仕組み
上記のデータ抽出は魔法のような感じがしますが、どうですか。 実際はどうなのでしょうか? それは、次の3つの層が関係しています。 畳み込み層、リル層、プーリング層です。
- コンボリューション層
コンボリューションステップでは、特徴マップと呼ばれる多くの小さな断片、あるいは図(E)の緑、赤、紺の四角のような特徴を作成します。 これらの正方形は入力画像の画素間の関係を保存する。 図(F)のように、各特徴が元画像を走査するようにします。 このようにスコアを生成する処理をフィルタリングと呼ぶ。
元画像をスキャンした後、各特徴は、図(G)に示すように、高いスコアと低いスコアを持つフィルタリング画像を生成する。 完全に一致するものがあれば、そのマスに高得点が存在する。 一致するものが少ない場合や、一致しない場合は、スコアは低いか0となる。 例えば、赤い四角は、元画像の中から特徴量と完全に一致する部分を4つ見つけたので、その4つの部分のスコアが高い。
フィルターが多いと、モデルが抽出できる特徴量の数は多くなります。 しかし、特徴量が多ければ多いほど、学習時間が長くなる。
1.1 Padding
特徴はどのように一致を判断するのでしょうか。 ハイパーパラメータの1つにPaddingがあり、2つのオプションがある。 (i)特徴に合うように元画像をゼロでパディングする、(ii)元画像の合わない部分を削除して有効な部分を残す。
1.2 Strides
畳み込み層にはもう一つのパラメータ、ストライドがある。 これは入力マトリックス上を移動するピクセル数である。 ストライドが1の場合、フィルタは一度に1ピクセルずつ移動します。 Kerasのコードではハイパーパラメータとして見ることになります。
2.ReLUs Step
Rectified Linear Unit (ReLU) は、典型的なニューラルネットワークのステップと同じものです。 これは、数学が正しく動作することを保証するために、任意の負の値をゼロに整流する。
3. Max Pooling Layer
プーリングは、画像サイズを縮小するものである。 図(H)では、プールサイズと呼ばれる2×2のウィンドウがフィルタリングされた各画像をスキャンし、その2×2のウィンドウの最大値を新しい画像の1×1の正方形に割り当てています。 図(H)に示すように、最初の2×2ウィンドウの最大値は高得点(赤で表現)であるため、高得点を1×1マスに割り当てる。
最大値を取る以外に、あまり一般的ではないプーリング方法には、平均プーリング(平均値を取る)または合計プーリング(合計を取る)があります。
プール後、小さいフィルタ画像のスタックが新しく生成されました。 ここで、図(J)に示すように、より小さなフィルタリングされた画像を分割し、リストに積み重ねる。
Kerasにおけるモデル
上記の3つの層は、畳み込みニューラルネットワークのビルディングブロックである。 Kerasには以下の2つの機能があります:
コンボリューションオートエンコーダでは、多くのコンボリューションレイヤーを構築することができます。 図(E)では、エンコード部分にConv1、Conv2、Conv3というラベルのついた3つの層があります。
- 以下のコードでは、入力2次元画像が28×28であることを宣言します。
- そして、Conv1, Conv2, Conv3の3層を構築します。
- Conv1がConv2の中にあり、Conv2がConv3の中にあることに注意してください。はフィルターが入力画像とうまく適合しなかったときにどうするか指定されています。
padding='valid'
はフィルタが合わないときに画像の一部を落とすこと、padding='same'
は画像に合うように0を詰めることです。
そして続けて復号化処理を追加しています。 そのため、以下のdecode
の部分には、すべてのエンコードとデコードがあります。
Keras apiは、モデルと最適化手法の宣言を必要とします:
-
Model(inputs= input_img,outputs= decoded)
:モデルは、入力データinput_img
を与えられた出力decoded
の計算で必要となるすべてのレイヤーが含まれているでしょう。compile(optimizer='adadelta',loss='binary_crossentropy')
: オプティマイザは、勾配ディセントが行うような最適化を実行します。 代表的なものとして、stochastic gradient decent (SGD), Adapted gradient (Adagrad), Adagradの拡張版であるAdadeltaがあります。 詳しくはKeras optimizerのドキュメントを参照してください。 損失関数はKeras lossesのドキュメントにあります。
以下、入力と出力としてx_trainを使ってモデルを学習しています。 batch_size
はサンプル数、epoch
は反復回数です。 各エポックの前に学習データをシャッフルする必要があるのでshuffle=True
を指定しています。
最初の10枚の元画像と同じ10枚の画像に対する予測値をプリントアウトすることができます。
How to Build an Image Noise Reduction Convolution Autoencoder?
画像ノイズ除去はノイズデータを入力、それぞれのクリアデータを出力としてモデルを学習するという考え方です。 上のモデルとの違いはこれだけです。 まず、データにノイズを加えてみましょう。
最初の10枚のノイズ画像は次のようなものである。
そして、ノイズのあるデータを入力、クリーンなデータを出力としてモデルを学習させる。
最後に、最初の10枚のノイズの多い画像と、それに対応するノイズ除去の画像をプリントアウトします。
このリンクから notebook を入手できます。
Are any pre-trained CNNs Code that I can use?
はい、コードを学ぶことに興味があれば、Keras には Xception、VGG16、VGG19、ResNet50、InceptionV3、InceptionResNetV2、MobileNet、DenseNet、NASNet、および MobileNetV2 などのいくつかの事前学習済みの CNNs が用意されています。 この大規模な画像データベースImageNetは、研究目的で投稿したり、ダウンロードしたりすることができます
。