02 May 2017, 10:19

TOEICほぼ900点達成

2017年4月の公開テストで895(L475/R420)をとりました。

ほぼ、900です。自分の中ではもう十分TOEIC満足です。

どうやって、TOEIC900達成したか?それは・・・ひたすらバカみたいに努力したから。

1700時間勉強したのだ。

このFuturismoのブログ、2016年はほとんど記事を更新していない。なにをしていたかというと、ひたすらTOEICを勉強していた。

正直、エンジニアやめようかと思ってた。

このサイトに、勉強時間の目安が書いてある。400点の人でも1500時間で900可能らしい。

自分がTOEICの勉強をはじめたのが、2015年11月でその時点で805点。

たった、90点あげるために1700時間も費やした。自分はバカなんじゃないかと思う。そうとう効率が悪い。

いや、実際バカなのだった。IQが89しかない(平均は100)。心理テストの結果、言語能力が人並みよりも特に低いのだ。

それでも、能力は努力で克服できることを証明したくて、バカみたいに頑張り、諦めなかった。GRITを信じた。

その結果だ。

 

TOEIC900とっても、英語は喋れないし、相変わらずMOOCのレクチャーは分からないし、英文読むのはしんどい。

まだまだ英語全然できない。

とりあえず、もうTOEICはいいです。別のことに時間を使います。

02 May 2017, 09:38

Udemy 悪くないかもしれない、機械学習系の講座が充実。セールで大人買いしよう!

2017-05-02-183736_572x189_scrot.png

Udemy で実践データサイエンスを受けてる。これが悪くない。

初 Udemy です

初 Udemy の講座。今まで、Udemy はべらぼうな価格設定のため舐めてました。

通常の講座が 15000 円とか 25000 円とかなので、 こんな値段で購入する人いないでしょと思っていたけれども、 Udemy は 頻繁にセールをすることで有名らしい。年中セールをやっているとか。

通常の値段で購入する人は滅多にいないだろう。 私は、1200 円で購入しました。GW は 教師の日??とかいうキャンペーンをやってる。

4 月の頭にも、新生活応援キャンペーンを実施していた。

Udemy 悪くないかも

Udemy は 思っていたよりも悪くないと思う。Udemy については、 アフィリエイトのせいか、coursera や edX や Udacity に比べて宣伝のサイトがわんさかあるので、 Udemy がなにかを知りたいひとは、そのサイトへ。ベネッセがバックにいるらしい。

自分が高評価したのは、コンテンツがバラエティに富んでいるからだ。 日本語のコンテンツで探してはダメ、英語のコンテンツで検索すること。

coursera や Edx, Udacity は大学や大企業がバックについているけれども、 Udemy は個人が講座を開いているので、バラエティに富んでいる。

ここが高評価のポイント。日本語コンテンツがあるのもうれしいね。

自分が購入したもの、全部 10 $だよ

私は、以下の Machine Learning & Deep Learning の講座を全部 10 ドル 1200 円で大人買いした。

他にも、いろいろと 機械学習系の講座を購入。

その他、システムトレードに興味があるので、以下の講座を購入。

すべて10ドル。15 万以上割引で購入したと思う。もともとの価格設定が狂ってるけど。

購入した講座、全てやり切れないと思うけれども、セールに煽られて散財してしまった yo。

02 May 2017, 07:05

ダークな黒背景でクールにデータ解析!Jupyter Notebook Themes & Emacs KeyBinding

最近、Emacs よりも Jupyter Notebook の使用率が高いのだけれども(?!)、 今朝 twitter の タイムラインを眺めてたらこんなツイートが流れてきたので、飛びついた。

試してみたら、ものすごくクールだったので、スクショをとってみたのが以下。黒背景、メチャガチャクールだ。

Jupyter Themes

Jupyter Notebook を 黒背景にするには、Jupyter Themes という extentions を使う。

インストールは pip から。

pip install jupyterthemes

これで、jt コマンドが利用出来るようになる。

テーマは以下のテーマがある。私の大好きな monokai がある!!これは、うれしい! 他にも solarized の Light と Dark がある。

$ jt -l
Available Themes: 
   oceans16
   chesterish
   grade3
   solarizedl
   monokai
   onedork
   solarized-light

テーマの適用には、-t <theme> をつけて jt を呼ぶ。

jt -t monokai

フォルダはこんな感じ。

オプションに -N -T をつけると、ツールバーと ノート名を表示できる。

私の最終的な設定は、以下にした。 code のフォントは プログラミングに適していると言われている Ricty で有名な inconsolata。

jt -t monokai -f inconsolata -N -T 

追記

seaborn の縦軸横軸の表示が、背景が黒だとなにもみえなくなった。以下で解決。

custom_style = {'axes.labelcolor': 'white',
                'xtick.color': 'white',
                'ytick.color': 'white'}
sns.set_style("darkgrid", rc=custom_style)

Emacs KeyBindings

こうなったら、Emacs ライクに Jupyter Notebook をしようと思い、 Emacs ライクにキーバインディングをする方法も調べてみた。以下の extentions を入れる。

pip install jupyter-emacskeys

これで、コードを書くときに Emacs keyBindings が使える、と思ったがここで一つ問題が。 Ctrl + n は Emacs では 下に移動に割当たっているのだけれども、 ブラウザでは新しいウィンドウを開くに割り当てられているので、使えない。

これは、Ctrl + n で新しいウィンドウを開くのを無効にする firefox プラグイン、 “Menu Wizard”を入れることで解決できた。

このプラグイン、バグっているのか再起動すると、設定が消えるので、 ブラウザを立ち上げるたびに設定しないといけないのが難点。 Shift-Alt-M で設定画面が開くのでそこで設定する。

さよなら Emacs

これで Jupyter Notebook が markdown ではなく org-mode でかければ最強なのだけれどもそんなマイナーなニーズには対応していない。

