grbl1.1+Arduino CNCシールドV3.5+bCNCを使用中。
BluetoothモジュールおよびbCNCのPendant機能でスマホからもワイヤレス操作可能。
その他、電子工作・プログラミング、機械学習などもやっています。
MacとUbuntuを使用。

CNCマシン全般について:
国内レーザー加工機と中国製レーザー加工機の比較
中国製レーザーダイオードについて
CNCミリングマシンとCNCルーターマシンいろいろ
その他:
利用例や付加機能など:
CNCルーター関係:



*CNCマシンの制作記録は2016/04/10〜の投稿に書いてあります。


ラベル AI の投稿を表示しています。 すべての投稿を表示
ラベル AI の投稿を表示しています。 すべての投稿を表示

2017年11月17日金曜日

GPU:GTX1060で再度DCGAN(CelebA)を試してみる

前回MacBook Pro(2014年製)でDCGANサンプルCelebAを動かすと29時間もかかりましたが、今回GPU:GTX1060で試してみたところ、たった36分で終わってしまいました。MacBook ProのCPUで計算するよりも約48倍高速という結果が得られました。予想以上に速くて驚きました(というかMacBook Proが遅すぎなのかも)。

MSI GS43VR 7RE Phantom Pro(14型ゲーミングノートPC)
プロセッサ:Intel Core i7-7700HQ
GPU: GeForce GTX1060(6GB)RAM: 16GB
Ubuntus 16.10
ndivia-384
CUDA9.0
cuDNN7.03
Python3.6
Anaconda仮想環境(python3.5/cuda80/cudnn6.0/tensorflow-gpu1.3)


約20万枚の画像(64x64px)を使って6330回動かしてみた結果です。これらの顔画像はDCGANによって生成されたものであり、実在の顔ではありません。結果は前回と代わり映えしないですが、GPUによる圧倒的な速さで、今後このような画像生成も時間をかけずにいろいろ試していけそうです。
前回問題だったのは、一度プログラムを動かしてしまうと数十時間他のことができなくなってしまうということでした。しかしながら、この手のプログラムであれば、1時間もかからず結果が出せるので、効率よく作業ができそうです。

こちらは、実行中にnvidia-smiでGPUの状況を出力したものです。GPU稼働率91%ということでしょうか?
また、nvidia-settingsと打てば、以下のような画面もでてきます。
ここではGPU稼働率98%になっています。

GPU出力はAuto/Adaptive/Prefer Maximum Performanceがあるようです。いつのまにかAdaptiveが選択されていました。試しにAutoに変えてみようかと。

実行中はGPUの温度が72度前後でした。普段は50度前後なので、そこそこ熱くなっているようです。そのためファンはほぼ全開で動いていました。

Anacondaを通してTensorflow-gpu1.3をインストールしていますが、GPU用にコードを書き直さなければいけないと思っていたら、GPUがあれば自動的に優先して計算してくれるようです。Tensorflowサイトの「Using GPU」に書いてありましたが、tf.device()で意図的に使うこともできるようです。Pytorchなら、torch.cudaもしくは.cuda()

Anaconda Navigator:
Anacondaのおかげで、Ubuntu16.10、CUDA9.0、cuDNN7.0をインストールしたにもかかわらずGPUが機能していると思っていますが、Anacondaをインストールするとライブラリの検索やインストールもすぐにできるAnaconda Navigatorも使えるようになります。Anaconda.cloud(要登録)につなぐとさらに便利になります。
anaconda-navigatorと打てば、このような画面が出てきて、わざわざターミナルでタイプしなくてもここでライブラリやパッケージをインストール/アンインストールできます。またjupyter notebookもボタン一つで立ち上がってくれるので便利です。いくつかアプリケーションも含まれており、spyderというエディターもかなり便利そうでした。Anaconda一つあればすべて済んでしまうという感じです。ただ問題としては、MacとWin用のAnacondaの場合はランチャーがあるのですが、Linux用だけないようです。しかたなく、ここを参考に自力でつくりました。
MacBookのほうではAnacondaを入れていないので(元々Pythonにもvirtualenvやpyenvなどの仮想環境はありましたが)、それぞれインストールなどはpipとhomebrewで行っていました。今回Anacondaを導入して、仮想環境の便利さが分かったので、Macのほうにも入れてみようと思います(またいろいろインストールし直さなければいけませんが)。
環境はだいたい整ったので、Kaggleなどもやってみたいと思います。

関連:

2017年11月16日木曜日

デュアルブートWindows10/Ubuntu16.10/NVIDIA-384/CUDA9.0/cuDNN7.0/Anaconda

前回の投稿にも書きましたが、現在使用しているMacBook Pro(2014年製)の後継機として、MSI GS43VR 7RE Phantom Proという14型のゲーミングノートパソコンを購入しました。GeForce GTX1060のGPU内蔵なので、Deep Learningの計算をさせればMacBook Proよりもずっと速いはずです。Windows10ですが、Deep Learningのプログラミング環境では、Linuxのほうが高速に処理してくれるらしいので、Linux(Ubuntu)とWindows10のデュアルブートにしました。
MSI GS43VR 7RE Phantom Pro ゲーミングノートパソコン:
プロセッサ:Intel Core i7-7700HQ
GPU: GeForce GTX1060(6GB)
RAM: 16GB
HD: 256GB(PCIEx Gen3) + 256GB(SSD/SATA:オプション変更)
画面:14インチ/1920x1080px
サイズ:345x245x22.8mm
重量: 1.8kg

Deep Learning用のパソコンにするには、以下のことが必要らしい。
・デュアルブート(万が一LinuxがダメならWindowsに戻るため)
Ubuntuのインストール(ほぼ定番)
NVIDIAドライバ(GPUドライバ)のインストール
CUDA(NVIDIA/GPU並列計算プラットフォーム)のインストール
cuDNN(NVIDIA/Deep Learning用ライブラリ)のインストール
Anaconda(Python統合環境/Python3.6含む)のインストール
Pytorch(Deep Learningライブラリ)のインストール
Tensorflow(Deep Learningライブラリ)のインストール
PyCharm(エディタ)のインストール

1日で終わればいいけど、そう簡単には終わらないはず。特にLinux(Ubuntu)で環境を整えるのは、バージョンの違いなどもあるためかなりハマりそう。ネットで調べてみてもトラブルが多い。
結果的には何とか動きましたが、何回もインストールし直し、思うようにいかず設定に数日かかってしまいました。

これはUbuntu16.10上の画面です。通常Ubuntu16.04が最適なバージョンですが、MSiのゲーミングノートPCとは相性が悪いのかフリーズしたりほとんど使えない状態でした。やむを得ず、Ubuntu16.10にしてみて悪戦苦闘の結果なんとか動いたという感じです。Ubuntuのバージョンによって、対応するドライバやライブラリなどが変わってしまうので、その組み合わせが難しい。
Ubuntuを何回もインストールし直していると、コンピューター好きには楽しいのですが(コンピュータの構造、シェルコマンド、viエディタの使い方などに詳しくなってしまう)、いつのまにか環境構築が目的(達成感や克服感)となってしまい、本来の目的であるLinuxで何をするかということから次第に遠ざかってしまい、時間ばかり消費してしまうのであまり深追いはしないほうがいいと思います。

理想的な組み合わせ:
・Ubuntu16.04
・NVIDIAドライバ nvidia-384(多分低すぎなければいい)
・CUDA 8.0(対応:Ubuntu16.04/14.04、Tensorflowなども対応)
・cuDNN 6.0/7.0

最終的な組み合わせ:(なぜか無事動いた)
・Ubuntu16.10/Windows10デュアルブート(gcc 6.2.0)
・NVIDIAドライバ nvidia-384
・CUDA 9.0(対応:Ubuntu17.04/16.04、未対応:Tensorflow/Pytorch)
・cuDNN 7.0.4 for CUDA 9.0
・Anaconda 4.3.30(cuda80/cudnn6.0.21/Tensorflow-gpu1.3.0)
・Pytorch (Linux/conda/Python3.5/CUDA8.0)

