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 位)

17 Apr 2017, 07:49

kadenze で Creative Applications of Deep Learning with TensorFlow(CADL) を受けた

kadenze で、Creative Applications of Deep Learning with TensorFlow(CADL) を受けました。

これは、Creative Applications of Deep Learning with TensorFlow という Program (全 3 Course)のうちの一つ。

Program の Part2,3 は有料だけれども、Part1 のみ無料で受けられる。

概要

Deep Learning を 芸術に適用しようという講義。

主に Part1 では、画像処理に関する話題が取り上げられる。

  1. 畳み込み
  2. 画像補正(image inpainting)
  3. 自己符号化器
  4. DeepDream, Style Net
  5. GAN, RNN

詳細

講義ノートと課題(session)は以下のリポジトリにある。

juputer notebook の形式で github に置いてある。

session1: Introduction to TensorFlow

Deep Learning とはなにかからはじまり、画像データの処理方法、 TensorFlow の紹介、さらには Kernel を利用した畳み込み処理が解説される。 CNN までは、行かない。畳み込むだけ。

ちょっとはじめから飛ばしすぎな感があったけど、Lecture ノートが丁寧なので、 理解することができた。

課題は、自分で用意した 100 枚の画像に対して畳み込み処理をするというもの。 不気味な画像が生成された。

session2: Training A Network W/ TensorFlow

lecture では、tensorflow をつかって、サイン曲線付近に散らばったデータから、 サイン曲線を回帰によって求めることをした。

また、画像をニューラルネットワークに学習させることをした。 これは、Karphaty さんのデモサイトを真似たもの。

課題も、レクチャーの延長で、画像をニューラルネットワークに学習させることをした。 はじめは、一つの画像を、次に100枚の画像を、最後の Option 問題で 4 つの画像を ニューラルネットワークに描かせることをした。

session3: Unsupervised And Supervised Learning

教師なし学習として、自己符号化器が紹介される。

また、教師あり学習として、ニューラルネットワークを分類問題に適用する方法が説明される。

課題では、音声データを音楽かスピーチか判定して分類するようなことをする。

session4: Visualizing And Hallucinating Representations

隠れ層の可視化をする。

また、DeepDream という、コンピュータビジョンの手法が説明される。

DeepDream についてはこのブログ記事がとても詳しい。

Google Research Blog の内容を意訳してくれている。

また Neural Style Net というものを学ぶ。

作品集

session5: Generative Models

GAN と RNN を説明。どっちの説明も雑だった。これじゃあなにもわからない。

GAN は用意されたライブラリの説明で、理論の説明はないし、 RNN(LSTM)も、2 分くらいの説明があったあとデモンストレーションがあっただけ。

課題は、GAN は丁寧な解説があった。DCGAN, VAEGAN が説明されて、 CELEB Net の画像を利用して、画像を生成するところまでをやる。

RNN はトランプ大統領のツィートから文を生成しようというものだが、 出来た文章は文字化けしたような意味不明なものだった。深追いはしなかった。

感想

