<基礎学習>9/19-9/20 物体検出(SSD_Keras)をやってみた

今日書くこと

  • SSD_Kerasで、学習→推論ができるまで

SSD_Kerasを触った経緯

(「いきさつ」と打って変換すると「経緯」に変換されてびっくり。どうでもいいですね)

知人のお手伝いで物体検出をやっていて、その中でいいフレームワーク?がないかということで探していたところSSD_Kerasを見つけました。
物体検出のイメージとしてはこんな感じです。
f:id:kurupical:20170920195140p:plain:w500
ハイキューを彷彿とさせる絵面ですね

参考にしたサイト

ai-coordinator.jp

自分が詰まったところメモ

  • Trainingするソースどれやねん…
    SSD_training.ipynb。jupiterNotebookの形式らしいので、これを.pyに変換しました。
  • 学習終わらん…(Epoch 1/30でずっと止まる)
    →batch_size > テスト画像数になると駄目みたいで、ずっと止まります。具体的には以下。
gen = Generator(gt, bbox_util, 16, 'frames/',
                train_keys, val_keys,
                (input_shape[0], input_shape[1]), do_crop=False)

230行目あたりでGeneratorを生成する時に指定している第3引数がbatch_sizeです。
batch_sizeは、1回の学習に使うデータの数のことです。
デフォルトは16になっていますが、必要に応じて合わせる必要があります。 テストデータは1枚としていたので、ここを1に足す必要があります。

動かしてみた

f:id:kurupical:20170920200622p:plain:w500

できた!
あとは、学習データを増やしてみて、実用的なレベルまで持って行きたいです。

感想

  • インターネットすごい。こんな難しいこともググればすぐ出来るようになるなんて…。

所要時間

5時間程度でした。

<その他>9/18 「ゼロから作るDeepLearning」の読書会やってみた

osaka-prg-school.connpass.com

9/18に、書籍「ゼロから作るDeepLearning」の読書会を行ったので、メモ。 読書会は開催・参加ともに初めてでした。

開催の意図

  • DeepLearningやる仲間が欲しかった
  • DeepLearningを教えてみたかった

会場

いつも参加しているもくもく会のスペースをお借りすることができました。

読書会の進め方

  1. 15ページ〜20ページをその場で全員で黙読(1ページ/分)
  2. 書いてあったことの要約、分からなかったことをシェア

出た質問

  • 活性化関数として選ばれる「Sigmoid関数」「ReLU関数」はどう使い分けるの?
    →損失関数としてCrossEntropyを使う場合、活性化関数にSigmoid関数を使うのが相性がいいらしいです。
     でも、勾配消失するからSigmoidはあまりよくない?ReLUが基本的にはいいみたいです。
  • 「活性化関数が線形関数だと層を深くする意味がなくなる」が納得いかなかった
    →ちゃんと答えられず。

感想

  • 参加者ドタキャンを計算できなかったのが反省点です。定員4人、申込8人に対して最後来るの1人って笑
    次は多めに募集しておきたいです。
  • 上記のスタイルだと、構成するメンバーは2人〜3人が最適なのかなと思いました。
    6人参加だと、2人×3グループに分けるとか?

<基礎学習>9/14-9/16 AutoEncoder - あずにゃん、唯、りんごの特徴量を抽出する(2)

画像の特徴量分類

前回の続きです。
りんごの画像10枚、あずにゃん3枚、唯3枚を入力データとし、2次元に圧縮(特徴量抽出)しました。
f:id:kurupical:20170917185602p:plain:w400

赤:りんご
青:あずにゃん
黄:唯

人間とりんごを区別できました笑。

値動き分類

時価総額50億以下の銘柄の「過去300日の値動き」を2次元に圧縮してplotしてみました。
青色の点が、5日以内に+5%以上値上がりする銘柄。
黒色の点が、上記以外。
f:id:kurupical:20170917190937p:plain:w400

2次元では特徴量をつかめませんでした。

今回勉強になったこと

  • TensorFlowの理解が進みました!(重み・バイアスを取得する方法がわかった、sess.run()のおまじないが少しわかった、など…)
  • いいブログを見つけました。(AIだけでなく株式投資の考え方もめちゃくちゃ参考になります。)
    we.love-profit.com

雑感

  • 株価を分析するには、説明変数が圧倒的に不足していますね。。

<基礎学習>9/13 AutoEncoder - あずにゃん、唯、りんごの特徴量を抽出する

目次

  1. まえがき
  2. 概要
  3. AutoEncoderとは
  4. 今回のテスト
  5. その他

1.まえがき

僕はなぜ株のAIを作ろうと思ったのか?
根本は「AIを勉強する」ことだと思い直しました。