矛盾するけれどもAnacondaで解消?
NVIDIA製CUDA8.0だとUbuntu16.04のgccバージョン5(6未満)でなければならず、Ubuntu16.10にしてしまうとgcc6.2になってしまう。仮にgccを5へダウングレードしても、CUDA8.0をUbuntu16.10にインストールするとgcc6.2へアップグレードされてしまうので、やむを得ずCUDA9.0ならびにcuDNNもCUDA9.0用をインストール。とりあえず、CUDA9.0とcuDNN7.0のマニュアルにある動作確認では問題なし。
ちなみにTensorflowやPytorchはまだCUDA9.0には未対応。
Tensorflow1.5からCUDA9.0に対応するらしい。いちおうベータ版Tensorflow1.5はあるけれども、ソースをコンパイルしてインストールしなければならない。またベータ版PytorchであればCUDA9.0でも動くらしい
しかしながらAnacondaをインストールしてみると、仮想環境のおかげなのかCUDA8.0+cuDNN6.0対応のTensorflow-gpu1.3とPytorchのサンプルがきちんと動きました。もしかしたらUbuntu17.10(最新)でも動くかもしれないけれど、またインストールし直すのは大変なのでやめました。

Tensorflow-gpu/CNN/CIFAR10での実験:
ということで、CIFAR10のサンプルで試してみました。以下がGPU(GeForce GTX1060)で動かしてみた内容。右端の数値を見ると0.018〜0.019sec/batchとなっています。これはかなり高速。
ちなみに、MacBook Pro(GPUなし)のほうでも同じように動かしてみると、以下。
0.680sec/batch前後という結果。比較すると、GPUのほうが約36倍速いということになります。あまりに違うので、いままでMacBook Proを使っていたのが馬鹿馬鹿しく感じてしまいます。その他VAEのサンプルで試すと約6.5倍の速さでした。CNNのサンプルに関しては、cuDNNを使っているためか、かなり効果があるようです。特にエラーもでないし、このような歴然とした結果からおそらくGPUはきちんと機能しているはずです。

ネットで設定例がたくさん見つかるので、ここでは細かな内容は省きますが、手順を一通り書いておきます。

デュアルブート下準備:
・Windowsの「ディスクの管理」でパーティションを区切り約120GBをUbuntu用に確保
・USBメモリースティック(8GB)をFAT32フォーマット化
・Ubuntuをダウンロード
Rufusソフトをダウンロード
・Rufusを使ってUbuntuをUSBメモリースティックへLiveCDとして書き込む
・再起動しBIOS画面にする(起動中Deleteキー連打/違う機種だとF2キー連打)
・BIOS画面内でFast boot無効、USBメモリースティックを最優先に起動順序を変える
ハマりどころ:
Windows10のボリュームはすでに5個くらいに分割されており、Ubuntu用に充分な領域を確保できないけれども、後から変えることもできるはず。それほどこの段階では問題はない。

Ubuntu:
・USBメモリースティックからUbuntuが立ち上がったらWifiとつないでおく
・Ubuntuのインストール(使用言語、地域、ユーザ名、パスワードなどの設定)
・インストールされれば再起動
・また起動中にBIOS画面にしてPCにインストールしたUbuntuを最優先起動に設定する
・Ubuntuとして起動したら、Wifiなど基本事項を設定
ハマりどころ:
Ubuntu17.10が最新バージョンだけれども、CUDAには正式に対応していないためUbuntu16.04を選ぶのがいいとされる。しかし16.04(日本語版)をインストールしてみたところディスプレイ解像度変更不可、ネットがつながらないなどの問題発生。オリジナル版もフリーズしたり機能上の不具合が多くで断念。つぎに16.10を試してみると何とか動いた。さらに次の候補となる17.04もフリーズ、17.10はかろうじて動くがたまにフリーズする。16.10くらいしかまともに動かないため、やむを得ず16.10で以下の作業を進めることに。しかし気がかりなのは、CUDAが17.04か16.04にしか正式に対応していないという点。

NVIDIAドライバ:
NVIDIAサイトからドライバのダウンロード
・Nouveauの無効化
・Ubuntu上で仮想コンソールへ移動してドライバのインストール
・BIOS画面でセキュアブート無効にする
ドライバを入れた後(CUDA無し)、ターミナルでnvidia-smiを入力してこの画面が出ればOK(しかしなかなか出なかった)。

ハマりどころ:
ほとんどはUbuntuのターミナルからインストールするけれども、一旦GUI表示を無効にして仮想コンソールへ場所を移して、そこでドライバのインストールをするというややこしい手順。また、viでNouveau無効化ファイル作成するため、viの使い方も知らないといけない。セキュアブート無効を忘れるとログインループにハマったりGUI画面が表示されなくなったりします。後から気づいたけれども、セキュアブート無効にすればこのような面倒な手順は不要かもしれない。最初nvidia-375をインストールしていましたが、他のソフトを入れると最新のnvidia-384に引き上げられてしまうようです。結果的には問題なし。

CUDA:
NVIDIAサイトからインストーラのダウンロード
・CUDAのインストール
・パスの追加
ハマりどころ:
作業事態は単純だけれども、どのバージョンをインストールしたらいいのか迷う。最新はCUDA9.0だけれども、まだTensorflowやPytorchは対応していない。それではCUDA8.0にすればいいかというと、Ubuntu16.10のgccのバージョンと対応しなくなる。現状では他の環境やライブラリがまだCUDA8.0にしか対応していないため、CUDA9.0を使わないほうがいいみたい。CUDA8.0にとどまるなら、Ubuntuを17.04にアップグレードするという手もあるけれども、このMSI GS43VRは17.04でもフリーズしてしまう。かろうじてUbuntu17.10では動くのだけれども、一旦ここまでインストールしてしまうと17.10へ変えにくい。というわけで、使用するパソコン、ライブラリ、ドライバ、プラットフォームのそれぞれのバージョンがうまく噛み合わなくて選択が難しい。CUDAのバージョンに振り回される。
CUDAでつまづくようなら、NVIDIAサイトからダウンロードせずに、
sudo apt-get install nvidia-cuda-toolkit
でインストールしたほうがいいかもしれません。

cuDNN
・メール登録が必要
・CUDAのバージョンに合わせてNVIDIAサイトからダウンロード
・Ubuntuへインストール
ハマりどころ:
特に難しくはない。このライブラリを使うとかなり高速になるようです。tarファイル版は一気にダウンロードできるけれども、なぜかマニュアルにある動作確認用サンプルが含まれていない。3つあるdeb版なら3つ目がサンプルなのでいいかもしれない。

