22時10分のトマトサラダ

Yesterday is Tomorrow.

機械学習を用いた琵琶湖の天気予報(0)

すごく久しぶりに書きます。生きてます(?)

 

2年半くらい鳥人間をやっていたので、少し休憩でもしようかなと思っていたものの、何もしないのはもったいないので、機械学習を用いた琵琶湖の天気予報することにしました(?)!

 

 

 

トリコンを目指すにせよ、記録飛行を目指すにせよなんだかんだ琵琶湖は付いてきます。

 

データをうまく回収できるかどうか等あるので、難しいですが、風向風速予想を目標にやってみようと思います。

 

って事でとりあえず基本的なネットワークをHaskellで組みました。

今後これを改善・改良して行きますという話でした(?)

 

今はハンドルタイプの操舵桿の設計中です。

とっても難しいですね。

折れそう感バリバリで迷困ってます。

 

年末ってかもう今年も終わりです。

たくさんの方々にお世話になった1年でした。

ありがとうございました!

これからもなんらかの形でよろしくおねがいします!!!?!

 

以下完全に日記メモです!!

 

1.機械学習の準備

 

個人的には、機械学習の内容を理解するよりも、プログラムに苦戦しました。

今までC言語Pythonは軽く触れて楽しんでいたのですが、とっても軽くでした。

それなのになぜかHaskellを始めました。なぜかはわかりません。パッと見た感じカッコよかったからです。(?)

 

関数型最初はとっつきにくかったですが、思ったより好きです。

まだHaskellの真の力は一切使えていませんが、長期的な使用により会得したいと考えています。

 

 

Haskellに関しては”すごいH本”を一通り読みました。

完ぺきに理解してはいませんが、習うより慣れよ(?)ってことで すぐに始めちゃいました。

 

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

 

 

▼本元

Learn You a Haskell for Great Good!

bird

http://learnyouahaskell.com/chapters

 

機械学習を学ぶにあたっては超有名な↓を読みました。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

 

本ではPythonを使用して解説されています。それをHaskellに置き換えて(?)実行していく感じでした。

 

まぁそんなに難しくないだろうと思っていましたが、普通に大変でした。

Haskellに十分慣れた状態だったらまだしも、初心者がするには少々大変でした。

 

2.ネットワーク構築

 

まず最初に数値微分を用いたバージョンを作成しましたが、GOMIでした!!

(これを作成する過程でだいぶ勉強になったので良しとします。)

 

たくさんxたくさん行列の計算は普通のライブラリーには無理でした。

 

OpenBLASを入れていないと動かないhmatrixを使用しました。

 

さらっと書いていますが、僕のpcはWindows  です。最初は普通の端末でやっていましたが、一苦労ってか二、三苦労しました。文字化けパレードな上にすぐ不機嫌になります。

macかLinuxpcでも買うか迷っていたらちょうどWSLのWlinuxが出ました。

 

有料でしたが、なんか勢いありそうだし、Twitterも元気そうだったので買いました。

(なんかとんでもないくらい割引セールしてました。

 

ついでに、LinuxGUIアプリを表示できるやつも安くなっていたので買いました。

gnuplot使ってるので、必須感ありだったので(?)

 

 

それでもまあ重い重いの重いです。

軽い演算で数時間かかりました。

しかも、結果をいい感じにするには、相当時間かかると予想されたのでやめました!

 

誤差伝播法にシフトチェンジです。

 

 

機械学習でとても有名なMnistさんです。

↓が本元です。

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

 

学習用とテスト用の画像とラベルが入っています。

 

なんと、bytestringです!!おこ

初心者だった私にはこれを数字にするのにすごく苦労させられました!!

いま思うとなんてことは無いのですが、、

 

画像は28x28に分割されてそれぞれ0~255(?)の間で濃淡が指定されています。

 

試しにテストデータの画像をgnuplotで出すとこんな感じです。

f:id:nu2ki:20181220221441p:plain

これを1x784の行列としてネットワークに読み込ませます。

(画像の形状を維持したまま読み込んでいく(?)畳み込みニュートラルネットワーク(CNN)もありますが、画像・音声処理が目的ではないので保留です。)

 

f:id:nu2ki:20181220222811p:plain

 

Pythonではクラスというとっても便利なものがありますが、Haskellにはありません。クラスはありますが、pythonのそれとは違うものです。

 

困った私を救ってくれたのがあります。

 

A Functional Approach to Neural Networks by Amy de Buitléir, Michael Russell, Mark Daly

Issue 21 – The Monad.Reader

 

とてつもなくシンプルなネットワークをscanlという関数で解くというのですが、初心者には考えつかなかったです。

 

って事で、これをより強く(?)していきました。(本の内容に寄せる(?))

 

論文(?)中には、同じインプットを使用し続ければ誤差小さくなるよ!それで動いてるかチェックしてね!ってあったので確かめた大丈夫そうでした。

 

f:id:nu2ki:20181227203419p:image

 

って事で学習させていく過程の誤差を見るとまぁ動いてそうです。

 

f:id:nu2ki:20181227203550p:image

 

一安心です。

 

エポック等いじったりAdamGrad等に変えたりすると結果変わっていくのですが、何が適切だとかはまだわからないので要学習です。

 

多めの演算でも結構素早く計算してくれます。

コードの改善の余地は余地の方が広すぎるような状況でこれって思うとすごいですね誤差電播!

 

とりあえずある程度の実装は完了して隠れ層等ハイパーパラメータもいじれる感じにしたので、こっからどう自動的に決めよっかなって感じです(?)

 

遺伝的アルゴリズムにすごく惹かれています。

 

3.環境(?)

 

今はVS codeで書いていますが。

 

HaskellにはStack!!って記事がいっぱいあったので、とりあえずStackを使っています。

 

Home - The Haskell Tool Stack

 

 

Stackの使い方は、このサイトにとてもお世話になりました。

(すごく丁寧だしわかりやすいです。)

 

 

最初はHIEって言うVS code用のいろいろ便利なのを使っていましたが、とっても不機嫌ですぐエラって直してあげてエラってを繰り返したので、とりあえず消えてもらいました。

そのうち使うかもしれないです。

 

とても楽しいです。

 

おわり