UdacityのDeep Learning Nanodegree Foundation Programを修了しました

今年の1月末からUdacityのDeep Learning Programを始めて先月修了したので、どんな感じだったか書きたいと思います。

目次:

Deep Learning Nanodegree Foundation Programとは?

  • Udacity が運営する講座で、プログラミング経験者を対象としたDeep Learningの基礎コースです。
    (TechCrunchの紹介記事はこちら )
  • 費用は$399で、$100分のAWS creditがもらえました。(課題をするためのGPUインスタンス用)

講座の流れ

  1. Udacityのサイト上でtextやvideoを視聴

    • textはこんな感じ。 f:id:junqi:20170606234509p:plain
    • videoは全てyoutubeで公開されていて、こんな感じ。
      www.youtube.com
  2. Jupyter Notebook で穴埋め形式の問題を解く (+解説videoを視聴)

  3. (月1程度で) Projectと呼ばれる課題に取り組んで提出

    • これも穴埋め形式のnotebook で、完成したら必要ファイルをzipでupload or githubリポジトリ名を伝えると、レビューが返ってきます。
  4. 余裕がある人向けにcoding challengeというのがあって、出題videoを見る → githubにupされた課題に取り組む → 翌週のvideoで優秀者の発表 という取り組みもありました。 また深く学びたい人用の論文等のリンク集もありました。

サポート

  • Udacityのサイト上にForum (掲示板っぽいもの) と、Slackのチャンネルがありました。
    • Slackでは、週2回ほどoffice hour (講師の人が質問にすぐ回答してくれる) もありました。
      (でも日本時間だと早朝の時間帯が多かった 😂 )
    • Slackには講座開始時点で3,000人ほどいて、自分が詰まった点はSlack上で検索すればたいてい上がってました。
  • Projectを提出した後は必ずレビューが返ってくるのですが、(恐らく人がコードを見て)フィードバックをくれるようでした。

カリキュラム

カリキュラムは大きく分けて
1. Neural Networks
2. Convolutional Neural Networks (CNN)
3. Recurrent Neural Networks(RNN)
4. Generative Adversarial Networks(GAN)
の4つから成っています。

  • 特に1は基礎的な部分から丁寧に扱っていて、環境構築(numpyの使い方、anacondaの導入法)に始まり、パーセプトロンの説明 & クイズ(XORパーセプトロンを作るetc)、数式の説明、numpyだけでNeural Networkを作ってみる という感じで順を追って理解を深めることができました。
  • 2の前半で MiniFlow という、TensorFlowを単純化したようなフレームワークを作る回があり、その後にTensorFlowの使い方の説明 → 以降2〜4は全てTensorFlowで行う という流れでした。
    • 2以降は進みも早く、TensorFlowでどのようにモデルを作るのかはある程度わかったものの、「とりあえずこうする」という"おまじない"的な扱いの部分もあったように思います。
    • 例えばNetworkのトレーニングには毎回 tf.train.AdamOptimizer というのを使ってるけど何をやってるんだろうetc (ただ、API仕様に論文へのリンクがあったりでいくらでも調べることは出来ますが)

Project(課題)

以下の5つのProjectに取り組みました。

1. numpyでNeuralNetworkを作ってレンタルバイクの需要予測を行う
「何月何日の何時台に何人がバイクをレンタルした + その時間帯の気温、湿度」データを基に予測を行う。
最終的には以下の予測結果が得られました。(青が予測) f:id:junqi:20170610140958p:plain
2. TensorFlowでCIFAR-10(犬、猫等の10カテゴリの画像セット)の画像分類を行う
ランダムに画像を与えて予測した結果が以下です。
(予測精度は約63%で、以下の結果の場合automobileは正しく判別できているが、birdはできていない)
f:id:junqi:20170610141525p:plain
3. TensorFlowでRNNを構築し、ザ・シンプソンズのTVスクリプト(台本)を生成する
以下の様な台本が生成されましたが、学習のベースとなるデータが少ないこともあり、文法的にはめちゃくちゃなものになりました。
f:id:junqi:20170610141845p:plain
4. TensorFlowでsequence-to-sequenceモデルを構築し、英語からフランス語への翻訳を行う
以下のような翻訳結果が得られました。これも学習に使ったテキストデータは10MBを切るので精度は高くありません。
f:id:junqi:20170610142413p:plain
5. TensorFlowでGAN(Generative Adversarial Networks)を構築し、手書き文字画像と人間の顔画像の生成を行う
学習にはMNISTCelebA というデータセットを使っています。
学習の最初は
f:id:junqi:20170610143200p:plain f:id:junqi:20170610143211p:plain
こんな感じだったものが、
(なんということでしょう) 学習後は
f:id:junqi:20170610143251p:plain f:id:junqi:20170610143258p:plain
こんなのを生成するように!

