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

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



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


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

2018年11月20日火曜日

Kaggle Digital Recognizer(MNIST): Keras, fit_generator() + hyperopt

Kaggle Digital Recognizer(MNIST)の続きです。前回から少しだけ内容を変えてみたらベストスコアがでました。
改良点は以下です。

fit_generator():
前回は、通常の訓練model.fit()を使った後にData Augmentationとしてmodel.fit_generator()を追加して二段階で訓練しましたが、今回は最初からfit_generator()だけで訓練してみることにしました。

BatchNormalization:
CNNに関しては前回よりも層を少なくして、conv2dの後に必ずBatchNormalization()を入れ、プーリング層(学習なし)を使わずにstrides=2のconv2d()(学習あり)で1/2にダウンサンプリングすることにしました。

Hyperopt:
Hyperoptに関しては前回同様Dropout率だけを最適化しています(合計3箇所)。探索回数はとりあえず10回。

スコア:
結果はこれまでのベストスコアである0.99771(Top 5%)まで向上しました。
この辺りまで来るとスコアを0.001上げるのはかなり至難の技で、正直0.997以上になるとは期待していませんでした。しかし予想以上に満足できる結果が得られたので、Digital Decognizer(MNIST)に関してはひと段落ついたという感じです。

ただし、調べれば調べるほど興味深い項目が登場してきて、今後試してみたいのは:
・他のMNISTデータセットで今回のモデルの精度を確かめてみる(KaggleのMNISTデータセットにオーバーフィッティングしていないかどうかの検証)。
・今回はHyperoptによってDropout率を自動的に決定させましたが、Dropoutを一般化したDropconnectというのもあるらしく、それを使うとどうなるか(Keras Dropconnect Implementation)?

Kaggleで勝つデータ分析の技術
門脇 大輔 阪田 隆司 保坂 桂佑 平松 雄司
技術評論社
売り上げランキング: 363


追記:
その後、既存のkeras.datasets.mnistのデータセット(60000+10000)で検証してみると0.997以上の正解率となりました。おそらくKaggleのMNISTデータも多数含まれているので似たような結果となったのだと思います(しかし偶然KaggleのMNISTデータだけにオーバーフィットしすぎているというわけでもなさそう)。

2018年11月16日金曜日

Kaggle Digital Recognizer(MNIST): Hyperopt + Data Augmentation

引き続きKaggle Digital Recognaizer(MNIST)のスコア向上のため、今回はHyperoptData Augmentationを組み合わせてみました。
結果として、これまで0.995前後(Top 18%)のスコアがでていましたが、今回の方法で0.99671(Top 9%)まで向上しました。それでも28000個あるデータのうち92個が間違っているということになります。


今回の方法:

・畳み込み層を増やしてもう少し特徴量検出できるようにする
・あまり自動調節させるハイパーパラメータは増やさない
・バッチサイズやデータ分割などは一般的な値にしておく
・Dropout率でモデル全体の精度を調整

要は、Hyperoptによるハイパーパラメータ最適化はDropout率(合計5個)だけに絞り、その他は固定。
探索回数は20回(GTX1060で約2時間)。

前回までと異なるのは:
・ダブルの畳み込み層をもう一式追加
・Dense層出力ユニット数の増加
・最後にData Augmentationでの訓練を追加
ということになります。

Data Augmantation(訓練データの変形加工:水増し)するためにKerasのImageDataGeneratorを使用しました。
ImageDataGeneratorを使うには元データのshapeを(-1, 28, 28, 1)にしておく必要があるようです。これまではCNNモデル入力層でkeras.layers.Reshape()を使って(784, )から(-1, 28, 28, 1)に変換していましたが、ImageDataGeneratorの入力次元数とモデルの入力次元数が異なるためエラーがでてしまい、モデルに入力する前に(-1, 28, 28, 1)へ変換することにしました。

流れとしては:
・訓練画像を元にHyperoptで最適化
・最適化されたモデルをData Augmentationで追加訓練
という二段階の訓練です。
Data Augmentationの訓練は結構すぐに収束してしまいましたが、その訓練の差なのかほんのわずか向上しました。


