DEEP LEARNING : MNISTAnomaly 2:AI-Anesth 10

MnistAnomalyの構造について、詳しく確認してみよう。ここでは、とくにJAVA 8で強化されたコレクションクラスを駆使した行列データの操作への理解が重要となる。

オートエンコーダーでは、28×28の数字の画像を入れて、同じ画像を出力するニューラルネットワークであり、データを表現する特徴を獲得するためのニューラルネットワーク。
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

MnistAnomaly.javaの少し長いコードの大まかな以下の8つの構造から構成されていることをまず把握しておく。

では、まず第1構造MutiLayerConfigurationで設定される多層ニューラルネットワーク構成から詳しく見てみる。

4層構造のニューラルネットが設定されて、入力層では28×28=784ピクセルで構成されるMnist画像のそれぞれのピクセルが第0層784個のニューロンに接続されることと、最終的な出力層である第3層も同数の784個のニューロンで構成されることがわかる。

次に第2構造であるデータ読み込みと訓練・評価データへの分割について見る。

次は、構造3であるモデルへの訓練データの適用を分析する。

ここでは、30エポック繰り返される.
訓練用データは80個/バッチなので、40,000データの訓練データをカバーするためには、500回の繰り返しが必要ということから、出力結果は、1エポック500の繰り返しを30回で、以下のように0回目を含めて、15,000回まで繰り返された。

次は、構造4の訓練データの適用。各画像のスコア評価と正解数値データをペアにしたMap配列を作成する.

参考までにdigitAllPairsの中身を出力させると、以下の通り scoreと784の配列データ.

次は、構造5、スコアによるソート(Comparatorクラスが利用される)

構造6では、Best, Worstスコアデータの選定を行う。

最後に構造7で、Best, Worstスコアデータの可視化する。この歳、後述のMNISTVisualizerクラスを用いる。

構造7で用いるMNISTVisualizer関数を構造8で定義する。

分かりにくいのは、Map配列listsByDigitとListのdigitAllPairsでしょう。
仮に、出力を減らすために、アプライデータを1000に減らして、Epochを1に減らして見ると、訓練データ800、評価データは200となる。それぞれの数字ごとには20個程度。1バッチ100とすれば、10サイクルで1エポック終了する。

listsByDigitは、生成段階では、

となっているが、その後、digiAllPairsを取り込んで、

データ挿入後のlistsByDigitをエクセルで覗いてみると以下のように、ゼロからスタートして、ゼロが18個入っていた。

いくつかの疑問:以下の通り:
double score = net.score(new DataSet(example,example));
scoreは何を見ているのか:Class MultiLayerNetwork
double score(DataSet data, boolean training)
Calculate the score (loss function) of the prediction with respect to the true labels