上記は提出したProjectの抜粋ですが、フルで見てみたい方はこちら

講座の良かった点

  • Deep Learningの基礎から、割と最新の話題(GAN等)まで手を動かして学ぶことができる
  • 各カリキュラムの最初の方のvideoがかなり作り込まれていて、概要を掴みやすかった
  • 試行錯誤が高速にできた
    • 解説やProject がJupyter Notebook で提供されていたお陰で、
      「まず解説を読む → 次に関数のブランク箇所を穴埋めしてみる → shift + Enterでcellを実行すると
      その関数のテストが走り、実装が合っているかすぐわかる 」という流れが快適でした。
  • 環境構築でハマることがなかった
    • 自前の環境を作るためにanacondaの導入法の説明もあったのですが、Projectの際はEC2のAMIが提供されているので、
      sshインスタンスにログイン → source activate dlnd で課題用の環境を有効化
      jupyter notebook {Projectのnotebook}.ipynb でnotebookを起動
      → ブラウザからnotebookにアクセス」 という手順ですぐにProjectに取り組めました。
  • Projectに提出期限があり、〆切効果でがんばれた
    • 自分の場合本だけでやっていたら挫折してたかも・・

こんな人にオススメ

  • 基礎から(数式レベルで)理解したい人
    • 数式に関しては、色んな所でオススメされているO'REILLYの「ゼロから作るDeepLearning」が確かに良さそうです。「TensorFlowでRNN、GANもやってみたい」場合にこの講座が良いかもしれません。
  • 英語がある程度わかる人
    • 講座のtext, videoは全て英語です。「Readingは出来るけど、Listeningは・・」という方なら、youtubeの自動字幕機能を使えば何とかなると思います。
  • 時間に少し余裕がある人
    • Udacity上では「週に5,6時間確保できればok」と書いてあったような気がしますが、1ヶ月目は講座に慣れていない & 数式の理解に手間取ってかなり時間がかかりました。
      • 週末2日 + もう3日をまるっと講座に充てる ぐらいはかかったと思います。
        数学の復習(微分線形代数)にも時間をとられたので、数学大得意であればそこまでかからないかも。

講座を終えて

  • 次の講座として「Self-Driving Car」「Artificial Intelligence」「Robotics」というコースがあり、Deep Learning受講者向けに割引があるよーという案内がきました。
  • 今後については、ひとまずDeep Learningの基礎 & 全体像 がある程度掴めたので、自分で手を動かしつつ身につけていきたいと思っています。
    (手元にある自分のライフログデータを学習させて予測してみたい & 仕事にも活かしたい)
    • ちなみに、次の講座は1ターム(3ヶ月)$800かかるらしい(計2ターム)のですが、現時点でそこまでかけて進みたいかというとそうでもないな〜というのもあり。
  • 約4ヶ月の講座をやりきったというのは自信にもなったし、受講してよかったと思います 😇

HHKBにトラックポイントを移植したッ!

最近HHKBに乗り換えました。

しかし、3年以上にわたるThinkPadキーボード生活により、すでにトラックポイントなしでは生きられない体になっていたのであった・・。
そんなある日 RealForceにトラックポイントを移植した記事 を見つけたのでその通りにやってみました。

結果は

f:id:junqi:20141103211629j:plain

こんな感じ。

途中でいくつかハマった箇所があったのでまとめます。

ハマりポイント1: 基盤に穴開けたらキーが効かなくなった/(^o^)\

今回HとJの間にトラックポイントを置いたのですが、(GとHの間だとちょっと遠い感じがしたので)
穴を開けたらNが効かなくなりました。

HHKBにトラックポイントを移植した記事Google+に上がっている写真を見ると、 針金でバイパスを作ることで復活させられるらしい。
しかし、上の場合と穴の位置が違うし、基盤も若干変わっているのか、表面を見ただけじゃ回路がどう配置されてるのかわからない・・。(ので、どうバイパスすればいいか見当もつかない)

そこで、虱潰しに針金を基盤のランドに当てまくってみて探る!
結果、21番の左側と34番の右側をつなげば復活することを発見!はんだでつないで事なきを得ました。
(ちなみに、はんだごてが無くても普通のビニールテープ(=絶縁性)で固定するだけでも何とかなります。
また、探る時はMacの場合Karabiner(旧KeyRemap4MacBook)の Misc -> Launch EventViewer でキーのイベントを見ながらやるといいです。)