わからなすぎるー──ヾ(*‘∀`*)ノ──

session1,2 までは理解できたけれども、session3,4,5 は理解できなかった。

session1,2 の内容は既に知っている内容だったので、なんとかなった。 session3,4 はほとんど、session5 に至ると、まったく分からない。

こんなにわからないのは、久しぶりだと思うほどに分からない。

説明はまあ丁寧なほう

説明は丁寧、ということは言っておく。わからないのは自分のせい。

講義動画の内容は、話した内容がそのまま jupyter notebook に書き起こされている。

はじめ、講義 ノートの存在をしらなくて、 動画だけかと思ってたので、こんな動画だけじゃわかんねぇよとか思ったけど、 ちゃんと丁寧な講義ノートがあった。

講義でわからなくても、課題が講義をなぞるようにできているので、 課題を通して理解を深めることができる。

数式ほとんどでてこない

なお、数式がほとんどでてこない。 芸術をテーマにしているからか、理論的なところには踏み込んでいかないところが特徴。

たとえば、BackPropagation の説明は、以下のリンクのような感じ。

数式がないとはいえ、自分は session3,4,5 がなにいってるか理解できなかったので、数式なければ簡単とはかぎらない。

課題は簡単, TensorFlow にも慣れる

課題は、実はとても簡単。

課題は講義の応用なので、基本的には講義ノートのどこかに答えがある。

もしくはパラメータチューニングなので、自分で与えられた課題に対して数値をいじって変化を見る。

この講座は w/ TendorFlow というくらいなので、TensorFlow が初めの週からでてくる。

でも難しいことはあまりない。

正直、一から TensorFlow のコードを書いていくのはまだきついけれども、 課題を穴埋めしているうちになんとなく TensorFlow の使い方がわかる。

修了製作

チャップリンの動画に Neural Style Net でミロのスタイルをかぶせたもの。

どうやってつくったかというと、

  • gif を画像に分解
  • この処理 を画像に適応
  • 再び画像から gif を作成

元ネタ

出来上がったもの

12 Apr 2017, 13:47

Kadenze: CADL Session2 Image Painting

kadenze という MOOC を知ったので、紹介します。

Kadenze とは

Kadenze とは、芸術、つまりアートや音楽、絵画と、それに関わるテクノロジーに特化した 講座を多数よういされた MOOC だ。

20157 に設立されたので、まだ誕生して 2 年も経たない。 しかし、コンテンツは 100 近くある。

コースは聴講のみなら無料、課題の提出や certification の取得は有料となっている。 ここは、他の MOOC とかわらない。

また、Course と Program とで分かれている。

Program は複数の Course をばら売りしたもの。 逆にいえば、複数き Course をシリーズにしてまとめたものが Program.

For the Engineering

coursera や edX にもアート系の講座はあるが、Kadenza は特化しているだけあって、 興味深い講座が多数ある。

Kadenza に惹かれる理由は、エンジニアのためのアート、 つまりテクノロジーに関連したものを扱っているところだ。ここが、coursera や edX と異なるところ。

気になる講座

プログラミングや機械学習、特に DeepLearning と アートの講座もある。

Machine Learning for Musicians and Artists

機械学習と、音楽の講座。

Creative Audio Programming on the Raspberry Pi

Raspberry Pi 上で動作する オーディオプログラミング。

Introduction to Programming for Musicians and Digital Artists

オープンソース ChucK による、サウンドプログラミング。これは,以前 coursera にあった。

Creative Applications of Deep Learning with TensorFlow

そして、最後に私が受講し始めた講座を紹介。

Program の受講料は 500 ドルだけれども、聴講なら無料。Program は3つの Course に分かれている。

TensorFlow を使って、クリエイティブなアプリケーションを DeepLearning の手法を用いて作成していく。

シラバス

3 部構成になっている。

COURSE 1
Creative Applications of Deep Learning with TensorFlow

    Session 1: Introduction to TensorFlow
    Session 2: Training A Network W/ TensorFlow
    Session 3: Unsupervised And Supervised Learning
    Session 4: Visualizing And Hallucinating Representations
    Session 5: Generative Models

COURSE 2 — Summer 2017
Creative Applications of Deep Learning with TensorFlow II

    Session 1: Cloud Computing, GPUs, Deploying
    Session 2: Mixture Density Networks, Handwriting Synthesis
    Session 3: Modeling Attention with RNNs, DRAW
    Session 4: PixelCNN and PixelRNN, Generative Images

COURSE 3 — Late 2017
Creative Applications of Deep Learning with TensorFlow III

    Session 1: WaveNet, Generative Audio
    Session 2: Conditional Deep Generator Networks
    Session 3: Reinforcement Learning
    Session 4: Google Brain's Magenta Lab: Music and Art Generation

まとめ

私はクラシック音楽が大好きだ。

だから、音楽とプログラミングを結びつけてなにか面白いことをするというのが、 自分の昔からの夢だった。

Deep Learning はそのような可能性を引き出してくれる最高の遊び道具だと思う。

夢の実現のために、この Deep Learning の講座を理解して、応用したい。

kadenzeのCreative Applications of Deep Learning with TensorFlowを受けてます。

week2の課題では、tensorflow をつかって、多層ニューラルネット(10層 Deep Learningだ!)を構築し、画像をニューラルネットワークに描かせることをやる。

なにをいっているのか、うまく伝える自信がないので、ようは以下のサイトのようなことをするのだ。そのロジックを学んだ。

Input: 画像のrowとcolの位置情報 / Output RGB値

Goghを学ばせる

これを、ニューラルネットワークで学習させると・・・・

AV女優を学ばせる

AIだって、AV女優を見れば、活性化関数が元気になるんじゃなかと思って、題材に選んだ。

これを、ニューラルネットワークで学習させると・・・・

これが何を意味しているのか、よくわかっていなかったりする。

今回の課題は以下のリポジトリにあります。

おまけ: DMM AV女優月刊ランキングの女優の画像を取得するスクリプト

 

10 Apr 2017, 12:58

kadenze: CADL Session 1 畳み込み

kadenzeのCreative Applications of Deep Learning with TensorFlowを受けてます。

以下の投稿と似たような内容になってしまいますが、week1の課題の結果だけ載せます。

以下のサイトのようなことを実装した。

画像データ100枚収集

女優の画像をスクレイピングして集めてきました。

画像の平均を計算

100枚の画像の平均をとった画像が以下です。なんとなく、茶髪のショートカットの女性に見えます。

畳み込み用のカーネルで畳み込み

小さいのだけれども、16×16のカーネルで100×100の画像を捜査して畳み込んでいく。

 

畳み込みのイメージを得るには、このサイトで遊んで見るのがいい。

畳み込み結果は以下の通り。気持ち悪くなってしまいました。

07 Apr 2017, 15:53

kadenze: アートとテクノロジーの MOOC の紹介

kadenze という MOOC を知ったので、紹介します。

Kadenze とは

Kadenze とは、芸術、つまりアートや音楽、絵画と、それに関わるテクノロジーに特化した 講座を多数よういされた MOOC だ。

20157 に設立されたので、まだ誕生して 2 年も経たない。 しかし、コンテンツは 100 近くある。

コースは聴講のみなら無料、課題の提出や certification の取得は有料となっている。 ここは、他の MOOC とかわらない。

また、Course と Program とで分かれている。

Program は複数の Course をばら売りしたもの。 逆にいえば、複数き Course をシリーズにしてまとめたものが Program.

For the Engineering

coursera や edX にもアート系の講座はあるが、Kadenza は特化しているだけあって、 興味深い講座が多数ある。

Kadenza に惹かれる理由は、エンジニアのためのアート、 つまりテクノロジーに関連したものを扱っているところだ。ここが、coursera や edX と異なるところ。

気になる講座

プログラミングや機械学習、特に DeepLearning と アートの講座もある。

Machine Learning for Musicians and Artists

機械学習と、音楽の講座。

Creative Audio Programming on the Raspberry Pi

Raspberry Pi 上で動作する オーディオプログラミング。

Introduction to Programming for Musicians and Digital Artists

オープンソース ChucK による、サウンドプログラミング。これは,以前 coursera にあった。

Creative Applications of Deep Learning with TensorFlow

そして、最後に私が受講し始めた講座を紹介。

Program の受講料は 500 ドルだけれども、聴講なら無料。Program は3つの Course に分かれている。

TensorFlow を使って、クリエイティブなアプリケーションを DeepLearning の手法を用いて作成していく。

シラバス

3 部構成になっている。

COURSE 1
Creative Applications of Deep Learning with TensorFlow

    Session 1: Introduction to TensorFlow
    Session 2: Training A Network W/ TensorFlow
    Session 3: Unsupervised And Supervised Learning
    Session 4: Visualizing And Hallucinating Representations
    Session 5: Generative Models

COURSE 2 — Summer 2017
Creative Applications of Deep Learning with TensorFlow II

    Session 1: Cloud Computing, GPUs, Deploying
    Session 2: Mixture Density Networks, Handwriting Synthesis
    Session 3: Modeling Attention with RNNs, DRAW
    Session 4: PixelCNN and PixelRNN, Generative Images

COURSE 3 — Late 2017
Creative Applications of Deep Learning with TensorFlow III

    Session 1: WaveNet, Generative Audio
    Session 2: Conditional Deep Generator Networks
    Session 3: Reinforcement Learning
    Session 4: Google Brain's Magenta Lab: Music and Art Generation

まとめ

私はクラシック音楽が大好きだ。

だから、音楽とプログラミングを結びつけてなにか面白いことをするというのが、 自分の昔からの夢だった。

Deep Learning はそのような可能性を引き出してくれる最高の遊び道具だと思う。

夢の実現のために、この Deep Learning の講座を理解して、応用したい。

07 Apr 2017, 10:53

TFLearn で手書き文字認識(MNIST)を試してみた

先日、ゼロから作る DeepLearning を読んだ。

Udacity Deep Learning Nanodegree で TFLearn が紹介されていたのだが、 MNIST データを使った手書き文字認識が簡単に実装できてしまうことにビックリした。

実装

TFLearn のシンプルさにビックリ

こんな感じで、簡単に層を追加できてしまう。ビックリ!

# Inputs 784 個の入力データ
net = tflearn.input_data([None, trainX.shape[1]])

# Hidden layers 
# 活性化関数には ReLU 関数を利用。
net = tflearn.fully_connected(net, 128, activation='ReLU')
net = tflearn.fully_connected(net, 32, activation='ReLU')

# Output layer
# 活性化関数は、ソフトマックス関数を利用
net = tflearn.fully_connected(net, 10, activation='softmax')
# 最適化手法は、SGD. 学習率は 0.01. Cont 関数は、交差エントロピーを利用
net = tflearn.regression(net, optimizer='sgd', learning_rate=0.01, loss='categorical_crossentropy')

# モデルの生成
model = tflearn.DNN(net)

ゼロから作る DeepLearning で苦悩しつつ実装したニューラルネットワークはなんだったのだろうか?

ライブラリをつかえばこんなに簡単に実装できるのか?!

gist

このコードを実行すると、Accuracy は、97.69%.

TFLearn とは

TFLearn とは、Tensorflow のラッパーライブラリ。

scikit-learn のように TensorFlow が使えるらしい。

TFLearn インストール

公式のやり方は以下。

DLND では、anaconda を利用してインストールする方法が紹介されていた。

# conda で tflearn 用の仮想環境を作成
conda create -n tflearn python=3.5

# 有効化
activate tflearn

# Tensorflow と TFLearn をインストール
conda install scipy h5py
pip install tensorflow
pip install TFLearn