とはいえ、データサイエンティストを目指すには Emacs とはおさらばだ!!

01 May 2017, 06:36

Kaggle のタイタニック問題に Keras で挑戦した。前処理が課題だと分かった。

Kaggle のタイタニック問題に Keras で挑戦しました。

前置き

タイタニック問題は、Kaggle の看板コンペということで、いろんな人が挑戦している。

自分も早くデータサイエンティストになりたいので、登竜門であるコンペに挑戦してみた。

タイトルが、Titanic: Machine Learning from Disaster とある通り、機械学習を 使って問題を解くことが求められているのだけれども、自分の ToolBox には、 ニューラルネットワーク一本槍しかない。

他の手法も身につけたいのだけれども、他にも手を出すと知識が発散してしまうので、 今はニューラルネットワークひとつにかけている。

最近 Keras をいじりはじめたので、Keras でニューラルネットワークを組んで問題に挑戦してみた。

考察

モデルのチューニングが難しい。

以下のようなモデルを組んでみたのだけれども、精度が 75%。 これで上位 90% という惨憺たる結果。

# create model
model = Sequential()
model.add(Dense(64, input_shape=(8,)))

for i in range(0, 8):
    model.add(Dense(units=64))
    model.add(Activation('relu'))

model.add(Dense(units=1))
model.add(Activation('linear'))

model.compile(loss='mean_squared_error', optimizer='rmsprop')

9 層の Dense レイヤ(Relu 関数で activate) のあとに、1 ノードの出力層を設けた。 コスト関数は、最小二乗誤差、最適化手法は RMSProp.

Bach Norm や Dropout 層を入れることも検討したのだけれども、そうすると精度が下がる。 この設計以上にシンプルにしたり、複雑にしてみたりしたのだけれども、精度が下がる。

チューニング方法が試行錯誤なので、難しい。いい方法がないか、考察中。 チューニングにベストプラクティスはあるのだろうか?直感に頼るしかないのだろうか? 経験を積めば、知識が増えて、いい方法がすぐに思いついたりするのだろうか?

前処理はズルをしました

どういう特徴量を使うかは、以下の記事を参考(パクリ)にしました。

本当は、以下のようなデータ分析をしてデータの傾向を見る必要があるのだけれども、 そういうスキルが自分にはまだない。これから時間をかけて身につけていく。

おそらくだけれども、この前処理の段階を改善することで、精度がグンと上がるのだと思う。 Udemy に参考になりそうな講座がいくつかあるので、購入しようか検討中。(追記:セールだったので購入した。1200 円!)

そういう気づきを得られただけでも、今回参加した価値はあったと思う。 とにかく動くことで課題が明確になる。

コード

github に jupyter notebook をアップロードしました。

29 Apr 2017, 22:10

3 つの戦略で Overfitting を撃退!Tensorflow v1.1 を使って CNN で MNIST に挑んだ

はじめに

fast.ai の Practical Deep Learning for Coders を受けてます。week3 のテーマは overfitting. いかにして、overfitting を防いで精度を向上させるかという話。 理論のあと実際の MNIST のデータを使って精度を向上させるレクチャーがあった。

先週、ちょうど Kaggle の手書き数字認識に挑戦していたので、 今回習ったことを Kaggle に適用してみて、精度が実際どうなるか見てみました。

また、先週 tensorflow 1.1 がリリースされて、 TensorFlow から Keras の機能が使えるようになったので、 それも試してみました。

結論から書くと、1050 位から 342 位への大躍進!上位 20%に近づきました。

Overfitting を防ぐ戦略

Overfitting とは

まずは、Overfitting についておさらい。過学習ともいう。

Overfitting とは、訓練データの精度はいいのだけれども未知のデータの精度が悪いこと。 モデルが汎化されていない状態を指す。

どうやって、確認するかというと、訓練データの他に Validation データを用意して Training のときに、訓練データと validation データの精度を出す。 もし、訓練データの精度がいいけれども、validation データの精度が悪いと Overfitting が起こっている可能性が高い。

Overfitting

OverFitting を防ぐ戦略

講義の中では、以下のステップで対策することが示される。

  1. Add more data
  2. Use data augmentation
  3. Use architectures that generalize well
  4. Add regularization
  5. Reduce architecture complexity.

とくに、2 と 4 に関して、実践的な手法である

  • Dropout
  • Data Augmentation,
  • Bach Normalization

が示される。

Dropout

階層の深いニューラルネットワークを精度よく最適化するために Hinton 教授 たちによって提案された手法。

その手法とは、ニューロンをランダムに消去しながら学習する手法。 訓練時に隠れ層のニューロンをランダムに選び出し、 その選び出したニューロンを消去する。

こんな手法で過学習を防げるのかとはじめは驚いたものの、 確かにこれで精度が出るのだ。

今回は、以下のクラスを利用した。

Data Augmentation

画像データを妥当な修正を加えることで、追加合成データを作成すること。 たとえば、ひっくり返したり、回したり、ズームしたり、クリッピングしたり、 色を変更したりなどなど。

参考:

Tensorflow(keras)には、ImageDataGenerator というクラスがあり、これを利用する。

Bach Normalization

Bach Normalization とは、 各層でのアクティベーションの分布を適度な広がりを持つように調整すること。

前処理として、データを加工することはよくやることだけれども、 アクティベーションされた分布に処理を加えることが特徴。これによって、

  • 学習を速く進行させることができる(学習係数を大きくすることができる)
  • 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくてよい)
  • 学習を抑制する(Dropout などの必要性を減らす)

などの利点がある。

Tensorflow(keras) では、以下のクラスがある。

MNIST に挑戦

今回は、以下の Keras(backend は Theano)を Tensorflow v1.1 にポーティングした。

今回作成した、自分の Jupyter Notebook は以下。

以下、コードの抜粋を以下に示す。