f:id:junqi:20141108161046j:plain

ハマリポイント2: トラックポイントモジュールとクリックボタンのつなげ方がわからん/(^o^)\

クリックボタンがついているメンブレンシートは、元々トラックポイントモジュールのオレンジ色のシートにつながっていて、
モジュールにつながっている基盤を通して信号を送ってるっぽいのですが、メンブレンシートを切り取って再度つなげようとした時につなげ方がわからん・・
(分解するときに注意深く見ていたつもりだったけど・・)

これは以下の図を見れば一発でわかる・・かな?↓

f:id:junqi:20141111015600j:plain

(オレンジが2枚に分かれてるから、メンブレンシートと交互に噛み合わせたりしてた・・・)

そんなこんなでパーツの準備ができたら、

f:id:junqi:20141102164700j:plain

こんな感じで配置して、上半分をかぶせて完成!

ハマリポイント3: 左クリックボタンが効きにくい/(^o^)\

これはハマりという程ではないですが・・。
いざ完成させて使ってみると、左クリックの入力が30%くらいの確率で失敗するようになりました。
どうやら蓋を閉めた時に、メンブレンシートがキーボード基盤によって下に押される(引っ張られる)ことでシートとクリックボタンのかみ合わせが損なわれるっぽい。
ケースを削ったりの調整で改善できる気もするのですが、今回は英数ボタンを左クリックにし、左Optionを英数にすることで対応しました。
( HHKBのサクサク感でクリック入力するのもなかなかえぇ感じです。( ̄ー ̄)ニヤリ )
キーの交換は、Karabinerのprivate.xmlに以下を追記し、 Change Keyタブでチェックすることで行えます。

<?xml version="1.0"?>
<root>
<item>
    <item>
        <name>JIS_EISUU To Left Click</name>
        <appendix>JIS_EISUU To Left Click</appendix>
        <identifier>private.jis_eisuu_to_left_click</identifier>
        <autogen>__KeyToPointingButton__ KeyCode::JIS_EISUU, PointingButton::LEFT</autogen>
    </item>

    <item>
        <name>Option_L To JIS_EISUU</name>
        <appendix>Option_L To JIS_EISUU</appendix>
        <identifier>private.option_l_to_jis_eisuu</identifier>
        <autogen>__KeyToKey__ KeyCode::OPTION_L, KeyCode::JIS_EISUU</autogen>
    </item>
</root>

May the TrackPoint be with you! (トラックポイントと共にあらんことを・・)

MacにScheme処理系を入れる

正月休みで時間があるのでSICP

計算機プログラムの構造と解釈

を読もうかなーと思い、処理系を入れたのでその時のメモ。 OS X Mavericks 10.9.1です。

$ brew  install mit-scheme
==> Downloading http://ftpmirror.gnu.org/mit-scheme/stable.pkg/9.1.1/mit-scheme-c-9.1.1.tar.gz
######################################################################## 100.0%
==> etc/make-liarc.sh --disable-debug --prefix=/usr/local/Cellar/mit-scheme/9.1.1 --mandir=/usr/local/Cellar/mit-scheme/9.
checking size of intmax_t... 0
checking for uintmax_t... (cached) no
checking size of uintmax_t... 0
configure: error: SIZEOF_CHAR is not 1
configure: error: ./configure failed for microcode

READ THIS: https://github.com/mxcl/homebrew/wiki/troubleshooting

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 404 Not Found (OpenURI::HTTPError)
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:26:in `open'
    from /usr/local/Library/Homebrew/utils.rb:261:in `open'
    from /usr/local/Library/Homebrew/utils.rb:278:in `each_issue_matching'
    from /usr/local/Library/Homebrew/utils.rb:290:in `issues_for_formula'
    from /usr/local/Library/Homebrew/exceptions.rb:178:in `issues'
    from /usr/local/Library/Homebrew/exceptions.rb:206:in `dump'
    from /usr/local/Library/brew.rb:122

rubyでエラー・・?この時システムのRubyは2.0.0p247で、rbenvでRuby1.8を入れてみたらいいのかなーと思うも

brew doctor
brew update

した後にもう一度brew install mit-schemeしたら入った!

さて、

  ひとりSICP合宿

  開  幕  だ
 n  ___  n
 || /___\ ||
 || |(゚) (゚)| ||