根本の欲求を満たすために、
①AI関連の技術を勉強し実装する(コードの綺麗さ度外視)
②株に当てはめて考えてみる
の流れで、いろんな技術を触ってみようと思います。
ミソは①。とにかくスピード重視、ソースコード汚いの大歓迎で新しいものを触りまくります。
今回は、その第一弾。AutoEncoderを触ってみました。
画像認識のお手伝いの時に教えてもらっていろいろ触っていたのですが、株にも応用してみます。

2.概要

仮説

株価がN%以上UPする前の値動き、N%以上DOWNする前の値動きって何か特徴あるんじゃない?

検証

AutoEncoderを使って、値動きデータを2次元に(むりやり)圧縮してプロット。
N%UPの集団とN%DOWNの点が離れている=特徴あり!

作業フロー

①簡単な実装:唯、あずにゃん、りんごの画像を学習させ、特徴を2次元にプロットする ②本番実装:N%以上UPする前の値動きおよびN%以上DOWNする前の値動きを学習させ、特徴を2次元にプロットする

3.AutoEncoderとは

  • 教師なし学習(教師データは入力層)
  • 入力データを圧縮→正確に復元できるようニューラルネットワークが学習する
  • 入力データを次元圧縮した値が特徴量になる
  • 概念としては機械学習の主成分分析に似てます(たぶん)

4.今回のテスト

今日は、簡単な実装をしてみました。

入力層

f:id:kurupical:20170913224600p:plain:w400
画像9枚を入力データとします。
・内容:りんご3枚、唯3枚、あずにゃん3枚。(本当はもっと取るべきなのですがめんどくさかった)
入力層の次元数は3000000次元です。(画像はプログラム内で1000*1000pxに圧縮するため、縦横で1000000pxです。さらに1pxごとにRGBの値があるため、入力層は10000000×3=3000000次元になります。)

圧縮

今回は2次元に圧縮します(=隠れニューロン数が2)。可視化のため2次元にしていますが、本当はもっと高次元にします。

結果

今回の例でいうと、3000000次元を2次元に圧縮し、3000000次元に復元する。その復元の精度を高めるための学習をするということになります。
上記の学習を行ったネットワークを使って、入力データ(3000000次元)を2次元に圧縮します。 その結果をplotしてみます。

…間違って消してしまったので、再学習させてます。結果はまた明日。

5.その他

ソースコード

以下にAutoEncoderのソース公開しています。
(テスト的に書いたベタ書きソースなので信じられないくらい汚いです)
github.com

所感

とりあえず、迷走するだけしてみようかなと思います。。笑

<株進捗>9/9-9/12 学習とバックテスト→一区切りつきました

学習→トレード

よい結果を残したパラメータを使って、「時価総額<20億」の銘柄2012年〜2016年のデータを20万回食わせてみました。
そして2017年1月〜7月でトレードさせてみたのですが、利益は出ず。
手数料込みで▲1.1%程度の成績でした。

今後

ここまで1ヶ月半、結構時間を費やしてきましたが成果は出ませんでした。
いろいろ粘りましたが、僕の今の発想や今の手法では勝てないんだろうと思います。
ちょっと一旦距離を置きます。

今後確実にやりたいこと

  • 一区切りついた感じがするので、どこかの時間で振り返ろうと思います。反省の多い1ヶ月半だったな…。
  • 信ぴょう性のある「先行事例」「論文」を読み漁ります。(個人のブログじゃなくて、ちゃんとした論文を)
    我流でやるのはやっぱり良くない。

今後考えること

  • 株予測に費やす時間を減らすか?
    (根本の目的は「AIの勉強」なので、自然言語処理など別の分野も触ってみたい)
  • 強化学習をやってみる?

その他ひとりごと

  • 今回の開発で、AI関係なく投資のシュミレーションができる環境が整いました。(過去200営業日で高値超えたあとの値動きのデータを時価総額別に集計する、など…)
    いろいろな分析に使えそうです。
  • 「AIにデータを食わせれば結果が出る」といった、AIに0から100までやらせるには時代が早すぎ?
    投資の世界では、AIはあくまで人間の判断を補助するレベルでしかないのかも?
  • 仮説→検証のサイクルが遅すぎる。

<株進捗>9/8 有望な学習モデルあらわる!

目次

  1. 学習させ続けてみた Day2
  2. その他

1.学習させ続けてみた Day2

9/3の記事で書いたことを淡々とやっていきます。

過去400日の値動きから翌5日、過去200日の値動きから翌3日、などいろいろな数字をチューニングした160パターンで学習テストしてみます。
次のブログでは良かったパラメータランキングを出してみようと思います。

6:50〜19:30の間処理を行い、出力された学習モデルの検証結果をひとつずつ確認していきました。

その中でなかなかよかった学習モデルが以下です。

1.パラメータ:

  • 過去400日のデータから10日先のデータを予想。
  • 3%以上上がる(=「買い」タイミング)かどうかを予想。
  • 隠れ層:4 1層あたりのノード数:30