Anaconda
・pyenvを最初にインストール(こちらを参考にしました
・pyenvにパス通す
・Anacondaをインストール(Python3.6含む)
・tensorflow-gpu1.3をインストール(Anaconda内)
・pytorchをインストール(Anaconda内:pytorch/torchvision/cuda80)
・cudnnをインストール(Anaconda内)
*Anaconda経由(あるいはanaconda-navigator)で、tensorflow-gpu1.3、pytorch、cuda80、cudnn6.0をインストールできるのでかなり楽。Anaconda cloudに登録し、cloud上で必要なライブラリを探すのもいいと思います。場合によってはpython2.7もインストールして仮想環境をつくっておくといいらしい。
結果的には、まだ未対応のCUDA9.0とcuDNN7.0(CUDA9.0用)をNVIDIAからインストールしたにもかかわらず、Anacondaの仮想環境とpytorch/cuda80/cucnn6.0のおかげで無事動いたのかもしれない。

PyCharm(エディタ):
サイトから無料のcommunity版をダウンロード
・解凍したあと、pycharm-community-2017.2.4/binへ移動し、./pycharm.shで起動。
・Anacondaのパスとつなげておく(確かデフォルトでつながっていたような)
・エディタ内でターミナル使用、git pullも可能
・pytorchのdcganサンプルなどにあるコマンドラインオプション/引数なども登録可能
*例えば、
python main.py --batchSize 128 --cuda --ngpu 1
などのmain.pyのうしろにつける設定項目(こちらを参考に)。

まとめ:
・Linuxと使用するパソコンとの相性次第(ダメならWindowsで)
・BIOS画面でFast BootとSecure Bootを必ずオフにする
・Anacondaを使う
前半は先が見えずかなり苦戦し、UbuntuがだめならWindows10にインストールするしかないとも考えていました。海外国内問わずネット上にはなかなか動かない例もたくさんあり、予想以上に面倒でした。Linux固有のトラブルと、ハード、ソフトそれぞれの対応が微妙にずれており、しかも今後リリースされるライブラリも徐々にバージョンアップしていくので、またインストールし直す時がくるので面倒です。Ubuntuは年2回(4月と10月)にバージョンアップするらしく、次回18.04は2018年4月という意味でLTS(Long Term Support/5年間)になる予定。
しかしながら、一度設定できればGPUのパワーはすごい。MacBook Proもそこそこ速いのではないかと思っていましたが、そんなことはありませんでした。やはりGPU搭載のパソコンは圧倒的に作業時間が短縮されていいと思います。特にCNNなどの層が厚いアルゴリズムでは効果てきめんという感じです。

Linuxはトラブルが多いと思うのですが(ドラブルがあれば自分で直すという姿勢からか)、一旦動き出せば、機能も見た目もシンプルだし元々軽快なためか計算速度も速いらしいでの、できるだけWindowsを使いたくありませんでした。WindowsはしばらくTensorflowにも対応しておらず、Pytorchにおいては公式ではLinuxとMac版だけ(WIndows版はAnacondaからインストール可能)。MicrosoftがCNTKをリリースしたものの、Windowsはやや一歩遅れというのも気になります。

また、DockerやAWSなどのクラウドへUbuntu16.04をインストールし(必要に応じてその他のライブラリも)、GPUで計算させるという方法もあるようです。どうしても時間を短縮したいという場合は有料(数百円)にはなるけれどもいいかもしれません。コーディングは普通のノートパソコンでやって、計算のときはクラウド利用するというのが一番スマートな方法(ものを持ちすぎない)だと思います。

Tensorflow1.4でKerasが取り込まれ、さらにはEager(まだpre-alpha版)も登場し(tf.learnやtf-slimはどうなってしまったのか)、まだまだ変化がありすぎる状況です。現在はCUDA8.0とcuDNN6.0/7.0が主流だと思うのですが、数ヶ月以内ですぐにCUDA9.0に対応してしまうと思います。半年後にはUbuntu18.04LTSがリリースされ、そのころにはまた新たなライブラリや環境が登場していると思うのできりがないという感じです。

2017年11月12日日曜日

Deep Learning用GPUノートパソコン

Deep Learningで学習する際に、現在使用しているMacbook Pro(2014年製)だとCPU計算のため数十時間とか普通にかかってしまいます。あまりにも効率が悪いので、GPU搭載のパソコンの必要性が高くなってきました。GPUパソコンを新規購入せずにクラウド(有料)で計算させる方法もありますが、外付けGPUという手段もあるようです。性能的な面から言えばデスクトップ型のGPUパソコンが一番効率良さそうですが、個人的には持ち歩きをするために、幾分スペックが落ちてもGPUノート型(ゲーミングノートパソコン)がいいかなと。

外付けGPU:
最近は、MacBookでも外付けできるGPUがあるらしい。

こちらはグラフィックボードは別売り。

GIGABYTE ビデオカード GTX1070搭載 外付けVGA BOX GV-N1070IXEB-8GD
Posted with Amakuri at 2017.11.10
日本ギガバイト
販売価格 ¥84,812
こちらはGeForce GTX1070も含まれた値段。Macで確実に動くかどうかは分からないけれども、10万円以下で高速になるのであればかなり助かります。

GPU比較:
ということで次はGPUの比較。最近のNVIDEAのGPUだと、
GeForce GTX 1080Ti : 約10万円(922)
GeForce GTX 1080 :約7万円(725)
GeForce GTX 1070 :約5万円(602)
GeForce GTX 1060 :約3万円(440)
当然数字が大きいほどパワフル。()内の数字はドスパラによるベンチマーク値。主にグラフィック処理に関する数値だと思うので、Deep Learningにおける並列計算でのベンチマークとは少し違うと思いますが一応目安として。
一番下のGTX 1060は比較的安価ですが、それでも現在のMacBookよりは遥かに速いはずです。個人的にはGTX1070が無難かなと思うので、外付けなら合計で8万円前後となりそうです。しかしながら外付けの場合は、ThunderBolt経由となるのでスピードがワンランク落ちるらしい。
ということから、GPUを外付けするよりも新たにGPU付きパソコンを購入したほうがよさそう(現在のMacBookも古くなってきたし)。

デスクトップかノートか:
新規購入となるとデスクトップ型かノート型かということになります。当然デスクトップ型のほうがコストパフォーマンスは高くなりますが、現在のMacBookのかわりに使うことにもなるので、ノートのほうが個人的には好ましい。ということで、GPU付きノートパソコンを探すことに。

GPU付きノートパソコン:
GeForce GTX 1070搭載ノートPCとなると20〜25万円のゲーミングノート。値段的には新しいMacBook Proとあまりかわらないけれども画面サイズが15型になってしまう。現在のMacBook Proは13.3型で非常にコンパクトなのですが、15型になると持ち運びするには大きすぎるし重量もあります。

14型以下のGPUノートパソコン:
ゲーミングノートパソコンのほとんどが15型以上となる中で、数少ないながらも14型以下もあるようです。しかし、そのほとんどがGeForce GTX 1060以下となってしまいます。とはいっても普通のMacBook Proよりは断然速い。一つ前もMacBook Proを使っており、現在もMacBook Pro、次もMacBook Proを購入することになると思っていましたが、せっかくなのでGPU付きに方向を変えてみようかと。そうすると以下の3つが候補。

Dell Alienware 13(194,378円/税込み)、画面13.3インチ、330x269x24mm、2.6kg
MSI GS43VR (195,000円/税込み)、画面14インチ、345x245x22.8mm、1.8kg
Razer Blade 14(234,144円/税込み)、画面14インチ、345x235x17.9mm、1.86kg

追記:
上記は2017年製の型番であり、2018年製であれば
MSI GS65 Stealth Thin 8RE-005JP(Arkで233,800円)、357.7×247.7×17.9mm、1.88kg
がいいかもしれません。


それぞれ以下のようなスペックでの比較にしてみました。
画面サイズ:14型未満
RAM:16GB
HD:SSD256GB
GPU:GeForce GTX 1060
*GeForce GTX 1060未満のゲーミングノートもあるのですが、候補外にしてしまいました。

Alienware 13は、Dellとは言え独立したブランドらしく、ほとんどDellらしさはありません。見た目的にはかっこいいゲーミングノートという感じ。タッチパッド部分が光るというのは珍しいけれども、左右クリックボタンがついているのが、個人的には邪魔という感じ。画面が13.3インチで一番コンパクトなのですが、なぜか重い。ゴツい排気口もあって頼もしそう。そのため少し縦長ですが、元々コンパクトなのでそれほど大きさは気にならないかもしれません。41,400円上乗せすれば、MacBook ProのRetinaディスプレイと同等の2560x1440の高解像度+タッチパネルに変更できるようです。ゲーム目的ではないのでそこまでは必要ないと思います。秋葉原にショールームもありサポート窓口になってくれるらしく、国内でもサービス面ではなんとか大丈夫そうです。
MSI GS43は、見た目はいかにもゲーミングという感じですが、中身的にはバランスがとれていそうです。排気もけっこうこだわっているようです。故障やサービス面については秋葉原のArkが窓口になるようです。通常ノートパソコンでは後からメモリ増設ができないものが多いのですが、MSIの場合Arkに持っていけば対応してくれるようです。重量も1.8kgなので、ゲーミングノートのなかでも軽量な方です。アメリカでも人気あるようです。それと保険が最初から2年ついています。

Razer Blade 14は、MacBook Proを真っ黒にしたようなシンプルでスタイリッシュな外観ですが、完全に外国製品という感じで取り扱っているところも少なく、故障の際も部品取り寄せなど面倒らしい。値段もやや高価。厚さも薄くスペック的にも悪くはないのですが、日本に窓口ができれば値段を引き下げることも可能だろうし、もう少し安心して購入できそうです。付属のACアダプターも小型化の工夫がされているようです。

まとめ:
おそらく現在使用しているパソコンと比較した場合に、それぞれの印象が異なると思います。個人的には、Alienware 13はサイズはいいのですが重いというのがひっかかります(現在13.3インチMacBook Proが重量1.57kgなので)。
外観においてはMSI GS43が一番かっこわるいのですが、2年保証付きで、後からメモリ増設可能であったり、サービス/サポート面や機能面においては一番優れていそう。
Razer Blade 14は確かに魅力的ですが、国内サポート面での不安定さとやや高価であるという部分がひっかかります。数万円高価になるなら、他の機種においてメモリを16GBから32GBに取り替えたほうがよさそうとも考えてしまいます。
ゲームをするわけではないので、やはり総合的に見るとMSI GS43がよさげです。見た目さえ我慢すればいいという感じです。

通常、デスクトップ型にGTX 1070を積むのがコストパフォーマンスに優れるのだと思いますが、現在使用しているMacBook Pro(13.3型)の代わりにもなるものとしてポータブルなものを選ぶと14型のGTX 1060ゲーミングノートパソコンとなってしまいます。そのため性能的な意味においては妥協しなければならないのですが、それでもMacBook Proよりは遥かに速いので不満は残らないでしょう。

AnacondaでPythonを管理してPytorchを使おうと考えているので、そうするとWindowsだとやや不都合があるため、OSはLinux/Ubuntuにしたほうがよさそうです。

追記:
最近はGoogle Colab(無料GPU/TPUクラウド)を使えば高速演算が可能なので、必ずしもGPU付きコンピュータが必要ではなくなったかもしれません。

関連:
GPU:GTX1060で再度DCGAN(CelebA)を試してみる
Google Colabの無料GPUで強化学習(Keras-RL)を試す


2017年11月10日金曜日

Google AIY Voice Kit(Pimoroni)到着

一ヶ月ほど前にPimoroniに注文していたGoogle AIY Voice Kitが到着(26.33ポンド/約4000円:送料込み)。いわゆる音声認識キットで、元々は雑誌MagPi(57号/2017年5月)の付録です。当初はあっという間に売り切れてしまい、その後Ebayなどでも1万円くらいの高値がついていました。以前、ESP8266とWeb Speech APIで音声認識スイッチをつくっていたときも入手困難となっており諦めていましたが、ちょっと前に再販したようで一ヶ月ほど待たなければいけない予約販売でしたがついつい買ってしまいました。
現在Pimoroniではもうすでに売り切れのようですが、日本のKSYでは11月末以降に入荷されるようです(3000円/税抜き)。

中身はこんな感じ。75ページもあるカラー小冊子マニュアル。Web上ではAIYのサイトであるここにマニュアルがあります。
1時間もあれば一通り試すことができそうですが、個人的には音声認識に対する興味はやや失せてしまっており、まだやる気が起こりません。あと、Googleを使わなければいけないというのも、やや面倒。

この丁寧に説明されているマニュアル(冊子)を見ると面白そうですが、最近ではGoogle Home mini(6480円)、Amazon Echo Dot(5980円)、Anker Eufy(4980円)という小型で安価なスマートスピーカーも登場してきたので、このAIY Voice Kitを買うまでもないかも。たしかに微妙なところ。しかし、いろいろ試したりするにはいいのかもしれません。製品よりはHackしやすいはず。

AIY Voice Kitの紹介動画。

基本的にはGoogle Cloudのアカウントをつくり、Google Assistant SDKを通して、ラズパイに書いたPythonスクリプトで動かすようです。以下のサイトにはサンプルなどがあるので、Pythonで任意のプログラムを書き換えればいろいろ応用はできそうです。
Googleにとっては、Google Cloudを使ってもらう切っ掛け(宣伝)としてはいいのかもしれません。
そのうち気が向いたら組み立ててみようと思います。

2017年11月1日水曜日

Coursera: Convolutional Neural Networksコース開講

ようやくCouseraのDeep Learningシリーズのコース4であるCNN(Convolutional Neural Networks)が開講したようです。

以前コース1〜3までは受講してしまい、その続きとなります。UdemyのCNNコースで一通り学びましたが、復習も兼ねてやってみようかと。再登録というかたちになるのですが、料金($49)を支払ってのenrollというよりは、単なる聴講というかたちで覗いてみることにしました。聴講(無料)でも、講義の動画やプログラミング課題まではアクセスできるようです。ただし、字幕はまだ英語のみ。

CNNコースは:
Week1: Foundations of Convolutional Neural Networks/動画106分
Week2: Deep convolutional models: case studies/動画99分
Week3: Object detection/動画84分
Week4: Face recognition & Neural style transfer/動画79分

という構成になっており、各Weekでクイズやプログラミング課題があるようです。
後半の物体検知/顔検知/スタイル変換は面白そうです。

早速Week1の動画から見てみました。最初はConvolutionの基本原理となる、フィルター、パディング、ストライド、valid/sameなどの説明です。スタンフォード大のCS231n授業動画でも学べますが、やはり定評あるAndrew Ng先生の場合は丁寧に教えてくれます。抜け落としていた知識を補うためにもちょうどいい感じです。
実際コーディングする場合は、conv2d()などの関数を使えばすぐに実装できるのですが、Week1の最初の課題では、numpyを使ってフルスクラッチでConvolutionレイヤーを実装するようです。一旦仕組みを理解するにはよさそうです。2個目の課題からはTensorflowの関数を使っているので、より現実的な実装の仕方を学んでいくのだと思います。
Week2からのプログラミング課題はkerasを使うようです。

今後開講されるコース5:Sequece Modelでは、RNNやLSTMを学ぶようです。スタンフォード大学のCS230という授業がこのCourseraのコースと連携しているので、CS230のシラバスをみると、コース5は11/27以降というスケジュールになっています。

2017年10月28日土曜日

データセット:CIFAR-100の読み込み/tflearn DCGAN

引き続きDeep Learningの画像生成GAN(Generative Adversarial Network)について、いろいろ試しています。最近では3DデータのGANもあるようです。このThe GAN ZooというところにはいろんなGANがのっていますが、とりあえずは、鮮明な合成画像をつくりだすことが可能なDCGAN、そして一方の属性を他の属性へ合成するDisco GANなどを試そうと思っています。

GANの前にVAEの学習:
GANを勉強するためには、その前にVAE(Variational Autoencoder)を理解したほうがいいということで、ここしばらくはVAEを勉強していました。VAEを学ぶ前には、Autoencoderというアルゴリズムがあり、それは簡単な仕組みなのですが、VAEになるとかなり難しい概念が登場してきます。

・Autoencoder:簡単なエンコード/デコードのアルゴリズム
・VAE:正規分布、ベイズ推定、変分ベイズ、KLダイバージェンスなどの知識が必要

VAEの場合、途中で確率分布に置き換えるという手法が特に難解だったのですが、そういう手法をとることで、デコード(生成や再現)が可能となるというのは、なかなかの発見でした。その他の生成モデルにおいても確率分布を使うことがあるので、このあたりの手法はある程度理解しておいたほうが後々役に立ちそうです。

ということでVAEも面白いのですが、そろそろGANに移行しようということで、いろいろサンプルを物色していました。主にはTensorflowを使っていますが、最近のGANのソースはPytorchで書かれているものも多く、Kerasなども含め比較的シンプルに書けるライブラリが増えてきたようです。tflearnというTensorflowをシンプルにしたライブラリもあり、かなり短いコードで書くことができます。

tflearnでDCGANを試す:
tflearnのexamplesにあるdcganのサンプルはたった138行しかないので試してみました。しかし、このサンプルはこのままだとエラーがでるようで、この訂正のページ(dcganの欄)にあるように102、103、110行目の最後に「,2」を追加する必要があります。訂正すれば動くのですが、このdcganのサンプルも相変わらずMNIST(手書き文字)であり結果はあまり面白くはないです。せっかく画像生成のアルゴリズムなので、もう少し面白い画像を使ったほうがいいのですが、気の利いたデータセットがないというのが現状でしょうか。前回Udemyのコースで試したCelebA(セレブ顔画像) ならまだましかもしれません。

データセットについて:
他にデータセットはないかと探してみましたが、こちらに詳しく書かれています。
MNIST:手書き数字、70000(Tr:55000/Vl:5000/Te10000)、白黒、28x28px、
CelebA:セレブ顔、202600、カラー、178x218px
CIFAR-10:10クラス、60000(10x6000)、カラー、32x32px
CIFAR-100:100クラス、60000(100x600)、カラー、32x32px
Fashion MNIST:洋服/靴/鞄など10クラス、60000+10000、グレー、28x28px
ImageNet:未登録のため画像ダウンロードはまだ使えない(そのうち)
Google/Open Images:膨大すぎてつかいにくそう(そのうち)

すぐにダウンロードして使えそうなのは、それほどない。プログラムを書いてWebからスクレイピングする方法もあるかもしれないけれども、数万単位でのイメージが必要そうなので、個人で集めるには面倒。いまのうちからコツコツ集めておけば、かなりの価値になるにかもしれないけれども。
以下はCIFAR-10(10種類のクラス)。


CIFAR-100をダウンロード:
ということから、今回はなんとなく無難なCIFAR-100を試してみることに。こちらの記事を参考にスクリプトを書いてみました。データはCIFARのサイトにあるCIFAR-100 Python versionをダウンロードしました。解凍すると、そのまま画像が出てくるわけではなく、各画像はすでに1次元のデータになっているようです。ニューラルネットに画像データをインプットするならそのまま1次元がいいとは思いますが、必要に応じて2次元(3チャンネルカラー)に変換したり、あるいはグレースケールに落としたりすることもあります。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import os

def unpickle(file):
    import cPickle
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo)
    return dict