まとめ:
個人的には、これまでスコア0.995が壁になっていて、手動でいろいろ試してみたけれどもなかなか超えられませんでした。今回のスコアは期待していた以上に良かったので、MNISTに関してはもうこの辺で充分かと思いますが、あと試してみたいのは以下。
・最初からImageDataGeneratorで訓練
・交差検証(KFold

基本的なMNIST分類問題ですが、こうやってスコア向上を目標に試してみると、いろんなテクニックが見つかりかなり勉強になります。基本的なCNNアルゴリズムだけでなく、その他の方法も組み合わせることでわずかながらでも向上するということが分かったのもよかったです。

関連:
Kaggle Digital Decognizer(MNIST): Keras, fit_generator() + hyperopt


直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
Posted with Amakuri at 2018.12.21
Antonio Gulli, Sujit Pal
オライリージャパン
販売価格 ¥3,672

2018年4月9日月曜日

Tensorflow 1.7へバージョンアップ

Tensorflowは少し前に1.6へバージョンアップしていたにもかかわらず、pytorchを使っていたため1.5のままでした。しかし1.6のあとすぐに1.7へバージョンアップしており、eager executionが改良された模様。



TensorflowはさすがGoogleだけあって開発スピードがはやいのか、内容に追いついていくのが大変。
Tensorflowといえば、

tf.placeholder()
tf.Variable()
tf.Session()

でコーディングしていくイメージでしたが、より使いやすくするために

tflearn : easy to learn, high level API
slim : a lightweight library for defining, training and evaluating models
estimator : a high-level TensorFlow API that simplifies ML programming
keras : a higher API wrapper
eager : define by run
lite : mobile, RPi

などが次々と導入されたため、どれがいいのかわかりにくくなってきたという感じ。
kerasが使えるようになってからは、シンプルなコーディングが可能になったけれども、pytorchのようなdefine by runタイプが便利になってきたこともあって、Tensorflowもeagerを導入してdefine by runも普通に使えるようになった感じ。

なんでもありとなってきたTensorflowという感じで、やはり機械学習フレームワークとしてはTensorflowがなんだかんだいって便利なのかもしれません。
ということで、使い勝手が改良されたTensorflowも再度使おうと、1.5から一気に1.7へバージョンアップしてみました。

GPUを使用しているので、

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.7.0-cp35-cp35m-linux_x86_64.whl

のpipコマンドでAnaconda仮想環境内にインストールしてあったtensorflow-gpu-1.5.0をアップグレード。
eager executionが便利そうなので、少し慣れておこうかと。

最近は、ベイズ推定などの確率的プログラミングに興味があって、

GPy
Pyro
Edward

などを勉強していまずがTensorflowにも、

Tensorflow Probability

というライブラリができたようで、Tensorflowだけであらゆることが可能となってきた感じ。



2018年1月31日水曜日

Bayesian Deep Learningの図解

事前確率や事後確率、そして確率分布を用いるBayesian Deep Learningは文章で説明されると理解しにくく、以前Variational Autoencoderを学んだとき(確率分布が登場してくる)もイメージとして把握するのが困難でした。一行ずつコーディングしていくことで、なんとかその仕組み/手順はわかったものの、GANなどのように構造が複雑になっていくとイメージが追いつかず、また分かりにくくなっていました。
そこで、以下の動画を見たら非常に分かりやすかったので、参考としてメモ。


ここでは確率分布を使わない通常の方法と確率分布を使う方法とを図で比較しながら説明してくれます。動画途中にでてくるスライド(イメージ)がわかりやすかったです。

線型回帰の場合、

X*w+b=Y

X:データ
w:ウェイト
b:バイアス
Y:予測値
 通常(非ベイズ)は、上図のそれぞれのマスに固有の数値が入りますが、

ベイズ推定を用いると(上図)、Xはデータなのでそれぞれ固有の数値ですが、w、bには正規分布などの確率分布が入り、その結果出力されるYも確率分布となります。
単に、固有の値であったwとbを正規分布に置き換えればいいというわけです。


Logistic Regressionの場合であっても、

ベイジアンでは以下のようになるだけ。
たしかに分かりやすい図解となっています。
さらに、多層のDeep Learningであったとしても、


という仕組みが、ベイジアンでは以下のようになるだけ。



Deep Learningを勉強していくと、ただですら複雑なマトリクス計算や数多くの層を計算しなければいけないので、コーディングする手順や仕組みを理解するにも一苦労です。さらには、確率分布をつかった式も途中に出てくるので、なおさら仕組みが難解になりがちですが、このようなイメージをつかむことができると理解しやすくなります。

以下の本も読んでベイズ推定を勉強していますが、文章や式だけでの表現だと頭の中にイメージするのが徐々に困難になってきて、理解するにはどうしても時間がかかっていました。やはり、イメージしやすい図解があると頭の中にも入ってきやすいという感じです。


また、Udemyには「ベイズ推定とグラフィカルモデル」という無料のコースもあります。動画内に登場する図解がわかりやすいかもしれません。覚えなければいけない式などかなりありますが、初心者にとっては難しい専門書で勉強するよりはいいかもしれません。
Youtubeでも動画は公開されており、日本語なので試しに見てみてもいいかもしれません。

2017年12月6日水曜日

Pytorch CUDA 9.0

ようやく正式にCUDA9.0のPytorch0.3.0がリリースされたようです。前回、慌ててソース版をコンパイルする必要もなかったようです。早速入れ替えてみようと思います。環境:Ubuntu16.10、GTX1060、CUDA9.0、cuDNN7.0。

無難にPython3.5で。pyenv仮想環境内にさらにAnaconda仮想環境をつくり、py359というAnaconda仮想環境内にインストールしています。ちなみに現在はpy27(python2.7、cuda8.0)とpy35(python3.5、cuda8.0)という仮想環境も別にインストールしてあります。

インストール後、Pythonを起動し、
import torch
torch.version.cuda
で、CUDAのバージョン確認、'9.0.176'になっています。
torch.backends.cudnn.version()
で、cuDNNバージョン確認、7004になっています。

いつものPytorch/examples/dcgan/cifar10を動かしてみると(1イテレーション=784回)、
1:15.80=75.8秒くらい。このサンプルでCUDA8.0と比較すると2秒くらい速くなったかもしれません。

2017年11月25日土曜日

Deep Learning用ノートパソコン(GPU:GTX1060)のエディタと実行環境

Deep Learning用ゲーミングノートパソコンの設定は一段落したのですが、使っているうちに幾つか気になる点がでてきたので少しだけ以下の環境を見直してみました。

・Python用エディタの設定
・Deep Learning用ライブラリ、プラットフォームの選定
・デュアルブートパーティションによるUbuntuへの割当量

まずはエディタに関してです。

エディタ:Pycharm/Spyder/VS Code/Atom
Pycharmが使いやすいという評判から試してみましたが、案外Anacondaに同包されているSpyder IDEというエディタのほうが使いやすかったです。しかしどちらもややカスタマイズしにくい。それでは人気のあるVS Codeはどうかというと、拡張性もありカスタマイズできそうだし、なにより動きが軽快。ということで、VS Codeで環境を整えていましたが慣れないこともあり、いまいち上手くいかない。それで、いままで使っていたAtomに戻って設定し直してみると、望んでいるような使い方ができるとわかり、結局のところAtomを使うことに。AtomはVS Codeに比べてやや重い感じもしますが、パッケージの豊富さとかなりのカスタマイズ自由度があって使いやすい。
Spyder IDE: 
Anaconda Navigatorからすぐにアップロードでき、比較的使いやすい印象。ただカスタマイズしにくい。ダークのthemeを選んでいるにもかかわらずフレーム部分だけは白いままで変えられない。オープンソースなので、元のソースを変えればカスタマイズ可能だろうけれども面倒。

Anaconda仮想環境に合わせたエディタ:
Atomを選んだ切っ掛けとして、Anacondaの仮想環境に対して設定がしやすいということが一つありました。Anaconda自体はかなり便利なのですが、切り替え可能な仮想環境とエディタをつなげる部分がやや面倒。要は仮想環境PATHへつなぐ設定法がそれぞれのエディタで異なっており、Atomの場合比較的簡単で自由度があったということです。
AtomとAnaconda Navigator:
Anacoda Navigatorでグラフィカルに複数の仮想環境を見比べることができるので便利。インストール/アンインストールもこの画面内で可能。仮想環境切り替えや接続に関してはAtomが比較的使いやすい。

最終的にはAnacondaの仮想環境は上画像のようにrootとpy35(Python3.5)だけにしました。それまでの仮想環境は:

・root(万が一のために備え、ここにはインストールしない/使わない)
・py35(安定版Tensorflow1.4、Pytorch0.2.0など/メインで使う用)
・py27(Python2.7にしか対応していないサンプルなどあるときに使う)
・cuda90(CUDA9に対応したα版Tensorflow1.5やソース版Pytorchなど/最新版実験用)

という感じで複数の仮想環境を使い分けて、どの環境が使いやすいか試していました。ライブラリやパッケージを入れすぎて不具合が出ても、仮想環境ごと消してしまえばいいのでシステムに影響を与えずに済みます。
Tensorflowなどを最新版(α版)にすれば最速になるのかと思いましたが、結局のところまだ不具合があったりサンプルも対応していなかったりとあまり使い勝手がよくない。ということから、サンプルも豊富な安定版を使ったほうがいいという結論に達しました。

Atomのパッケージ:
主には仮想環境の切り替えと接続が容易ということからAtomでの環境整備。MacBook Proのほうでは便利そうなパッケージをどんどん入れていましたが、今回はシンプルに最低限必要なパッケージだけをインストールしました。いまのところ標準装備のパッケージ以外3つだけで充分です。

・autocomplete-python
・platformio-terminal(このターミナルが使いやすい/Python RUN用)
・script(Python RUN用)

ネットで検索するとほぼ英語圏のサイトが多いことから英語表記のほうがわかりやすいため、日本語化しないことにしました。既存のOne Dark:Themeを使っていますが、フォントサイズや見た目的なカスタマイズは、Edit>Stylesheetからstyles.lessファイルで上書き変更しています。

PythonスクリプトをRUNさせる環境:
ここが一番悩んだところで、AtomのなかにもいくつかPythonスクリプトを実行できるパッケージがあり、ただRUNさせるだけであればどれでもいいのですが、ターミナルを使って実行させる方法とボタンやショートカット一発で実行できるものということ、そして仮想環境や作業ディレクトリの切り替えが即座にできるということから、platformio terminalatom-scriptを選びました。

Anaconda仮想環境切り替え方法:
Anacondaの仮想環境を使っていると、毎回ターミナルで入力が必要になります。通常は以下の状態(Anaconda root:Python3.6):
そして、以下を入力すると、
$ source activate py35
先頭に(py35)という表示がでて、仮想環境py35:Python3.5に入ったことになります。
追記:現在は「conda activate py35」に変更済み

which pythonを打てば、どのPython interpreterを使うかという違いが分かります。いわゆるPythonのPATHについてです。
これは、which pythonをつかって両方の環境のPATHを確認してみた画面です。最初のwhich pythonがAnaconda/rootのPATHです。つぎのwhich pythonがAnaconda/py35のPATHになります。
実際のところ仮想環境はAnacondaだけでなく、その手前にpyenvでも仮想環境をつくっています。anacondaで色々試しているため、anaconda内部で不具合が起きてしまったら、pyenvでanacondaごとアンインストールしてしまえばいいというわけです(実際一度anacondaを入れ替えました)。

platformio terminalの設定(かなり便利):
platformio自体は以前ESP32を試したときに使ったことがあるのですが、今回のようなPython用には設定していないので、あらためて使い直すという感じです。
Packages>Settings>Manage Packagesでインストール済みのパッケージリストからplatformioのsettingsボタンを押して各種設定に入ります。
主には、一番上のほうに出てくるこのあたりを設定します。
特にToggles欄の上から4番目の「Run Inserted Text」と5番目の「Select To Copy」にはチェックを入れておきます。
次にCore欄の、「Auto Run Command」に先程の仮想環境を切り替えるコマンドを入れておきます。ここではさらに、「which python」でPATHの確認、ディレクトリ内のリスト表示させる「ls」もセミコロンで区切っていれてあります。
その下の「Map Terminals To」でタブから「File」を選びます。
こうすると、platformio terminalが自動的に仮想環境に入って、しかも選択ファイルのディレクトリに移動して開いてくれます。
ファイルを切り替えるごとに、
source activate py35
which python
cd ${File}
ls
これらを自動的にやってくれて、仮想環境移行/PATH確認/作業ディレクトリへ移動/ディレクトリ内のリスト表示が一気にでてきて、実行する前の確認や手続きが一発で済みます。
ほかにもターミナルのパッケージがありますが、ここまでできるのはplatformio terminalくらいかもしれません。かなり便利です。
あとはプログラムをRUNさせるだけでいいのですが、もう一つ問題があります。

コマンドオプション付きのPythonプログラムの実行:
PytorchサンプルなどをRUNさせるときによくあることですが、Python Argparseでコマンドオプション(CUDAの有無やイテレーションの設定など)を追記する必要があります。

Pytorch examples/dcgan/main.pyをRUNさせる場合(コマンドオプション):

parser.add_argument('--dataset', required=True, help='cifar10 | lsun | imagenet | folder | lfw | fake')
parser.add_argument('--dataroot', required=True, help='path to dataset')
parser.add_argument('--workers', type=int, help='number of data loading workers', default=2)
parser.add_argument('--batchSize', type=int, default=64, help='input batch size')
parser.add_argument('--imageSize', type=int, default=64, help='the height / width of the input image to network')
parser.add_argument('--nz', type=int, default=100, help='size of the latent z vector')
parser.add_argument('--ngf', type=int, default=64)
parser.add_argument('--ndf', type=int, default=64)
parser.add_argument('--niter', type=int, default=25, help='number of epochs to train for')
parser.add_argument('--lr', type=float, default=0.0002, help='learning rate, default=0.0002')
parser.add_argument('--beta1', type=float, default=0.5, help='beta1 for adam. default=0.5')
parser.add_argument('--cuda', action='store_true', help='enables cuda')
parser.add_argument('--ngpu', type=int, default=1, help='number of GPUs to use')
parser.add_argument('--netG', default='', help="path to netG (to continue training)")
parser.add_argument('--netD', default='', help="path to netD (to continue training)")
parser.add_argument('--outf', default='.', help='folder to output images and model checkpoints')
parser.add_argument('--manualSeed', type=int, help='manual seed')

このmain.pyをRUNさせるには、これだけコマンドオプションがあります。ほぼdefault(コマンドオプションなし)でもいいのですが、defaultが設定されていない--dataset、--dataroot、--cuda、--manualSeedについてはコマンドオプションが必要となります。ということから最低でも、

$ python main.py --dataset cifar10 --dataroot ./ --cuda --manualSeed 1

という感じでpython main.py以下に必要項目を追記してからRUNさせなければいけません。この部分が面倒で、すべてにdefault値を設けたコードに書き直したり、この一行をコピペできるようにコメントに書いておいたりしていましたが、platformio terminalやscriptだと比較的簡単にできました(まあ、ターミナルでそのまま打ち込んでもいいのですが)。

platformio terminalのコマンドオプション付き実行の場合:
まず、上記のようなコマンドオプション付きのコマンドをコメントに書いておきます。そして最初に設定しておいた「Select To Copy」機能によって、上記コマンド一行をマウスで選択した段階でコピーが済んでおり、あとはペーストするだけになります。さらにペーストをキーマッピングしておきます。

・platformio terminalのSettings画面で「Select To Copy」にチェックを入れておく
・platformio terminalのSettings画面の下のほうにある「Custom Texts」の「Custom test 1」に「python $F」を入力しておく


このSettings画面で設定した内容は、Edit>Config...>config.csonでも編集できます。以下のconfig.csonファイルで直接編集してもいいかもしれません。
ちなみにplatformio terminalの設定はいまのところこんな感じになっています。

・Edit>Keymap...でkeymap.csonを開きキーマップ割当をする
上記の内容をキーに割り当てることで、もう少し入力方法が簡単になります。
これはkeymap.cson内に書き込んであるキー割当のスクリプトです。こちらを参考にしました。
alt-zで選択したテキストを実行します。
alt-xでpython fileを実行します。
コマンドオプションがある場合(例:python main.py --cuda --niter 1)は、コマンドオプションを含めた一行をどこかに書いておいて、それを選択してalt-zで実行するという感じです。
コマンドオプションが不要な通常の方法(例:python main.py)の場合は、そのままalt-xで実行します。キーマッピングなので、都合の良いキーに割当られますが、意外と既にあるショートカットキーと重複することがあるので、試し打ちしてみて使っていないキーの組み合わせを探さないといけません。

実行中停止させるコマンド:
通常ターミナルでプログラム実行中に割り込む命令としては、
一時停止:ctrl-z
ジョブ名表示:jobs
再開:fg 1(ジョブ名)
終了:ctrl-c
となりますが、ctrl-cで終了させるために、kill -9 $$やskill --fullなどをキーマッピングしてみましたが上手く機能しません。もうすこしSIGNALやシェルの勉強が必要かもしれません。最悪、途中強制終了するにはplatformio terminalの画面を閉じてしまうかです。
もしかしたら、platformio terminalはエミュレータのターミナルなのでそこまでの処理ができないのかもしれません。この部分については調査中です。

atom-scriptの場合:
atom-scriptは様々な言語に対応しており人気のあるパッケージだと思います。いろいろ改良されており、jupyter notebookにも対応、一応コマンドオプション付きでRUNさせることもできます。ただ問題はそのままだと仮想環境には自動的に入ってくれないという部分です。Pythonなどの環境変数に対応させるために
atom .
と、ドットつきでターミナルからatomを起動しろと書いてあります。これが煩わしいので、専用のatom起動用アイコン(ランチャー)をつくり、ドット付きの起動を可能にしました。

atom仮想環境用起動アイコン(ランチャー):
・「/usr/share/applications」の中の「Atom」アイコンを右クリックでコピー
・デスクトップなどにペーストし、右クリックでプロパティ画面を開く
・名前を「AtomPY35」などと変える
・コマンド欄に以下のような環境変数とドット(2箇所あり)を含めたシェルコマンド書く
*シェルコマンドについてはまだ勉強不足で不確かな部分もあるのですが、一応以下でも動きました。sourceの代わりにドット(.)を使っていますが、もしかしたらexportなど使ったほうがいいのかもしれません。

bash -ic ". /home/mirrornerror/.pyenv/versions/anaconda3-5.0.1/bin/activate py35; atom .; exec bash"

・ターミナルで新アイコンが置いてあるDesktopへ移動

cd ./Desktop

・新アイコンを「/usr/share/applications」へコピー移動する

sudo cp AtomPY35.desktop /usr/share/applications

・一度「/usr/share/applications」内から「AtomPY35」をクリック起動し、ランチャーにアイコンが並んだらランチャーに登録しておく


画像の色も微妙に変えておくといいかもしれません。通常用のアイコンと仮想環境用のアイコンを複数つくっておけば状況に応じて使い分けも可能です。そうすれば煩わしい事前設定をせずにアイコンクリックで仮想環境でのatomが使えるようになります。

atom-scriptでのRUN方法:
Packages>Scriptの中には
Script: Run by Number (jupyter notebook用)
Run Script (python main.py/コマンドオプションなし)
Run with profile (python main.py --cuda --niter 1/コマンドオプション付き)
Stop Script
Configure Script(環境変数やコマンドオプションなどの設定)
Close Window and Stop Script
Copy Run Results

という感じでいろいろあります。
一度対象のプログラムにフォーカスを与えてから、「Configure Script」をクリックすると、
このような設定画面が現れるので、「Program Arguments:」にコマンドオプションとなる「--cuda --niter 1」を記入して右下の▶Runボタンを押せば実行できます。この場合、ターミナルは起動しなくても実行できるので比較的簡単な操作になると思います。この内容を「Save as profile」ボタンで保存しておけば、次回からボタン操作だけで実行可能となります。
一旦保存すれば、このプログラムの設定を含んだ「dcgan(名前は任意)」というボタンが生成され、Packages>Script>Run with Profile(Shift+Ctrl+Alt+B)から「dcgan」ボタンを押して▶Runボタンで実行できます。
Stop Script(Ctrl+Q)もあるので途中で終了も可能です。

platformio terminalとscriptの二つがあれば、ほぼ問題なく簡単に実行できると思います。というわけで、エディタと実行環境については思っていたようなことができるようになったので一安心です。

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

関連:

人気の投稿