2.検証結果:

2017-09-08 11:00:18,,「買い」タイミングで正しく買えた率:0.506053268765 (209件/413)
2017-09-08 11:00:18,,「買い」でないタイミングで誤って買った率:0.4775 (191件/400)

★評価:
413回あるチャンスのうち209回は+3%の利益を取れていて、なかなかいい成績だとおもいます。
誤判断してしまった191回の損益次第では、十分利益的です。

今回の処理で240種類のパラメータのうち上記を含み45の学習が終了したので、残り192種類です。
さらにいい結果のものがでるのを楽しみにしています。

2.その他

謎現象

学習の処理を13時間くらい動かしっぱなしにすると、「強制終了」と出て処理が止まってしまいます。
f:id:kurupical:20170908221645p:plain:w400
このエラーのせいで、1日中放置してぶん回せないのが不便です…。
ぐぐってもあまり有益な情報は出てこず。誰か教えてください><

ブログリンク貼ってみた

自分主催の読書会の案内のなかに、こっそりブログのリンク貼ってみました。
osaka-prg-school.connpass.com

ソースコード公開

以下でソースコード公開しています。
github.com

<株進捗>9/7 学習の途中経過(360銘柄中50銘柄完了)

目次

  1. 1日学習させ続けてみた
  2. その他

1. 1日学習させ続けてみた

昨日のブログで

過去400日の値動きから翌5日、過去200日の値動きから翌3日、などいろいろな数字をチューニングした160パターンで学習テストしてみます。
次のブログでは良かったパラメータランキングを出してみようと思います。

と書いていました。
(結局パターンは320に増えました。)
ブログを書いたあと、処理を流したのですが、メモリ不足で止まっていました。夜動かして翌朝は動いてたんですが…。
なので、50パターンくらいしか学習テストできていません。

所見

  • 層は4,8,15の3つでテストしました。15にすると、あまり良い結果が得られませんでした。
  • 過去N日の値動きから翌M日 のNの値を大きくすると、あまり良い結果が得られない傾向ありでした。

メモ:試した50パターンのうち比較的良かったデータ

  • ①<4層、隠れノード30><過去200日→翌5日><売買のしきい値:3%>
    • 「買い」タイミングで正しく「買い」予想できた率: 67/394 = 17%
    • 「買い」でないタイミングで誤って「買い」予想した率: 41/108 = 38%
  • ②<8層、隠れノード100><過去200日→翌10日><売買のしきい値:3%>
    • 「買い」タイミングで正しく「買い」予想できた率: 109/575 = 19%
    • 「買い」でないタイミングで誤って「買い」予想した率: 37/146 = 25%
  • ③<8層、隠れノード100><過去300日→翌5日><売買のしきい値:10%>
    • 「買い」タイミングで正しく「買い」予想できた率: 7/32 = 22%
    • 「買い」でないタイミングで誤って「買い」予想した率: 5/12 = 42%

①②はそれぞれ108回、146回取引しているのに対して③は12回しか取引していません。
が、③は10%以上の上げを的中率22%で当てています。

どっちがいいのか・・・と言われると、売買シュミレーションにかけてみてどれだけ利益でるかを試してみるしかないですね。
感覚的には、②は①の上位互換。③と②はそれぞれ性質が異なる。んじゃないかと思ってます。
③は一発あてちゃうタイプ、②はこつこつタイプって感じでしょうか。
①②のように取引回数を重ねると手数料がバカにならないので、1回取引あたりの利益率はあげたいところですが・・・。

あと300パターンも学習させて結果を見ます!
そのあと、よい結果を残したパラメータ(ベスト5くらい)に対して、さらに大量の銘柄で学習させてみてどうなるかをためします。

2.その他

画像認識、はじめました

今、知り合いの手伝いで画像認識も手をつけています。今やっていることはAutoEncoderの実装。
例えるなら…日本語の再和訳がどれだけ正しくできるのか、精度を上げていくようなイメージでしょうか。

日本語を英訳し、英訳したものを再度日本語訳するともとの日本語に戻るかと言われると、そんなことはないと思います。
「これはペンだよ」 → "This is a pen.“ → 「これはペンです。」
みたいな感じで。

コレをなんとか、
「これはペンだよ」 → "★" → 「これはペンだよ」 となるような英語を探すイメージです。

実際には、 りんごの画像(50px×50px)→ 100次元の行列 → りんごの画像(50px×50px)になります。

「りんごの画像」 → "★" → 「りんごの画像」
となるような100次元の行列★を学習する、ということをやっています。

なぜそんなよくわからないことをするのか?
また機会があれば説明しますが、一言で言うなら「特徴量抽出」を行うためです。
(自分もちゃんと理解していないので難しい言葉で逃げました。)

ソースコード公開しています

github.com