def get_cifar100(folder):
    train_fname = os.path.join(folder,'train')
    test_fname  = os.path.join(folder,'test')
    data_dict = unpickle(train_fname)
    train_data = data_dict['data']
    train_fine_labels = data_dict['fine_labels']
    train_coarse_labels = data_dict['coarse_labels']

    data_dict = unpickle(test_fname)
    test_data = data_dict['data']
    test_fine_labels = data_dict['fine_labels']
    test_coarse_labels = data_dict['coarse_labels']

    bm = unpickle(os.path.join(folder, 'meta'))
    clabel_names = bm['coarse_label_names']
    flabel_names = bm['fine_label_names']

    return train_data, np.array(train_coarse_labels), np.array(train_fine_labels), test_data, np.array(test_coarse_labels), np.array(test_fine_labels), clabel_names, flabel_names

def get_images(name):
    tr_data100, tr_clabels100, tr_flabels100, te_data100, te_clabels100, te_flabels100, clabel_names100, flabel_names100 = get_cifar100("../large_files/cifar-100-python")
    #print(clabel_names100)
    images = []
    for i in range(len(tr_flabels100)):
        if tr_flabels100[i] == flabel_names100.index(name):
            #im = tr_data100[i].reshape(3,32,32).transpose(1, 2, 0) #(32,32,3)
            im = tr_data100[i].reshape(3,32,32)
            im = im[0]/3.0 + im[1]/3.0 + im[2]/3.0
            images.append(im)
    return images