まずは、import。tensorflow.contrib.keras.python.keras と書く。 この書き方がわからずハマった。

import tensorflow as tf
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Flatten, Dense, Dropout, Lambda, Conv2D, BatchNormalization, MaxPool2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator

ネットワークを構成。ちょくちょく BatchNormalization の層が入っているところがポイント。 Dropout 層も出口のところに設けてある。

def get_model_bn_do():
    model = Sequential()
    model.add(Lambda(norm_input, input_shape=(28,28,1)))
    model.add(Conv2D(filters=32,kernel_size=(3,3), activation='relu'))
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=32,kernel_size=(3,3), activation='relu'))
    model.add(MaxPool2D())
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=64,kernel_size=(3,3), activation='relu'))
    model.add(BatchNormalization(axis=1))
    model.add(Conv2D(filters=64,kernel_size=(3,3), activation='relu'))
    model.add(MaxPool2D())
    model.add(Flatten())
    model.add(BatchNormalization())
    model.add(Dense(512, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))
    model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    return model

以下のようなネットワークができあがる。

Layer (type)                 Output Shape              Param #   
=================================================================
lambda_1 (Lambda)            (None, 28, 28, 1)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
batch_normalization_1 (Batch (None, 26, 26, 32)        104       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 24, 24, 32)        9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 32)        0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 12, 12, 32)        48        
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 10, 10, 64)        18496     
_________________________________________________________________
batch_normalization_3 (Batch (None, 10, 10, 64)        40        
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 8, 8, 64)          36928     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 4, 4, 64)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 1024)              0         
_________________________________________________________________
batch_normalization_4 (Batch (None, 1024)              4096      
_________________________________________________________________
dense_1 (Dense)              (None, 512)               524800    
_________________________________________________________________
batch_normalization_5 (Batch (None, 512)               2048      
_________________________________________________________________
dropout_1 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 601,258.0
Trainable params: 598,090.0
Non-trainable params: 3,168.0

data augmentation を ImageDataGenerator で実施する。 パラメータでいろいろ変更できるようになっている。

gen = ImageDataGenerator(rotation_range=8, width_shift_range=0.08, shear_range=0.3,
                            height_shift_range=0.08, zoom_range=0.08)
batches = gen.flow(features, labels, batch_size=batch_size)
test_batches = gen.flow(valid_features, valid_labels, batch_size=batch_size)

fit_generator で学習。ちなみに、train_on_batch 関数だと、メモリ枯渇を起こした。

model.fit_generator(batches, batches.n//batch_size, epochs=1,
                    validation_data=test_batches, validation_steps=test_batches.n//batch_size)

predict_classes 関数でテストデータを予測。

classes = model.predict_classes(test_features)

27 Apr 2017, 14:14

Udacity で Deep Learning Nanodegree Foundation を受講してる

Udacity で Deep Learning Nanodegree Foundation を受講してます。 -> 追記: 受講が終わりました

MOOC を受けるのは、31 回目だけれども、 Udacity Nanodegree は今回が始めて。なにしろ、学費が 599 ドル(= 6.5 万)というお値段。

13 が終わったので、少しずつまとめていこうと思う。 未完成だけれども、続きは、毎週更新する予定です。

概要

Youtube Star の Siraj Raval

日本では知られていない、Deep Learning 界の Youtube Star, Siraj Raval が Deep Learning の手法を教えてくれる。

動画がとにかくおもしろい。まずは動画紹介。

授業の流れ

授業は、Siraj さんと mat さんの動画を元に進められる。

  • Siraj’s introductory video & One hour coding session
  • Additional lesson(s) from Mat & other Udacity experts

毎週 mat 先生の動画が公開されて、それを見てミニクイズやミニプロジェクトを解いていく。 それとは別に、siraj さんのライブコーディングセッションが youtube で放送される。

Projects

毎月一回、Project が assignment として課される。

  • Project 1 Your First Neural Network
  • Project 2 Image Classification
  • Project 3 Generate TV Scripts
  • Project 4 Translate a Language
  • Project 5 Generate Faces

どんな課題か見てみたい人は、github の問題用リポジトリを参照するのがよい。

project の解答 を提出すると、Udacity のレビューアーにレビューされる (ここが驚いた。高い学費を払っているだけあって、手厚いサポート) 解答内容が不十分だったり、間違っている場合は、リジェクトされて再提出が求められる。

わからない場合は、フォーラムを見たり、slack で議論したりする。 slack には、なんと#Japan のチャンネルがあり、日本語 OK.

受講者人数

1 月に初めのコースが始まり、3 月に 2 回目のコースが始まった。自分は 3 月 から参加。

登録者数は 1 月が 5000 人くらい?3 月が 1500 人くらい(slack の人数より)

日本人は、50 人くらい。

Syllabus

1 月と 3 月では、シラバスの内容が少し違う。今後も feedback を元に変わる可能性あり。

Week 1: Introduction to Deep Learning
Week 2: Model Evaluation and Validation
Week 3: Graph computations
Week 4: Intro to TensorFlow
Week 5: Deep Neural Networks
Week 6: Convolutional Networks
Week 7: Recurrent Neural Networks
Week 8: Word Embeddings
Week 9: Using TensorBoard
Week 10: Text Generation
Week 11: Sequence to Sequence Generation
Week 12: Transfer Learning
Week 13: Reinforcement Learning
Week 14: Autoencoders
Week 15: Generative Adversarial Networks (GAN)
Week 16: Image Generation

扱う手法は、NN, CNN, RNN, GAN と,Deep Learning の主要な手法をカバーしている。

扱うトピックは、 感情判定、画像識別、株価の予測、テキスト生成、 Word2Vec, 自然言語処理、音楽生成、チャットボット、 ゲームプレイ、画像生成 …

難易度と学習時間

シラバスによると、8-12 時間の勉強時間の確保が必要とのこと。 自分の場合は、だいたい 10 時間くらい勉強すれば消化できた。

難易度なのだけれども、今のところは難しくなく、ついていくことが出来る。 複雑な数式もでてこないので、高校生だって受けることが出来ると思う。

CNN は、難しい部分は tensorflow に任せてしまい、 tensorflow の使い方を学ぶ印象を受けた。

Siraj’s Live Coding Session

Siraj さんのライブコーディングでは以下のトピックがあつかわれる。

  • Week 1 (329): Linear Regression
  • Week 2 (45): Tensorboard
  • Week 3 (412): Reinforcement Learning with Games
  • Week 4 (419): Image Compression
  • Week 5 (426): Visualizing Networks (GAN)
  • Week 6 (53): Generative Models (GAN)
  • Week 7 (510): Classification
  • Week 8 (517): Dimensionality Reduction
  • Week 9 (524): Data Visualization
  • Week 10 (531): Math terminology
  • Week 11 (67): Cloud Computing overview (AWS, google cloud, etc.)
  • Week 12 (614): Anomaly Detection
  • Week 13 (621): Stock Prediction
  • Week 14 (628): Video Generation
  • Week 15 (75): GANs for audio generation
  • Week 16 (712): GANs for video generation
  • Week 17 (719) : Probabilistic Programming

学習メモ

以下は、各回の概要をメモしたもの。参考までに。。。

  1. Neural Network =================

week1: Introduction to Deep Learning

はじめに anaconda や 線形代数の基礎と numpy、 Jupyter Notebook の使い方などが紹介される。

そのあと、ニューラルネットワーク。 パーセプトロンからはじまり、Gradient Descent, Backpropagation が説明される。

input と output レイヤだけの初歩から説明されて、 次に hidden レイヤが説明されるので、とてもわかりやすい。

Project1: Your First Neural Network

ニューラルネットワークを組んで、自転車の貸し出し台数を予測する。 numpy だけでニューラルネットを組む。

自分はゼロから作る Deep Learning を途中まで読んだのだけれども、 このプロジェクトのやろうとしていることは、この本と同じ。 よい復習にもなったし、逆にこの本を読んでいたから理解が助かった。

Project1 ができなかったら、refund してこの講座を諦めようと思っていた。 なんとか提出できて、リジェクトもされなかったので、このまま受けることにした。

(Machine Learning Nanodegree を受けている Studyplus の友達は、 Project の出来が悪いとリジェクトされて再提出を求められるといっていた)

  1. Convolutional Neural Network ===============================

week2: Graph Computations

TensorFlow の基礎となる Graph Computations を学び、 MiniFlow という Tensorflow のミニバージョンを自作する。 といっても、これは week1 の復習 Quiz のようなもの。 また、手取り足取りの説明なので、すごく簡単。

またこの週では、データの前処理, モデルの評価や Validation にも触れられる。

モデルの評価は、coursera ML でやったものと同じ。

week3: Sentiment Analysis

センチメント分析がテーマ。

Andrew Trask さんが登場し、ニューラルネットワークを利用して、センチメント分析を実施する。 この講義の目的は、いかにしてニューラルネットワークの精度を向上させるかと学習を高速化させるか。

はじめは、精度が 65%くらいしかないのだが、 あの手この手の工夫をすることで 95%以上にまでもっていく。 さらには学習の速度もはじめにくらべると爆速にもっていく。

チューニングでこれほど差がでるものかと驚いた。

また、この週では、TFLearn というライブラリが紹介される。 これをつかうと、ニューラルネットがシンプルに数行で構築できる。 バックプロパゲーションとか頑張ったのはなんだったんだよ!と思うほど、驚く。

week4: Intro to TensorFlow

TensorFlow の登場。やっと 4 週目にしてでてきた感がある。

TensorFlow の基礎文法をまなび、基本的な 2 層のニューラルネットを組む。 また、ロジスティック回帰について学ぶ。

この週は、今までで一番楽な週だった。

week5: Deep Neural Networks

Google AWS で GPU をつかう方法が示される。 この DLND をとっている生徒は、100 ドルの無料クーボンがもらえるのだ。 これで AWS で GPU を使って計算を高速化できる。また、FloydHub も紹介される。

といっても自分は別の用途で AWS をガンガン使ってしまったのでピンチ。

TenosorFlow で前回は、2 層のニューラルネットワークだったが、 それを 3 層のニューラルネットワークにする。

と同時に、オーバーフィッティングを防ぐ方法として、 正則化と Dropout の手法が紹介される。

week6: Convolutional Networks

Convolution Networks の説明。 畳み込みとプーリングの説明があったあと、 tensorflow でどう実装していくかが解説される

重みやバイアスの初期化方法についても言及される。

Project2 Image Classification

CIFAR10 の画像データを CNN で分類するというプロジェクト。

ネットワークは、week6 で与えられたコードを少し工夫すれば構築できるけれども、 ネットワークのパラメータを調整して精度をだすことに苦戦した。

最終的には、67% の精度がでた。合格ラインは 50% と低めなので、いい感じ。

  1. Recurrent Neural Network ===========================

week7: Recurrent Neural Network

Recurrent Neural Network の説明。 といっても、簡素な説明なので、ほとんどわからなかった! 参考リンクを示されてここ読んでおいてね、ということだった。

実践的な演習として、アンナ・カレーニナの小説を元に、文章を生成するものが 与えられる。TensorFlow を使って、LSTM を実装するのだが、 これが答えも一緒に示されるので、結構簡単に実装出来てしまう。

理論はまったくわからないが、実装出来てしまうので、これでいいのか??

別枠として、LSTM で株の予想をしようという Siraj さんのビデオがある。

week8: Word Embeddings

Word Embeddings がテーマということで、Skip-gram モデルの word2vec を自前で実装するというもの。

例のごとく、サンプルコードが与えられて、穴埋めしていく形で進められる。

論文やブログのリンクがはられて、読んでおいてねとのこと。外部リンクを読むことが前提みたい。

この日本語記事がイラスト付きでとてもわかりやすかった。大感謝!!

text8 という英語のテキストデータを学習する。 ニューラルネットの仕組みは簡単だったが、前処理が難しくて理解度がうすい。

  • SubSampling
  • Negative sampling

この Word2Vec を利用して、自分の Twitter アカウントを分析してみた。

Siraj さんのビデオは Style Transfer について。

これは、CADL で以前勉強していたので、深くは調べなかった。

FloydHub 創立者たちとのインタビュー動画もボーナスとしてあった。なんか、Udacity は FloydHub 推奨しているみたい。

week9: Using TensorBoard

TensorBorad を使う方法について。

TensorBoard は精度や Loss を可視化するのに便利だと思っていた。 今まで、闇雲にハイパーパラメータを探していたのだけれども、TensorBoard を使って探す方法を学んだ。

Keras でも TensorBoard は使えるみたい。

Siraj さんの動画は、Music Generation(音楽生成)。とても興味があるトピック。待ってました\^-\^

LSTM で音楽を学習させてみようということなのだけれども、 動画はよくわからなかった。しかし、ここで諦めてはいけない。 Siraj さんの動画は大抵数行のコードと大量の参照リンクなので自学自習が必要なのだ。

いろいろディープラーニングと音楽生成の関係を調べていくうちに、 char-rnn で音楽生成をしている事例がたくさん見つかった。なので、私もやってみた!

week10: Text Generation

テキスト生成。week8 では、文字ベースの文章生成をあつかったけれども、 ここでは単語ベースの文章生成。

この週では、Project3 が課せられたので、まずは準備として、 RNN による センチメント分析をおこなった。 複数の input に対して一つの output を出力する RNN.

センチメント分析は week3 で扱ったのだが、それを RNN という別の角度から再実施する。

Project3 Generate TV Scripts

有名テレビアニメ、ザ・シンプソンズのテレビスクリプトを学習し、 word ベースの RNN を使ってテレビスクリプトを生成しようという Project.

いつもながら、プロジェクトは演習のコピペでできてしまうので、簡単。

week11: Sequence to Sequence/Chatbot QA System with voice

複数の Input に対して、複数の Output を返す RNN のアーキテクチャの紹介。

この週は、わけがわからなかったな。はじめての挫折。

week12: Transfer Learning

転移学習。このトピックは大事。Kaggle などのデータ分析コンペで有用な手法。

この週の課題は、外部のリポジトリを使って tensorflow で vgg16 を使って、花の分類をする。

私は、fast.ai でこの転移学習についてたくさん学んでいたので、この週では学ぶことは少なかった。 逆に言えば、fast.ai の lesson1 をみることをつよくオススメしたい。lesson1 には日本語字幕もある!

week13: Reinforcement Learning

強化学習。ここでは、Deep Q-Network が紹介される。 強化学習はそれ自体大きな一つの分野なので、一週間で紹介するには無理があるのではと思った。

このあたりから、自分の興味は、Deep Learning から強化学習に移りはじめる。 なので、GAN はあまり理解できていない。

演習問題では、OpenAI Gym の CartPole 問題を Tensorflow を使って DQN でとく。 かなりいい結果がでて驚く。

これを参考に、Keras や Numpy で再実装を実施してみたのだが、思うように結果が出なかった。

Project4 Translate a Language

機械翻訳。英語からフランス語への翻訳を実施する。

難しそうだけれども、いつも通りスケルトンのコードが与えられて、week11 を参考にして穴埋めしていく。

フランス語がわからないので、翻訳結果が正しいのかはわからないけれども、一応できた。

この課題を参考に、チャットボットをつくってみたのだけれども、

<PAD><PAD><PAD><PAD><PAD><PAD>…

しか応答してくれない。 なにが悪いのかもあまり理解していないので、追いきれない。 チャットボットは後味が悪いけれども、ここまでにする。

  1. Generative Adversarial Network =================================

week14: Autoencoders

自己符号化器。

week15: Generative Adversarial Networks

ここから GAN が始まる。

Deep Learning Book の著者, GAN の提唱者、 Ian GoodFellow さんが登場し、GAN について解説してくれる。若い!

MNIST を GAN で生成することをする。すごいけど、仕組みが複雑で難しい。。。

week16: Image Generation

前回に引き続いて、GAN. Deep Convolution GAN(DCGAN) が説明される。

CNN でつかった Convolution の関数が出てくるところ意外は、MNIST の GAN と同じ。 ただし、プーリング層はでてこない。

また、Batch Normalization が登場する。これが GAN の性能をよくする。

看板の数字??を題材にして、DCGAN をする演習がある。

Project5 Generate Faces

最終課題は、DCGAN で MNIST と CelebA のデータセットを使って、画像生成をすること。

GAN をあまり理解していないのだが、DCGAN の回の Jupyter Notebook のコピペでなんとか乗り切った。

まとめ

この NanoDegree は超初心者向け、簡単

広範囲をカバーして難しそうなイメージを持っていたけれども、実際やってみると、難しい数式はでてこない。

講義は Jupyter Notebook で手取り足取りな丁寧さでかかれている。

Project は Lecture の Jupyter Notebook のコピペでクリアできたり、簡単。

ひとによっては、この難易度では物足りないのではないかとすら思う。自分にはちょうど良いレベル。

こんな自分でもできました

はじめ自分は DeepLearning はとても難しいものだと思っていた。

なので、こういうステップを踏んで入門しようと思っていた。

  1. 大学 1,2 年の数学を復習
  2. 機械学習を勉強する
  3. Deep Learning を勉強する

しかし、いざ Deep Learning の世界に踏み込んでみると、 数学すら怪しい自分でも、なんとかついていくことができた。

普通に CNN をバリバリ実装して kaggle にチャレンジとかできている。

fast.ai の理念

現在、Udacity DLND の裏で fast.ai が提供する MOOC, Practical Deep Learning for Coders というものを受けているのだけれども、 この MOOC の理念が素晴らしいので引用したい。

The purpose of this course is to make deep learning accessible to those individuals who may or may not possess a strong background in machine learning or mathematics.

We strongly believe that deep learning will be transformative in any application; as such, this course is designed for individuals who possess a background in computer programming and would like to apply these techniques to their domain of expertise.

つまり、Deep Learning は 数学者や物理学者のためのものでなくて、 CS のバックグラウンドを持つ全ての人に開かれるべきだという主張だ。

なんか、fast.ai の宣伝になってしまったが、Udacity の DLND はそういう部分がある。 理論は抑えるものの、より実践的に tensorflow を利用して現実につかっていくかにフォーカスしているように思える。

Deep Learning で世界をハック

恐れずに、Deep Learning に飛び込んでみよう。きっと面白いハッキングができるようになるはずだ。

Udacity のコースは、面白いハッキングの材料を提供してくれるはずだ。

以上、Happy Hacking!!

26 Apr 2017, 07:22

Vgg16 モデルを使って Kaggle の Dogs vs Cats をやってみた

fast.ai の Practical Deep Learning for Coders の week2 の課題で、 勉強の理解のために、スクラッチで教えた内容を自分で実装してみてねと書かれていたので、やってみた。

はじめに

Practical Deep Learning for Coders では、 Kaggle の Compatition Dogs vs. Cats Redux| Kaggle に参加することが課題に課せられるのだが、 week1 でいきなり、上位 50% に入ってねという課題が出される。

無理だよ!と思ったのだけれども、week2 で上位 50%に入るための種明かしをしてくれる。 それが、vgg16 モデルを使った fine-tuning による転移学習。これについては、以下の記事がとても参考になった。

課題をスクラッチではなく(できないので)、与えられたコードコピペしまくりでなんとか実装してみた。元ネタこれ。

今回の課題の jupyter notebook は github に あるので、ここではコードを抜粋して載せる。

実装の抜粋

Rearrange image files into their respective directories

まずは、kaggle からデータを持ってきて、以下のようなディレクトクリ構造をつくる。 分類クラスごとにサブディレクトリ(dogs, cats, unknown)を作ることによって、 Keras の ImageDataGenerator がうまいこと処理してくれる。

├── test
│   └── unknown
├── train
│   ├── cats
│   └── dogs
└── valid
    ├── cats
    └── dogs

Finetune and Train model

VGG モデルを作成する。

def ConvBlock(layers, model, filters):
    for i in range(layers):
        model.add(ZeroPadding2D((1,1)))
        model.add(Convolution2D(filters, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

def FCBlock(model):
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
# Mean of each channel as provided by VGG researchers
vgg_mean = np.array([123.68, 116.779, 103.939]).reshape((3,1,1))

def vgg_preprocess(x):
    x = x - vgg_mean     # subtract mean
    return x[:, ::-1]    # reverse axis bgr->rgb

def VGG_16():
    model = Sequential()
    model.add(Lambda(vgg_preprocess, input_shape=(3,224,224)))
    ConvBlock(2, model, 64)
    ConvBlock(2, model, 128)
    ConvBlock(3, model, 256)
    ConvBlock(3, model, 512)
    ConvBlock(3, model, 512)
    model.add(Flatten())
    FCBlock(model)
    FCBlock(model)
    model.add(Dense(1000, activation='softmax'))
    return model


def finetune(model, num_classes):
    # remove last layer
    model.pop()
    # set all layers untrainable.
    for layer in model.layers: layer.trainable=False
    # add new layer
    model.add(Dense(num_classes, activation='softmax'))
    model.compile(optimizer=Adam(lr=0.001),
                loss='categorical_crossentropy', metrics=['accuracy'])
    return model

def get_batches(path, dirname, gen=image.ImageDataGenerator(), shuffle=True,
                batch_size=64, class_mode='categorical'):
    return gen.flow_from_directory(path+dirname, target_size=(224,224),
                class_mode=class_mode, shuffle=shuffle, batch_size=batch_size)

そして、学習済みの重みを fast.ai のサーバから手に入れる。

wget http://files.fast.ai/models/vgg16.h5

ここ からもダウンロードできる。

なお、keras1.2.0 では、ここによると、 VGG16 モデルが keras.applications.vgg16 モジュールに実装されているらしい。

つまり、自分のやり方は古いということだ!!

model = VGG_16()

# load pre-trained weights!!!
model.load_weights('vgg16.h5')

# remove last layer and add new layer
ftmodel = finetune(model, 2)

print ftmodel.summary() で 最後の層に出力が 2 のレイヤが追加されたことを確認する。

dense_4 (Dense)                  (None, 2)             8194        dropout_2[0][0]                  

追加した層を犬猫判定ように調整する。

batch_size=64
path = DATA_HOME_DIR

batches = get_batches(path,'train', batch_size=batch_size)
val_batches = get_batches(path,'valid', batch_size=batch_size)

# train finetuned model(only last layer)
no_of_epochs=1

for epoch in range(no_of_epochs):
    print "Running epoch: %d" % epoch
    ftmodel.fit_generator(batches, samples_per_epoch=batches.nb_sample, nb_epoch=1,
                validation_data=val_batches, nb_val_samples=val_batches.nb_sample)
    latest_weights_filename = 'ft%d.h5' % epoch
    ftmodel.save_weights(latest_weights_filename)

Generate predictions

test データから犬猫の確率を推測。preds には[猫,犬]とデータが入っている。

test_batches = get_batches(path, 'test', batch_size=2*batch_size, class_mode=None)
preds = ftmodel.predict_generator(test_batches, test_batches.nb_sample)

19 Apr 2017, 11:22

TensorFlow で学ぶディープラーニング入門を読んだ。Kaggle で実践してみた。

TensorFlow で学ぶディープラーニング入門~畳み込みニューラルネットワーク徹底解説を読みました。

概要と感想

この本は、 手書き文字の認識処理を MNIST データを利用してすることが目的。

また、Tensorflow で 畳み込みニューラルネットワーク(CNN)を実装することが目的。

章をおうごとにソースコードがパワーアップしていき、認識精度が上がっていくところが面白い。

  • 2 章: Softmax をつかった多項分類器
  • 3 章:
    • 2.単層ニューラルネットワーク
    • 3.多層ニューラルネットワーク
  • 4 章: 単層 CNN
  • 5 章: 多層 CNN

本のはじめににも書いてあるけれども、この本は TensorFlow の公式 Web サイトのチュートリアルで 「Deep MNIST for Experts」として紹介されているものをほぼそのまま採用しているそうだ。

私は、公式サイトは読んでいないから差分がどうこういうことはできないけれども、 数式を交えて丁寧に解説されていて、わかりやすいと感じた。

なお、Jupyter Notebook が提供されていて、 自分の環境で動かしながら勉強できるところがとても気に入った。

この本で提示されている「機械学習の 3 ステップ」が心に残ったので、引用したい。

[sourcecode language=”text” title=”” ]
①与えられたデータを元にして、未知のデータを予測する数式を考える
②数式に含まれるパラメーターの良し悪しを判断する誤差関数を用意する
③誤差関数を最小にするようにパラメーターの値を決定する
[/sourcecode]

TensorFlow について、この本ででてくるコードは毎回似たようなことをしているので、 はじめは困惑したのだけれども、繰り返し見ているうちにすらすら意味がわかるようになった。 入門レベルとしては、十分力がついたと思う。

環境構築は Anaconda をつかった

この本には、Docker をつかって環境構築をするように書いてあったのだけれども、 自分は、Anaconda を利用して読みめてみた。

ツールのバージョンも以下で読んだ。

  • Anaconda 4.3.16
  • Python 3.6
  • TensorFlow 1.0.1

ところどころ元のソースコードに修正が必要になったけれども、全て問題なく動作した。

自分がした修正は以下のリポジトリにあります。

Kaggle で実力試しをした

2017 年現在、Kaggle で MNIST をりようしたコンペが主催されている。

私は、各章を読み終わるたびに、理解度を深めるために Kaggle の MNIST のコンペに挑戦した。

これはとてもよい、また楽しい復習方法なので、ぜひオススメしたい。

ただし、この本を参考に実装した結果は、1150 位で 上位 1000 位以内にも入れないけれどもね。

19 Apr 2017, 10:40

DeepLearning 用 Heroku!FloydHub で Jupyter Notebook を動かした

Kaggle に 挑戦しているのだが、 自分の 非力な ノート PC で DeepLearning を勉強するのに限界を感じてきたので、 DeepLearning 用のクラウドサービス FloydHub で GPU を使ってみた!

FloydHub とは

DeepLearning 専用の Platform-as-a-Service(PAAS).

Web サイトいわく、DeepLearning 用の Heroku だそうだ。

なにがうれしいかというと、100 時間分フリートライアルで GPU が無料で使えるのだ。

Google の AWS を使ったことがないので、どっちがお得がわからないのだけれども、 とりあえず無料トライアル分だけ遊ぶのもよし、使用料を払って使うもよし。

詳しくは、料金表を見てください。

Floyd インストール

floyd は CLI が用意されているので、pip でインストール。

$ pip install -U floyd-cli

続いて login

$ floyd login

token を取得するために WEB ブラウザが立ち上がるので、 token をコピペすれば、認証完了。

FloydHub で Jupyter Notebook を使う

今回は、この jupyter notebook を動かした。

公式ドキュメントは以下にある。

jupyter notebook の アップロード

jupyter notebook があるディレクトリに移動して、floyd init <プロジェクト名> で初期化。

$ floyd init kg-digit-recognizer
Project "kg-digit-recognizer" initialized in current directory

Input データのアップロード

Input データは、実行用ファイルとは別に管理される。

まずは、データがあるディレクトリに移動して、floyd data init を打つ。

$ floyd data init kg-digit-recognizer
Data source "kg-digit-recognizer" initialized in current directory

    You can now upload your data to Floyd by:
        floyd data upload

次にサーバにアップロードする。

$ floyd data upload
Compressing data ...
Creating data source. Total upload size: 14.2MiB
Uploading compressed data ...
Done=============================] 14909284/14909284 - 00:00:16
Upload finished
DATA ID                 NAME                              VERSION
----------------------  ------------------------------  ---------
adkR2QJxDeUDBS4ZTdqDCW  tsu_nera/kg-digit-recognizer:1          1

Jupyter mode で Floyd 起動

jupyter notebook があるディレクトリに戻ってきて、floyd run を打って起動。

このとき、オプションに

  • –mode jupyter をつけると jupyter notebook 用に起動する
  • -gpu をつけると、GPU を使用するように指定出来る
  • -data <Data ID> で input データを利用することが出来る
$ floyd run --mode jupyter --gpu --data adkR2QJxDeUDBS4ZTdqDCW

Creating project run. Total upload size: 148.5KiB
Syncing code ...
Done=============================] 154412/154412 - 00:00:00
RUN ID                  NAME                              VERSION
----------------------  ------------------------------  ---------
nDTDCvWFLABp6pcgq6UP9X  tsu_nera/kg-digit-recognizer:2          2

Setting up your instance and waiting for Jupyter notebook to become available ......

Path to jupyter notebook: https://www.floydhub.com:8000/ZigtoBzouVNxt7yT4L7vQf

Jupyter Notebook を使う

URL を開くと、いつもの Jupyter Notebook の画面が現れるので、あとは自由に使う。

注意点は、

  • 入力データは /input
  • 出力データは /output

を指定する必要がある。

output を ダウンロードする

floyd output <RUN ID> を指定すると、/output の URL が帰ってくる。

$ floyd output nDTDCvWFLABp6pcgq6UP9X                                                                                          18:29:01
Opening output directory in your browser ...

その URL をブラウザに入力すると、出力データがあるので、ダウンロードする。

floyd output <DATA ID> でも同じことができる。

$ floyd data status                                                                                                            18:53:39
DATA ID                 CREATED         DISK USAGE    NAME                                        VERSION
----------------------  --------------  ------------  ----------------------------------------  ---------
ZigtoBzouVNxt7yT4L7vQf  17 minutes ago  307.29 KB     tsu_nera/kg-digit-recognizer:2/output             2
adkR2QJxDeUDBS4ZTdqDCW  an hour ago     122.2 MB      tsu_nera/kg-digit-recognizer:1                    1
aoVTWy7hL9fdNssGH4hX5n  an hour ago     122.71 MB     tsu_nera/kg-digit-recognizer:1/output             1

$ floyd data output ZigtoBzouVNxt7yT4L7vQf                                                                                     18:53:47
Opening output directory in your browser ...

Jupyter Notebook を終了する

floyd stop <RUN ID> で jupyter サーバを停止する。 そうしないと、いつまでも動作し続けることになるので、つかわなくなったら停止すること。

$ floyd stop nDTDCvWFLABp6pcgq6UP9X
Experiment shutdown request submitted. Check status to confirm shutdown

$ floyd status nDTDCvWFLABp6pcgq6UP9X
RUN ID                  CREATED         STATUS      DURATION(s)  NAME                            INSTANCE      VERSION
----------------------  --------------  --------  -------------  ------------------------------  ----------  ---------
nDTDCvWFLABp6pcgq6UP9X  54 minutes ago  shutdown           3250  tsu_nera/kg-digit-recognizer:2  gpu                 2

shutdown になっていれば OK.

まとめ

とても便利なものを知ったという気がしてならない。

Deep Learning の勉強をしていると、自分の CPU が遅くて遅くてとてもイライラしていた。

値段も、とても安いよとサイトには買いてあるので、おそらく安いのだろう。

これから流行る予感。便利なサービスはどんどん使っていこう。

18 Apr 2017, 06:33

Kaggle に Python で入門しました(Digit Recognizer)

以前から気になっていた Kaggle に入門してみた。

Kaggle とは

Kaggle とは、データサイエンス(統計処理や機械学習)のコンペティション(大会)を開催している団体。

データサイエンティストはコンペティションに参加することでランクづけされる。 そのことによって、自分の能力を示すことができる。

データサイエンティストの履歴書、エンジニアにとっての Github みたいなものだ。 (ちょっと違うかな、でもプロフィールページの Activity で草を生やすイメージが似ている)

最近、Google が Kaggle を買収して話題になった。

Kaggle 入門の Motivation

機械学習を勉強しはじめて、今まで教科書を写経していたり、 jupyter notebook の穴埋めをしていたりしてきた。

そろそろ自分のコードを組み立ててみたり、なにかデータを分析してみたいと思った。 自分の知識をたしかめるためにも、なにかよい題材はないかなと思ったら、Kaggle があった。

データサイエンスはデータを集めたり前処理をするのが大変ときくけれども、 入門なので、できればそういうところは後回しにしたい。

Kaggle には大量のデータが集められている。 しかも、参加者は各自の解答を公開(これを Kernels というらしい)しているので、 その Kernel を読むだけでもとても勉強になる。 投票制によって、有料な記事は注目を集めているのですぐわかる。

なにより、自分の解析結果が格付けされるのが、 もっと上位に行くために頑張ろうというモチベーションを駆り立てる。

登録方法や使い方は他のページ参照

というけで、登録してみた。以下が自分のプロフィールページ。

登録方法や使い方は他のサイトの記事に譲る。以下、リンク集。

Digit Recognizer を やってみた

数字認識データ(MNIST)をつかったコンペティションに参加してみた。

Kaggle の入門だと Titanic の問題が有名でみんなチャレンジしているけれども、 現在以下の本を読んでいる最中。

読書の進捗に合わせて、本の内容を真似て、解答を提出していくことにした。

具体的には、Python と Tens、PFlow を用いて、以下の手法を順番に実装していく予定。

  • 2 章: 多項分類器
  • 3 章:
    • 2.単層ニューラルネットワーク
    • 3.多層ニューラルネットワーク
  • 4 章: 単層 CNN
  • 5 章: 多層 CNN

データのダウンロード kaggle CLI

データのダウンロードのために CLI ツールがあるので、これをつかう。

$ pip install kaggle-cli
$ kg download -u `username` -p `password` -c digit-recognizer
$ ls
-rw-rw-r-- 1 tsu-nera tsu-nera 236K  4 月 18 07:55 sample_submission.csv
-rw-rw-r-- 1 tsu-nera tsu-nera  49M  4 月 18 07:55 test.csv
-rw-rw-r-- 1 tsu-nera tsu-nera  74M  4 月 18 07:53 train.csv

Multicilass Clasification

まずは基本的なところからいこうと思い、ソフトマックス関数を用いた多項分類器による分類を試みた。

自分の解答は、Kernels にアップロードした。 なんと、.ipynb 形式のファイルをアップロードすることができる。これは便利だ。

結果はどうだったかというと・・・・

14561553 位。なんと、下から数えて 100 位以内。いやーお恥ずかしゅう。これから頑張ります。

追記

単層ニューラルネットワーク実装で 1419 位になった。

バカみたいに多層(5 層)にしたら精度上がったけれども、相対順位は下がった(1421 位)