目標:
機械学習とニューラルネットワークの実験は初めてです。一連の5つの画像を入力として受け取り、次の画像を予測するネットワークを構築したいと考えています。私のデータセットは、実験のために完全に人工的なものです。例として、入力と予想される出力の例をいくつか示します。
データポイントとターゲットのイメージは同じソースからのものです。データポイントのターゲットイメージは他のデータポイントに表示され、その逆も同様です。
私がやった事:
今のところ、1つの非表示層を持つパーセプトロンを構築し、出力層が予測のピクセルを提供します。2つの層は密度が高く、シグモイドニューロンで構成されています。平均二乗誤差を目的として使用しました。画像はかなりシンプルで、それほど変化しないので、これはうまく機能します。200〜300の例と50の非表示の単位があるため、テストデータで適切なエラー値(0.06)と適切な予測が得られます。ネットワークは勾配降下法で学習されます(学習率のスケーリングを使用)。ここに私が得る学習曲線の種類とエポックの数によるエラーの進展があります:
私がやろうとしていること:
これで十分ですが、データセットの次元を減らして、より大きな画像やより多くの例にスケーリングできるようにしたいと思います。PCAを適用しました。ただし、次の2つの理由により、データポイントのリストではなく画像のリストに適用しました。
- 全体としてのデータセットでは、共分散行列は24000x24000になり、ラップトップのメモリに収まりません。
- 同じ画像でできているので、画像上で行うことで、ターゲットを圧縮することもできます。
画像はすべて類似しているように見えるので、1e-6の差異のみを失いながら、なんとかサイズを4800(40x40x3)から36に減らしました。
機能しないもの:
削減されたデータセットとその削減されたターゲットをネットワークに供給すると、勾配降下法は非常に速く収束して高いエラー(約50!)になります。上記と同等のプロットを見ることができます:
学習曲線が高い値から始まり、その後下がって戻るとは思いもしませんでした...そして、勾配降下がそれほど速く停止する通常の原因は何ですか?パラメータの初期化にリンクできますか(私はlasagneライブラリのデフォルトであるGlorotUniformを使用しています)。
次に、削減されたデータをフィードしても、元の(非圧縮)ターゲットをフィードすると、最初のパフォーマンスに戻ることに気付きました。したがって、ターゲットイメージにPCAを適用することは良い考えではなかったようです。何故ですか?結局、入力とターゲットを同じ行列で乗算しただけなので、トレーニング入力とターゲットは、ニューラルネットワークが理解できるようにリンクされています。何が欠けていますか?
シグモイドニューロンの総数が同じになるように4800ユニットの追加のレイヤーを導入しても、同じ結果が得られます。要約すると、私は試しました:
- 24000ピクセル=> 50シグモイド=> 4800シグモイド(= 4800ピクセル)
- 180 "ピクセル" => 50シグモイド=> 36シグモイド(= 36 "ピクセル")
- 180 "ピクセル" => 50シグモイド=> 4800シグモイド(= 4800ピクセル)
- 180 "ピクセル" => 50シグモイド=> 4800シグモイド=> 36シグモイド(= 36 "ピクセル")
- 180 "ピクセル" => 50シグモイド=> 4800シグモイド=> 36線形(= 36 "ピクセル")
(1)および(3)正常に動作します。(2)、(4)、(5)ではなく、その理由がわかりません。特に、(3)は機能するので、(5)は(3)と同じパラメータと最後の線形層の固有ベクトルを見つけることができるはずです。ニューラルネットワークではそれは不可能ですか?