これをutil.pyなどと保存して、先程のtflearnのdcganサンプルで使ってみました。ある特定のジャンルを学習できるように、ラベル名に対応した番号のみを読み込むということにしています。元画像はカラーですがグレースケールに変換しています。
get_images('bicycle')
とすれば、自転車の画像だけ合計500個読み込むということです。
ちなみにCIFAR-100の場合、clabel_names100という20種類の大きなクラスとflabel_names100というさらに細かい100種類のクラスに分かれているようです。
flabel_names100[9] = 'bicycle'
という関係なので、
tr_data100[9]
が、ある自転車の画像となります。画像はランダムに配置されているようで、forループである特定の種類の画像を抜き出すようにしています。
以下が、CIFAR-100のクラス。

clabel_names100 = [
'aquatic_mammals', 'fish',
'flowers', 'food_containers',
'fruit_and_vegetables', 'household_electrical_devices',
'household_furniture', 'insects',
'large_carnivores', 'large_man-made_outdoor_things',
'large_natural_outdoor_scenes', 'large_omnivores_and_herbivores',
'medium_mammals', 'non-insect_invertebrates',
'people', 'reptiles',
'small_mammals', 'trees',
'vehicles_1', 'vehicles_2']

flabel_names100 = [
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle', 'bicycle', 'bottle',
'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel', 'can', 'castle', 'caterpillar', 'cattle',
'chair', 'chimpanzee', 'clock', 'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster', 'house', 'kangaroo', 'keyboard',
'lamp', 'lawn_mower', 'leopard', 'lion', 'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain',
'mouse', 'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear', 'pickup_truck','pine_tree',
'plain', 'plate', 'poppy', 'porcupine', 'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket',
'rose', 'sea', 'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake', 'spider',
'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table', 'tank', 'telephone', 'television','tiger',
'tractor',
'train', 'trout', 'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm']

全体では60000イメージあるのですが、一つのクラス(種類)は500個のイメージしかなく、Disco GANのように何か特定のジャンルを学習させようとすると画像数が足りなさすぎというのを後から気づきました。CIFAR-100はいろんな種類の画像があるかわりに画像数が少ない。CIFAR-10なら一つの種類で画像が6000あるので、まだましかもしれませんが、10種類しかジャンルがない(選びたいジャンルがない)。というわけで、思い描いているようなものを学習させて、それらを合成させたいということがなかなかできません。あくまで、すでに用意されている範囲でのジャンルを使って、試すということくらいしかできないというのが現状。

Deep Learningを実験していくには、数学を含めたアルゴリズムの勉強だけでなく(特にベイズ推定をつかった確率論的モデルなどが面白そう/今後より重要になっていくらしい)、データセットについても揃えなければいけないという難問があり、さらにはこのような画像生成をするなら、GPUマシンも必要という感じで、やはり先に進めば進むほど敷居が高くなってきます。段々面白くはなってきたけれども、色々面倒なことも増えてきました。

ベイズ推定については、この動画も面白い。今までの固定的な考え方が変わりそうな感じです。

変分ベイズ学習 (機械学習プロフェッショナルシリーズ)
Posted with Amakuri at 2017.10.29
中島 伸一
講談社
販売価格 ¥3,024

2017年10月13日金曜日

Udemy: GANs and Variational Autoencoderのコース

前回まではConvolutional Neural Networks(CNN)をやっていましたが、GANが気になるのでそちらのコースも受講してみました。CNNのほうはもう少し復習する必要があるのですが、このへんになるとどれも難しいので、とりあえず一番興味あるGANを先回りしてやってみようという感じです。


このUdemyのGANコースでは、前半にオートエンコーダーを学びます。前回のConvolutional Neural Networks(CNN)では元画像を畳み込んで圧縮したりフィルターをかけていましたが、畳み込みはせずにニューラルネットでエンコードすることを実験し、最終的にはエンコードされた画像を再現するようなデコード技術を学びます。画像補間処理のようなものですが、混合ガウス分布というまたもや数学的に難しい内容がでてきます。このあたりの処理になると、確率分布や乱数を使って複雑な方法で画像再現していくようです。一回見ただけではなかなか理解できないので、現在も復習中です。実際のところは、scikit-leranなどのライブラリにはGaussian Mixture modelsの関数が用意されているので、複雑な計算をせずに済みます。ただし、パラメータやどのような特性があるかはある程度理解しておく必要があります。

今回のコースはかなり複雑なことをしているせいか、数学的な説明も多いという感じです。しかも画像メインなので、簡単なサンプルコードであっても出力が終わるまでかなり時間がかかります。
これは最初のオートエンコーダーのサンプルで、一層の隠れ層でReLU、シグモイドで出力という簡単なものです。元画像を参照して再現出力するのでほぼ同じ結果。そのため面白くないけれども、簡単なオートエンコーダーをコーディングする練習になるのでいいかもしれません。