「「「| \ ̄ ̄ ̄/ 「「「|
「 ̄|   ̄冂 ̄  「 ̄|
`ヽ |/ ̄| ̄| ̄\| ノ

emacsでのJavaScript開発環境の構築(node.js+jshintでリアルタイム構文チェック):前編

JSを楽に書きたいな〜♪ ハイ、構文チェッカー!
・・・ということで、emacs(flymake)でリアルタイムにJSの文法チェックが出来る環境を構築したいと思います。


JavaScriptの構文チェッカとしては
JSLint
JSHint
Closure Tools

などがあるようですが、今回欲しいのは構文チェックの機能のみで、
チーム開発に向いているという噂からJSHintを使おうと思います。

そして、emacsにはjshint-modeというnode.js上で動くJSHint用のモードがあるのでそれを導入します。
僕はwindows上でemacsを使っているので、まずwindows上にMinGWを使ってnode.jsを入れるところから始めます。
(構文チェックを行う場所(=今回だとwindows上)にJSの実行環境(=node.js)があると、flymakeがそれとJSHintを使ってチェックしてくれる!)

環境は32bit版windows7です。

windows7にnode.jsを入れる

必要なのは
MinGW(→Wikipedia)
・Python2.7
・git(msysgit)

です。順番に入れていきましょう。(以下のファイル名やバージョン表記は全て2011/06/26現在のもの)

1.MinGWのインストールこちらの左下の「Downloads」からsourceforgeのページに移動し、
mingw-get-inst-20110530.exe をダウンロードして実行します。
Select Components では「C++ Compiler」 と 「MinGW Developer Toolkit」にもチェックします。


完了!

2.Pythonのインストールこちらから(画面左)ダウンロード→Python標準リリースと辿り
Python 2.7.2のWindows用インストーラ(python-2.7.2.msi)を保存、実行します。
デフォルトではC:\Python27\にインストールされますのでパスを通します。
(コントロールパネル→システムとセキュリティ→システム→システムの詳細設定→環境変数→Pathを選んで「編集」→「;C:\Python27」を末尾に追加)
完了!

3.git(msysgit)のインストールこちらの左側DownloadsからGit-1.7.4-preview20110204.exeをダウンロード、実行します。
(fullinstallやnetinstallはエラーが出るのでやめたほうが良さそうです)
途中で、「Run Git from the Windows Command Prompt を選びました。
(デフォルトでも良いかも知れませんが今後Gitを使い倒したいのでw)
インストールが完了したらC:\Program Files\Git\binにパスを通しておきます。
(ここで、すぐにパスが反映されなかったので再起動しました。本来再起動必要だったかな・・・?)
完了!

4.node.jsのインストール
windowsキーを押して、テキスト入力ボックスに「mingw」と入力し、MinGW Shellを選択、起動します。
(プロンプトが普段と変わっているはずです。このシェルからはいくつかのLinuxコマンドが使えます)
では、以下を実行して、C:\node にインストールしましょう。

$ cd /c
$ git clone https://github.com/joyent/node.git
$ cd /c/node
$ git checkout v0.4.7  # バージョンを落とさないとエラーが出るようです。(現時点での最新はv0.4.8)
                       # ここかなり詰まりました・・・。
$ ./configure --without-ssl
$ make

'build' finished successfully と表示されればOKです!
そのままMinGW Shell上で node --version を実行するとv0.4.7と表示されるはずです。


今回はここまで!
次回はJSHintとemacsの設定周りを書きたいと思います。

sphinxを使ってみる

何やらSphinxなるものを使うと、ドキュメント作成が楽しくなってしまうという噂を聞いたので使ってみたいと思います。

そもそもSphinxというのはPythonで作られていて、reStructuredText(reST)という文法で何か書くと、それをHTMLやpdfに変換してくれるようです。

インストール

環境はUbuntu10.10です。

渋日記:Pythonって何?という人のためのSphinxインストール入門
にある通り、sudo apt-get install python-sphinxだけでいけました!
簡単ですね〜。

下準備

% sphinx-quickstart

このコマンドを実行するといくつか質問が出るので答えます。
(ドキュメントのルートディレクトリや、プロジェクト名等)

答え終わるとこんな感じで生成されます。

% ls
Makefile  _build  _static  _templates  conf.py  index.rst

sphinx-quickstartした時の設問で、ルートドキュメント名は「index」にしておいたので、index.rstがドキュメントの元になります。
(今の時点では_build, _static, _templatesには何もありません)

HTML生成

ドキュメントからHTMLを生成するときは

% make html

とします。
すると_build/htmlの中にHTMLが生成されます。

% ls _build/html
_sources  _static  genindex.html  index.html  objects.inv  search.html  searchindex.js

これのindex.htmlを見てみると・・・


こんな感じのができました。
あとは↓等でマークアップの仕方を覚えれば書けそうです!
reStructuredText入門

watchrでファイルの変更検知→自動実行

watchrはファイルを監視して、変更があったら何かしらのタスクを実行出来るスグレモノです。

普段はRubyを使わないので、Ruby入れるところからやったんですが、yum使ったら途中でエラーが出たのでソースから入れるときのメモ。

環境はCentOS5.6です。

Rubyのインストール

ソースはこちらです。(2011/5/22時点で1.9.2)

[root@localhost install]# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p180.tar.gz
[root@localhost install]# tar xzf ruby-1.9.2-p180.tar.gz
[root@localhost install]# ls
ruby-1.9.2-p180  ruby-1.9.2-p180.tar.gz
[root@localhost install]#
[root@localhost install]# cd ruby-1.9.2-p180

[root@localhost ruby-1.9.2-p180]# ./configure
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... i686-pc-linux-gnu
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/root/install/ruby-1.9.2-p180':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
[root@localhost ruby-1.9.2-p180]# yum install gcc  # ↑Cコンパイラ(gcc)が無いと出たので

[root@localhost ruby-1.9.2-p180]# which gcc  # gccがインストールされたことを確認
/usr/bin/gcc 

[root@localhost ruby-1.9.2-p180]# ./configure  # インストール開始
[root@localhost ruby-1.9.2-p180]# make
[root@localhost ruby-1.9.2-p180]# make install

[root@localhost ruby-1.9.2-p180]# ruby -v  # Rubyインストール完了!
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]

RubyGemsのインストール

ソースはこちら

[root@localhost ruby-1.9.2-p180]# cd ../
[root@localhost install]# wget http://production.cf.rubygems.org/rubygems/rubygems-1.7.2.tgz
[root@localhost install]# ls
ruby-1.9.2-p180  ruby-1.9.2-p180.tar.gz  rubygems-1.7.2.tgz
[root@localhost install]#
[root@localhost install]# tar xzf rubygems-1.7.2.tgz
[root@localhost install]# cd rubygems-1.7.2
[root@localhost rubygems-1.7.2]# ruby setup.rb
[root@localhost rubygems-1.7.2]# which gem  # gemインストール完了!
/usr/local/bin/gem
[root@localhost rubygems-1.7.2]#

zlibのロードエラー対応

gemでwatchrをインストールいようとすると、zlibがロードできないと
言われるので、↓

[root@localhost rubygems-1.7.2]# gem install watchr
ERROR:  Loading command: install (LoadError)
    no such file to load -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand
[root@localhost rubygems-1.7.2]#

以下の操作をします。

[root@localhost rubygems-1.7.2]# cd ../
[root@localhost install]# cd ruby-1.9.2-p180/ext/zlib  # 先ほどのRubyソースを解凍したディレクトリ

[root@localhost zlib]# ruby extconf.rb 
[root@localhost zlib]# make
[root@localhost zlib]# make install

watchrのインストール

[root@localhost zlib]# gem install watchr
[root@localhost zlib]# watchr -v  # watchrインストール完了!
watchr version: 0.7

動作確認をしてみます。

[root@localhost ~]# touch hoge.txt
[root@localhost ~]# echo "watch( 'hoge.txt' )  {|md| system('echo hoge.txt changed') }" > test.watchr
[root@localhost ~]# watchr test.watchr  # ここで別のターミナル等で touch hoge.txtすると・・
hoge.txt changed                        # 変更を検知して、タスクを実行したッ!!

という感じになります。

ちなみに、watchrはコマンドを実行するディレクトリ以下でないと監視しないそうなので、
そこは注意が必要です。

Ubuntu10.10 でPDOを使えるようにする

Ubuntu10.10でPDOを使おうとしたら、
PHP Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in xxx

というエラーがでたので、使えるようにするためのメモ。

こちらのmaru soruceさんの記事を参考にしたらできました。
PHP5.3.2のpdo_mysqlインストールで少しハマったところメモ

最後の方に書いてある
extension=pdo_mysql.soをphp.iniに追加する部分は、
Ubuntu10.10であれば/etc/php5/cli/conf.dのpdo.iniに追加するほうが構造上きれいかなと思います。