Consoleサンプルプロジェクト「elman_net.sdcprj」を試しに動かすだけだと、MNISTの分類だけみたいに見えるので、いまいちCNNとかとの違いがわかりませんでした。arakan-pgm-ai.hatenablog.comなので、elman_net.sdcprjのサンプルをちょっと変更して、・・予測みたいな・・こと・・をやってみます。2017/12/01追記>以降の説明の画面はVersion1.00のものを使っています。>Version1.10で一部のアイコンのデザインが変わってます。>ですが、見たらわかる程度と考えて貼り替えはしてません。予測みたいなこと?今回やるのは、「予測」ではなく、「予測みたいなこと」です。予測をするには、入力(x)に対して、結果(y)を推論します。今回は入力(x)に対する出力(x')で評価してます。「予測みたいなこと」です。いうか、Auto_Encoderで学習結果をもとに生成している感じです。そんなことをしている理由は「手軽に予測している雰囲気を味わう」ためです。厳密に見たら、ツッコミところ満載と思いますが、そこはご容赦を。ちなみに、過去の数値のトレンドから未来の数値を推測してみる・・みたいな・・もう少し「予測っぽい」アプローチは以下の記事で試みてます。arakan-pgm-ai.hatenablog.com予測という用途についてついでに、ざっくりとさわりだけ。深層学習(ディープラーニング)での予測って、意外に文系人間にとっては、わかったようで、わかりづらい概念だなと思ってます。なんとなく言葉の雰囲気から、過去のデータを時系列に学習したら、あとは予言者みたいに、未来のことを予測してくれる・・そんなのを想像してしまいます。そんなことはありません。神様を作れるわけじゃないのですから(笑)ざっくり言ってしまえば。ディープラーニングでできることは、過去の結果を時系列の連続データとして学習した特徴量をもとに計算した結果を出力するだけです。その出力は過去の時系列での変化量を学習した結果を使い、インプットの時間よりひとつ進んだ時間における状態を予測したものになるはずだよな・・と考えるとイメージしやすいんじゃないかと思ってます。SINカーブをトレース今回は、SINカーブの例をやってみます。SINカーブの変化を時系列と見たら、それを学習させた結果で、その先を予測させてみたら、答え合わせも容易だし確認もしやすいかなということで。ニューラルネットワークコンソールでは、出力結果を再度マージしてインプットにもっていくようなレイヤーを見つけられませんでしたので、手作業をまじえて確認することにします。学習データの作成SINカーブデータを時系列データにします。いうデータはEXCELで作るのが簡単です。角度は、0から5度ずつ増える連続データを作り、B列でラジアンを計算(例:=(PI()/180)*A2)し、さらにSIN値を計算(例:=IF(MOD(A2,180)=0,0,SIN(B2)))して、200個ほどのデータを作ります。C列のSIN値の数値の部分だけを、CSVデータにするわけです。この時、25行ずつの8つのファイルにわけておきます。みたいに数字の連番にするのがやりやすいです。ちなみに、0.csvから始める理由は、後で確認する結果のアウトプットが0.csvからできていくので、対応するファイルを見つけやすいというだけの理由なので、そこが問題なければ、1.csvからはじめても、他の名前付け規則でもなんでもいいです。作成した8つのファイルをデータ・セットのフォルダに置きます。適当なフォルダを切って、その下に配置してみます。{適当なフォルダ}\samples\sample_datasetそのフォルダへのパスとファイル名を記述したCSVファイルを作ります。このCSVファイルを同様に保存(上でデータ用の8ファイルを保存したフォルダに一緒においては駄目ですよ)します。ニューラルネットワークコンソールのDATASETタブニューラルネットワークコンソールを立ち上げて、DATASETタブに追加します。この辺のやり方の説明は以下の記事に詳しく書いてますので、わからない場合は、こちらを参考にしてください。arakan-pgm-ai.hatenablog.com以上で、データの準備はOKですが、ちょっと整理しておきます。1ファイル25行で8ファイルにわけた意味1ファイルに複数行(今回なら25行)のCSVファイルを作れば、それが行方向に時系列のデータとして扱えます。注意点としては、行数✕列数をすべてのファイルでそろえないと駄目なことです。(上記の例だと、25行1列で8ファイルすべてそろえてます)なお、ここでは1つの時系列データを25行にしています。理由は、いろんな行数で試してみて、25行のときが一番成績がよかったからです。理論的な裏付けとか、計算があるわけではありません。選択して開き、適当な別の名前をつけて保存します。elman_net.sdcprjは、MNISTの分類問題を行うように構成されていますので、ここから以下の順番に変更を加えていきます。Inputを上で作成した時系列のテキストデータに変更します。RecurrentOutput以下を、Affine+Tanh+SquareErrorに変更します。Inputの変更にあわせて、各レイヤーのIn・Outの値を調整します。ConfigタブでBatchSizeを小さくするInputを上で作成した時系列のテキストデータに変更しますDATASETタブを開いて、データ・セット一覧を表示(下図赤丸のボタン)して、さきほど追加したCSVファイルを選択します。一覧に追加していな場合は、OpenDataset(下図赤四角のボタン)を押して、フォルダからCSVファイルを選択して追加します。今回は、trainingとvalidationの両方に同じデータをセットします。(今回は上記のCSVを、sin_test.csvという名前にしてます)trainingとvalidationの両方に同じデータをセットするのが違和感があると思うので、保存しておきます。今回は、オリジナルのサインカーブを学習させたパラメータを使って、オリジナルと同じデータをINPUTにした時の結果が描くカーブが、どれくらい、オリジナルに近いのか?を検証しようとしているわけです。学習と評価は同じデータをINPUTにする必要があります。この辺、分類問題と全く考え方が違うので注意してください。それから、EDITタブで、inputレイヤーのサイズを、25,1(25行1列)に変更します。inputレイヤーの変更は、これで終わりです。RecurrentOutput以下を、Affine+Tanh+SquareErrorに変更しますもとの、SigmoidとBinaryCrossEntropyErrorを消して、TahnとSquaredErrorに差し替えます。このとき、SquaredErrorのT.DataSetを、inputと同じ「x」に変更することを忘れないようにします。(でないと、学習時にエラーがでます)Inputの変更にあわせて、各レイヤーのIn・Outの値を調整します全部、もとは28.28の画像にあわせた値になっているので、変更しないと学習ができません。RecurrentInputレイヤーのinputを「25,1」にして、Axisを0にします。続けて、AffineのOutShapeを「25」、Tanhのinputを「25」、DelayのSizeを「25」にします。すると、こんな感じになるはずです。あと、ResurrentOutput以降のAffineのOutShapeを「25,1」にします。すると、以下のようになります。レイヤーの設定は、これでOKです。ConfigタブでBatchSizeを小さくする最後にCONFIGタブを開いて、BatchSizeが64になっているのを、「1」に変更します。これをやっておかないと、学習時にデータサイズよりバッチサイズが大きいと怒られてしまいますから。これでレイヤーの設定は終わりです。結果はこんな感じですが、学習自体はうまくいってそうに見えます。評価の実行さて評価をします。普通に評価ボタンを押すだけです。分類問題みたいに、結果が正解率みたいにでるわけではありません。評価が終わっても、こんな感じで、ただデータ・セットが表示されるだけです。今のところ、ニューラルネットワークコンソールには、こういう予測結果をビジュアルに表示する機能はありませんので、ここからは、手作業になります。ニューラルネットワークコンソールの結果格納フォルダ以下のように学習・評価した結果には番号が付与されています。ニューラルネットワークコンソールのインストールフォルダの下の、今学習・評価を実行しているプロジェクト名のフォルダの下に、この番号と同じ名前のフォルダがあるので、その下に行きましょう。すると、「0_0000」というフォルダがあります。始まるCSVファイルができてます。ここに、Output=inputから予測した結果がはいっています。単純に、その予測結果をデータを作成したEXCELに手作業で貼り付けて、結果を比較しています。結果はこんな感じです。平均して誤差率は3%前後でした。グラフで比較してみると、ほとんど重なってます。ノイズも何もはいっていないデータなので、この位の結果は当たり前ではあるのですけど、まあまあ、いい感じではないかなと、個人的には思います。なんとなく、RNNの雰囲気(・・ぽい)はありますしね。