次はVariational Autoencoder(VAE) です。エンコードした後に確率分布を使ってデコードするという技術のようです。KLダイバージェンスという二つの確率分布の違いを測る式を用いて、その差を縮めるような計算をしていくようです。仕組み的には段々抽象的になってきているので、もう少し勉強しなおしたほうがよさそうです。ただ、収束させにくい式をこういった収束可能な式に置き換えて何とか計算可能にしている数学的な工夫が面白いです。当然、数学に詳しくないとこのような発想すら思い浮かびません。
理屈で考えるとかなり難しいのですが、どうやって少ない情報から大きな情報へと再現していくのかというのは徐々に分かってきました。しかしながら、この辺のレベルになると一つ一つがかなり難しい。

そして、いよいよ二つのニューラルネットを切磋琢磨させるかのように使うGANsです。今回は最初にMNIST(手書き数字)で試したあと、画像生成のサンプルでよく見かけるCeleb顔画像を使ってGANを試してみました。このCeleb顔のデータセットがでかすぎる。元画像は一枚178x218pxあり、それがなんと202600枚もあります。

こんな感じで解凍すると、このナンバリングが202600まで続きます。合計で1.78GB。

この178x218pxの画像を64x64pxに切り取って、それをサンプルにします。202600枚あるので、もちろんすべてプログラミング上で自動処理です。

そして、いざGANのサンプルコードをランさせると、50イテレーションごとに一枚生成し約15〜18秒かかります。出力中にYoutubeなど見ていると演算が遅くなったりします。ミニバッチ学習をさせているので、合計で1epoch3165回。これで終わりなのかと思ったら、2epochあるので合計6330回です。計算中も次々画像が出てきます。途中でやめようかと思いましたが、ためしに最後までやってみようと、そのままつけっぱなしで次の日をむかえてもまだまだやっていました。
結局、ここにあるように104804秒(約29時間)かかりました。せいぜい数時間かと思っていたら、1日以上かかったということです。強力なGPUマシンが欲しくなる気持ちが分かります。10〜20倍くらい早くなるそうです。

50回目:まだ始まったばかりなのではっきりしていません。50回ごとに、このような画像が一枚出力されます。

200回目、少し色が濃くなってきました。メリハリがでてきた感じ。

1100回目、それっぽくなってきました。

3000回目、かなり良くなってきたものと、まだ変なものもいくつかあります。特に気になるのが赤い顔の人たち。おそらく約20万枚あるうち何枚かが赤い画像だったのかもしれません。

4500回目、よくみると変なのもありますが、それぞれ固有の色味がでてきたような感じです。人種も様々。

6300回目(最後:127枚目)、もうそれほど完成度があがると言う感じではなさそうですが、平均的な顔というよりはきちんと個性が見て取れるような気もします。合成しているうちに全部似てくるときもあるようですが、今回の場合はそんなことはなさそうです。しかし、よく見ると変なのもまだあります。特に左端の下から3番目は、右向きと左向きの顔が合成されたためか、中央だけ細く存在しています。

見比べると確かに向上しているような気もしますが、やや絵画っぽい作風にも見えます。この出力結果が面白いかどうかというよりも、GANの特長である二つのニューラルネットが互いに競い合うことで生成されるアルゴリズムの仕組みが面白いです。この手の画像生成の技術は次々と新しいのがでているので日々見逃せないという感じです(The GAN Zoo)。

ということで、目標としていた画像生成であるGANのサンプルを試すことができたのですが、単にサンプルを動かしただけなので、これで終わりというわけではありません。ここから、自力でコーディングできるようになるために、かなり難しい理論なども乗り越えながら勉強していく感じです。それにしても、それぞれいろんなアルゴリズムがあって、かなり面白い世界だと思います。ものの考え方もけっこう変わりそうです。

関連:

2017年10月9日月曜日

Convolutional Neural Networksのコース

Deep Learningのなかでも、特にGANなどの画像生成の技術に興味があるのですが、その一歩手前としてConvolutional Neural Networks(CNN)も勉強してみようかと、いろいろ探していました。CourseraのDeep Learningのコース4であるConvolutional Neural Networksはまだ開講していないため、もうしばらく待たないといけません(以下)。

Courseraと同様に、UdacityのDeep Learningコースもまだwaiting listのようです(かなり人気あるのかも)。
ほかにも、fast.aiでも無料でCNNの授業はあるようです。一見よさそうなのですが、AWS(有料)を使うようで登録やセッティングがめんどくさそうです。


あとは、前から気になっていたUdemyのDeep Learning: GANs and Variational Autoencodersと同じシリーズのDeep Learning: Convolutional Neural Networks in Pythonというコースです。

GANのコースはあまりないので(fast.aiにはある)、この↑のGANのコースをいずれは受講したいと思っているので、割引価格で1200円(書籍を買うよりも安い)だし、試しにどんなものかということも含めてCNNコースを受講してみることにしました。

Udemy: Deep Learning: Convolutional Neural Networks in Python
このコースでは、TheanoTensorflowの二種類異なる方法でコーディングするようです。Theanoは使ったことはないですがそれぞれメリット/デメリットがあるようで、この他のライブラリも含めどれがいいのかはほとんど好みという感じかもしれません。ただし、Theanoは次の1.0(現在0.9.0)をもって開発終了らしいです(原文)。


このコースの特長としては、試験や課題というものはありません。当然期限もありません。専用の質疑応答のフォーラムはあるので、有料の動画コンテンツ(英語)と質問応答の権利を購入するという感じです。授業で使うサンプルコードに関しては、このコースを受講していなくてもgithubからすぐに手に入ります。
授業内のアルゴリズムや数学的な説明は非常に端的で分かりやすいと思います。数分〜10分程度の動画が合計4時間分あります。ただ動画を眺めているだけではだめで、ノートをこまめにとるとか、コピペなど使わないでコードを書き、実際手を動かすことを強く勧めてきます。たしかにプログラミングの場合はそうしたほうが覚えが早くなります。
数学に関しては、他のコースでも言っていましたが、それほど深く理解しようとする必要はなくて、ライブラリの関数をどう使うのかということに慣れたほうがいいようです。このコースは理論の理解というよりも、コーディングに重点をおいているという感じです。しかし、いきなり本題に入るまえに、簡単なサンプルコードを試したり、いくつかの段階を経て、最後にはまとまったコードを書くということになります。このCNNのコースは上級者向けのようで、基本的なPythonプログラミング、機械学習の基礎は学んでおかなければいけません。たしかに、少し敷居が高そうです。このコース以外にも段階やジャンルに応じていくつかコースがあるので、内容に追いつけない場合は他のコースも同時にやったほうがいいのかもしれませんが、それだけお金がかかってしまいます。

最初のほうのCNNの説明は以下ようなステップになっています。

初心者にとっては、どのような手順で理解していけばいいのか分かりにくいので、このような段階的な説明があると理解しやすくなります。
Convolutionに関しては、まずはフィルターという概念で、Hello worldをしゃべる音源にエコーフィルターを加えるアルゴリズムを書いて実験するところから始まります。次に画像にぼかしフィルターを加えたサンプルで実験します。このへんは最初のエクササイズという感じです。このエクササイズを通して、変換された元データからConvolutionということを感覚的につかんでいきます。その後はこのフィルタリングされた画像をニューラルネットワークに入力して、CNNへと発展させていく感じです。
コーディングはTheanoとTensorflowの2種類用意してあり、もし普段からTensorflowを使っているのであれば、Theanoのコードは使わなくもいいと思います。
できるだけコピペしないで一通り書いてみました。コーディングすると、一行ずつ何をしているのかが分かるので、その分理解も深まります。Theanoのほうでもコーディングしてみると、二つの方法で書くので、さらに理解が深まる感じです。
CNNの大体のパターンはわかったのですが、まだ自力でコーディングはできないので、もう少し繰り返す必要がありそうです。もう少し慣れてくれば、コースに頼らなくても自力で他のサイトなど見ながら勉強していけそうです。

あとで気づいたのですが、CNNは上級者向けで、最も興味あるGANのコースは中級者向けなので、こちらのコースのほうを先にやってみてもよさそうです。

2017年10月4日水曜日

スタンフォード大:CNN for Computer Visionのレクチャー動画

CourseraのDeep Learningコース(コース1〜3)も終わってしまったので、次を探しているところです。興味あるのはConvolutional Neural Network(CNN)、そしてGenerative Adversarial Network(GAN)などのコンピュータービジョンや画像生成に関するアルゴリズムです。

いろいろ調べていると、スタンフォード大のCNNのシリーズレクチャーがありました(以下)。
この動画は今年(2017年)のもので、もうすでに第1回から16回まであります(1動画/約1時間:合計約16時間)。
CS231n: Convolutional Neural Networks for Visual Recognition
というスタンフォード大の授業の動画らしいです。
シラバスのページにはコースマテリアル(資料)のリンクもあり、これに従って一通りCNNについては勉強できそうです。今年の授業なので情報も最新だと思うし。
どうやらこの授業は、今年4/4から開始され、週2回のペース、途中に課題提出などもあり、6/12まで続いていたらしいです。週2回なので、かなりハイペースでやっていると思います。それにしても授業計画ならびにその内容がすごい。いまのアメリカの優れた大学はこんな感じなんですね。
このCNNコースを受講する前に、予備知識としてCS229:Machine Learning(Andrew Ng)を受講しておくといいと言ってますが、これはCourseraのMachine Learningコースの元となっている授業だと思います。
スタンフォード大学コンピューターサイエンス講義リストを見ると、CS230: Deep Learning(Andrew Ng)という授業があり、受講者はCourseraのDeep Learningコースを受けるようと書いてあります。どうやら、CS230の授業とCourseraの授業は同じようです。実際のCS230の授業では、トピックに合わせたさらなるレクチャー、ゲストレクチャーなどがあるようです。シラバスによると、CNNの授業は7週目の11/6からのようなので、それまでにはCourseraのConvolutional Neural Networksも開講するのではないでしょうか。ということであと一ヶ月くらい先という感じ。

追記:
このスタンフォード大学のCNNの動画をしばらく見てみましたが、初回だけFei-Fei Li先生の講義があって、その後はドクターの学生がスライドを見せながらCNNについて講義というか説明しています。教科書の内容をそのまま解説しているだけの授業という感じで、あまり頭に入ってきません。やはり、Andrew NG先生の教え方がいかに上手かというのが分かります。

2017年10月3日火曜日

Coursera: Deep Learning/ コース2、コース3終了

引き続きCourseraのDeep Learningコースのコース2と3を受講しました。

・コース2(3週間):Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
・コース3(2週間):Structuring Machine Learning Projects

コース2においてはRegularization、Dropout、Normalization、ハイパーパラメータの調整、Batch Normなど、けっこう細かなテクニックを学びました。ニューラルネットというよりも、メインのモデルをより効率的に計算していくスキルといった感じです。これもまた実践的な場面ではよく用いられているテクニックのようで、すべてを完璧に習得したというわけではないのですが、それぞれがどんなものなのかということがわかったし、ディープラーニングの世界で用いられているボキャブラリーが増えてよかったと思います。
コース2の後半では、いよいよTensorFlowを用いたプログラミング課題が登場してきました。このままTensorFlowでどんどんプログラミングしていくのかと思ったら、そうでもありませんでした。いままではNumpyだけを使いフルスクラッチでプログラミングしていたけれども、TensorFlowのようなライブラリを使えば一行で済みますよという程度の内容でした。そうこうしているうちにコース2も終わり最後のコース3に突入してしまいました。

コース3ではもうプログラミング課題はなくて、1週ずつ最後に15問のクイズがあるだけです。しかしそのクイズが実際の現場でのケーススタディという設定で、ディープラーニングをつかったシステムを構築している際のデータセットの扱い方や様々なエラーの対処法などに関する問題です。
たしかにこのコースは理論的というよりも実践的スキルと知識を身につけて、すぐにでもこの業界に就職できるかのような教え方をしています。
当初は、ディープラーニングを使った様々なアルゴリズムを習得できると想像していましたが、中心となるアルゴリズム(モデル)に対する細かなテクニック(コース2で学んだ内容)のほうがどちらかというと重要という感じです。あるモデルをつくっても、それが機能するようにするにはデータの扱い方や様々な調整/最適化が必要で、この辺はなかなか独学だと身につけにくい部分かと思います。そんな感じでコース3もあっという間に終わってしまいました。

 コース2の修了書。

コース3の修了書。

結局、現在開講されているDeep Learningコースの1~3を1週間の無料期間内に終わらせてしまいました。前回、受講したMachine Learningコースと重なっている部分もあったので、1〜2週間分を1日で終わらせたというペースです。特にコース1の前半とコース3はすぐに終わってしまうので(動画を見てクイズに答えるだけ)、実質コース1の後半とコース2を数日かけて勉強すればいいという感じです。個人的にはコース2が一番勉強になりました。
1週分約2時間の動画を手書きのノートでメモをとりながら見続けるという感じです。動画を見ているだけだと覚えが悪いので、ノートをとったほうがその後動画を見直す回数もかなり減って効率が上がります。ただ問題は、日本語字幕はまだ準備されていない部分がほとんどなので、英語で覚えないといけないというところでしょうか。
前回、約1ヶ月ほどかけて受講したMachine Leaningコース(11週)のほうが内容が濃かったような気もします。Deep Learningコースは1〜3まで合わせても9週しかないし、そもそも初心者向きでもあるため、それほど大変な内容になっているというわけでもないような気がします。Machine Leaningコースは次から次へと面白いアルゴリズムがでてきてその都度わくわくしましたが、Deep Learningコースはより実践的というか、普段データサイエンティストの人たちがどのようなこと(地味な作業も含めて)やっているのかというのがわかりました。
やはりおすすめは、Machine Learningコース(11週:無料)を受講して、従来の機械学習で基礎を学んでから、その延長というか最近の動向にあわせたDeep Learningコースを受講する順番がいいかと思います。Deep Learningコースも初心者向けなので、このコースから受講してもいいとは思いますが、細かい部分まではあまり丁寧に教えてくれないという感じです。

Deep Learningコース4は一番興味あるCNNなのですが、まだ開講していないので、しばらくは他のコースでもまたのぞいてみようかなと思ってします。

2017年10月1日日曜日

Coursera Deep Leaning Specialization: Course 1 終了

CourseraのMachine Learningコースが終わってしまったので、引き続きDeep Learningコースを受講することにしました。このコースは$49/月の有料コースですが、最初の1週間はお試しということで無料です。前回のMachine Learningコースが充実していたので、1週間すぎて有料になっても構わないと思い、とりあえず登録してみました。


Deep Learning Specializationというコースで、大きくは以下のコースで構成されています。

・コース1(4週):Neural Network and Deep Learning
・コース2(3週):Improving Neural Networks: Hyperparameter tuning, Regularization and Optimization
・コース3(2週):Structuring Machine Learning Projects
・コース4(未定):Convolutional Neural Networks
・コース5(未定):Sequence Models

特に興味があるのがコース4のCNNですが、まだコース4と5は開講していません(そろそろ開講するらしいですが)。コース単体での受講もできるようですが、せっかくなので順を追って受講し、コース4までは到達したいと思っています。

UdemyのGANコース:
しかしながら、同時にUdemyの以下のGANのコースも気になっています。こちらも有料(1200円/割引価格)のコースです。
個人的にGANを使った画像生成に興味があるので、このコースを受講してみたいのですが、まだまだDeep Learningの知識やスキルも追いつかないと思うので、CourseraのDeep Learningコースが終わったら、このGANのコースも受講してみようかと考えています。

以前から独学で機械学習を学んでいたけれども、このようなオンラインコースを受講したほうが理解が早いということが、前回のCoursera Machine Learningコースで分かったので、興味あるコースをいろいろ調べています。書籍で勉強してもいいのですが、書籍だとおそらく途中で投げ出してしまいそうなのと、こういった専門領域の書籍は値段的に結構高いので、必要以上に書籍は購入しないようにしました。情報的な内容に関しては、論文なども含めてかなりネットからも入手できるし、わざわざ専門書を買うまでもないかと。それとこのようなコースだと知識だけでなく、プログラミングの課題もあるので、理解というよりも実践的なスキルが身につくような気がします。


Coursera コース1(4週):Neural Network and Deep Learningを開始
ということで、早速Courseraのこのコースを開始してみました。Week1は概要やこのコース自体の説明などで、特にプログラミングするなどの技術的なことはしませんでした。前回受講したMachine Learningコースとも内容が重なる部分もあるので、さらっと聞き流す感じでも大丈夫でした。同じように動画途中でのミニクイズがあり、Week最後にあるクイズは前回のコースでは5問でしたが10問(8問以上正解で合格)に増えていました。このクイズが結構難しくて、というのも英語なのでよく読まないとすぐに間違ってしまいます。前回のコースでも何回もやり直しました。
Week2からようやく実際的な内容に入っていくわけですが、前回のMachine Learningコースで学んだ内容と重なっている部分も多いという感じです。
ただ今回のコースはPython(Jupyter Notebook)、Numpyを使うので、それに合うアルゴリズムになっているのか微妙に違います。個人的には、Numpyよりも前回使っていたOctave言語のほうがシンプルで分かりやすいという印象でしたが、Numpyにも慣れるという意味で前回の復習も兼ねてすすめてみました。前回のコースのおかげか、Week2まではあっさり終わってしまい、残すところWeek3とWeek4だけです。
Week3からより本格的にニューラルネットワークの勉強です。それと同時にNumpyに則した行列計算方法や偏微分の説明が何回も出てきます。Week最後のプログラミング課題はブラウザ上でJupyter Notebookを使うので、以前のコースよりも便利になったという感じです。相変わらず数行を穴埋めしていく課題なので難しくないのですが、PythonやNumpyには慣れていないと記述の仕方がわかならくなるときもあります。そうやってNumpyにも慣れていきつつ、Week4に入ってしまいました。
この週で最後、複数のレイヤーを持つニューラルネットワークの実装です。相変わらずバックプロパゲーションは面倒で、前回のコースでもやったので原理は分かるのですが、複数層に対応できる一般化した式をいざNumpyで実装となるとけっこう大変でした。前回のコースでもフォワードプロパゲーションとバックプロパゲーションを復習しておきたいと思っていたので、今回Numpyで試してみてまたさらに理解が深まったという感じです。
Week4の最後のプログラミング課題は、一旦計算した値をキャッシュに記憶させておいたり、連想配列のようなディクショナリに変数を登録しておいたりというテクニックを多用しているので、このへんが慣れなくてForumを覗いてなんとか実装することができました。Numpyにおける、forループを使わない行列計算の方法、ブロードキャストなども慣れていないので、Deep Learningの内容というよりはNumpyについてももう少し勉強が必要という感じです。


コース1(4週):Neural Network and Deep Learning終了
無料期間(1週間)ということで試しに受講してみましたが、3日くらいで終わってしまいました。前回のMachine Learningコースを受講していれば、Week1と2は聞き流す程度でもいいと思います。実質、Week3とWeek4をやればいいのかもしれません(それぞれ1日ずつ)。
成績は94.4%です。プログラミング課題はすべて100%で提出しましたが、クイズ(10問中8問正解で合格)のやり直しはせず、そのままどんどん先に進んで行った結果です。もう少し理解を確実にするために復習は必要だと思いますが、次のコース2も受講し始めてしまいました。早くCNNやGANまで進みたいため急ぎがちになってしまいますが、そもそも機械学習やDeep Learning自体が面白いのでついつい次へと進んでしまいます。


受講してみての感想:
このコースは初心者向きらしく、その分前回のMachine Learningコースを受講した人にとっては物足りないかもしれません。コース5まである最初のコースなので基礎的内容が多く仕方ないのかもしれませんが、その後に控えているコース2〜5に期待したいところです。
個人的には、前回のMachine Learningコースがあまりにもよかったことから結構期待していたのですが、前回ほどすごいという印象ではありませんでした。教え方も前回のほうが丁寧だったような気がします。しかし、それは機械学習(従来の方法)とDeep Learning(最近の方法)という範疇の違いから、そうなるのかもしれません。初心者向けなので機械学習に通じる基本を一通りおさらいしつつ、すぐにDeep Learningに入っていくという感じなのかもしれません。たしかにどんどん複雑になっていくので、基本にばかり時間をさいていてもダメなのかもしれません。
ただし、実践力を身につけるという方向性は変わってはいないと思うので、すぐにも役立ちそうなスキルをどんどん教えてくれると思います。
日本語環境はまだそれほど整っていないので、英語に抵抗がある人にはきついかもしれません。しかし数式やソースコードが読めれば、英語が多少分からなくてもなんとかなるとは思います。

コースの修了書を受け取るためには本人確認書類をCourseraに送付しなければいけません。日本語で記載されている運転免許証の画像を送ったのですが大丈夫でした。一晩たってから、このコース修了書が送られてきました(実際は名前も記載されています)。無料期間でも修了書を発行してくれるようです。

続き:
Coursera: Deep Learning/ コース2、コース3終了

2017年9月27日水曜日

Coursera:機械学習コース終了

先月の8/26日にCourseraに登録して、11週あるコースでしたが、32日間でMachine Learningコースを終えました。やはり、評判通り非常に勉強になるコースでした。
教え方が上手であるとか、細かく指導してくれるとか受講者の声が書いてありましたが、まさにそうだと思います。途中その他のコースをちょっとのぞいてみたけれども、やはりこのコースがどれだけ優れているかわかりました。しかも無料でここまでの内容を受講できるというのはすごいことだと思います。以前、ネットを頼りに機械学習を独学していましたが、やはりこのようなコースを受講したほうがずっと早いという感じです。優れた書籍も数多くあると思いますが、書籍を使った勉強だとタイムリミットがないため挫折も多くなってしまいます。人にもよりますが、個人的にはこのようなコースのほうが勉強もはかどりました。
このコースはプログラミングもしながら数式を理解できるので、いままでブラックボックスになっていた部分がかなりはっきりしました。オクターブ言語については、行列計算を楽にしてくれるツールという感じで、今回はじめて使いましたが、すぐに慣れて特に問題ありませんでした。
このコースのいいところは、それほど予備知識なくても一通り機械学習について勉強できるというところだと思います。通常、書籍など買い込んで(買い込んで終わりになってしまうパターンもよくある)で予備知識を得てから学ぶという手順になることが多いとおもいますが、そういった余計な書籍も必要とせず進められました。時間的にも金銭的にも一番ショートカットできるコースだと思います。
やはり教え方が上手いというか、分からない人に分からせようとする熱意みたいなものが感じられます。例えばWikiなどで機械学習について調べてみると、数学的に正確に詳しく書かれていたとしても、分からない人に分からせようという配慮ある表現ではないため理解に苦しみます。このコースは解説がとてもわかり易く(初心者が勘違いしそうな部分は何度も説明してくれたり)、クイズやプログラミング課題も適度な難しさがあって、初心者にとってどの部分を鍛えるのが一番効率いいか分かっているような教え方だと思います。


前半はコースの仕組みやオクターブ言語、そして機械学習そのものにも慣れずにそれなりに時間かかりましたが、後半はかなり順調に進み、授業内容もどちらかというと応用的な方向に移行していったので、思ったより時間がかからず一気に最後まで行ってしまいました。最後の2週は、プログラミング課題もないのですぐに終わってしまい、いきなり今後の楽しみが減ったというか、TV番組の最終回のように少しさびしい感じです。

線形回帰、最急降下法、ロジスティック回帰、正則化、ニューラルネットワーク、サポートベクターマシン、K-平均法、次元削除、PCA、異常検知、強調フィルタリングなどいろんな種類を学びました。複雑な数式も理解できるようになったのはよかったです。

やはりWeek5のバックプロパゲーションまでが大変という感じです。その後は、これまでの内容をベースに応用的に発展させたり、デバッグや評価、あるいは実際のプロジェクトを模倣した演習課題と移行していくので、前半に学んだ基本原理をどのような場面でどのように使うかということも学ぶことができて非常にためになります。

今後は、個人的にはCNNやGANに興味があるので、同じCourseraのDeep Learningコース(有料:$49/月)を受講してみようかと考えています。ここでDeep Learningを学んで、その後はできればGANのような画像生成に進んでいけたらと考えています。

続き:
Coursera Deep Leaning Specialization: Course 1 終了

人気の投稿