ひるね日記

調べ物の備忘録とか

Neural Networkでハートを描く!!@TensorFlow[関数近似]

Tensorflowを使ってハートを描く関数を近似してみようと思います。

sin波の関数近似

手始めにsin波の関数近似を試したいと思います。
ソースコードはこちらにおいてあります。
github.com


今回用いたネットワークはこのようなシンプルなFFNです。
f:id:hirune924:20180205233352p:plain
これで学習を走らせると...
f:id:hirune924:20180206005704g:plain
このようにsin波を描くことができました!簡単ですね。

ハート関数

いよいよハートを描いていく前にハート関数をおさらいしておきます。
ハートを描くための関数はいろいろあるのですが、今回は実装が簡単そうなこちらの関数を採用しました。
【閑話】フルタチさんCM「ハートのグラフ」をエクセルで書いてみた – ウェブプラ
y=\sqrt{|x|}\pm\sqrt{6-x^2}
-\sqrt{6}\le x \le \sqrt{6}

さて実装

いよいよハートを描いていきましょう。
sin波と違ってこれが難しいのはひとつのxに対して2つの出力があり、実質2つの関数を同時に学習する必要がある部分です。
とりあえず下のようなグラフを作成しました。
f:id:hirune924:20180206000315p:plain
そして結果がこちら
f:id:hirune924:20180206001919g:plain
うん、努力は認める。

たぶんlossの関数とか最適化の手法とかをいじくればできるかもしれないけど、あまり筋道だった解決プランが思いつかなかったので力技に出ることにした。(いい方法あったら教えてください)

力技で解決

悩みに悩んだ末、力技を持って解決しました。
採用されたのが下のグラフ
f:id:hirune924:20180206002807p:plain
いや〜、力技過ぎてもはやダサい。。。
ちなみにlossを計算するときは2つの出力を一つにまとめて誤差逆伝搬にもっていってます。
こういうのはなんて言うんだろう、アンサンブル学習?マルチタスクLoss???

このグラフを学習した結果がこちら
f:id:hirune924:20180206004332g:plain

いや〜、もう完璧ですね!
上と下のグラフがくっつきそうでくっつかない、いじらしいところが片想いの初恋のようですね!!

まとめ

単純なグラフでは複数の関数を一度に近似するのは難しいことがわかりました。
もっと現実的な問題を扱う時でも、明らかに種類の違うタスクを一度に学習させる必要があるときは出力層の手前でネットワークを分けるのが良いかもしれませんね。
関数近似は試すのは簡単ですがいろいろと考えることが多くとても勉強になるのでおすすめです!
活性化関数を変えてみてもグラフの形が微妙に変わって面白いです!

Tensorflow環境構築の奮闘記@Ubuntu16.04.3

前回の記事Ubuntuが使えるようになったところで次はTensorflowを使えるようにしましょう。

今回の記事ではTensorflowのCIFAR10のコードが動かせるところまでを解説します。
github.com

パッケージのアップデート

とりあえずおまじない。

$ sudo apt-get update
$ sudo apt-get upgrade

ホーム下のディレクトリ名の英語化

ここが日本語なのが気に触るので英語に変更します。
別にしなくてもいいです。

$ LANG=C xdg-user-dirs-gtk-update
$ sudo reboot

pipのインストール

pipをインストールします。

$ sudo apt-get install python-pip python-dev

CUDAのインストール

こちらのページに従ってCUDAをインストールしていきます。
CUDA Toolkit 9.1 Download | NVIDIA Developer
私はdeb(local)を選択しました。そして書いてあるがままにコマンドを叩く。

$ sudo dpkg -i cuda-repo-ubuntu1604-9-1-local_9.1.85-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda

ここで、驚くべき自体が発生しました。。。
nvidia-smiコマンドを叩くと、、、

$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

なんとエラーが!実は一度目はこの問題を上手に解決できずにUbuntuを再インストールしました。。。(泣
こちらの記事では「再起動したら治ったぜ!!」と書いてますが、私は再起動するとログインすらできなくなりました。。。(泣
cuda - NVIDIA NVML Driver/library version mismatch - Stack Overflow
どうやらDriverのバージョンが合っていないと怒られているようなので、前の記事でインストールしたnvidia-387の一つ前のバージョンnvidia-384をインストールすると解決しました。

$ sudo apt-get install nvidia-384

ここで一度再起動します。ドライバー周りを設定するときは頻繁に動作確認して再起動するのが良いです

cuDNNのインストール

こちらのページに従ってcuDNNをインストールしていきます。
NVIDIA cuDNN | NVIDIA Developer
ちなみにアカウントを持っていないとcuDNNはダウンロードできないのでアカウントを作成してください。

Linux向けのTar形式使う場合

tarを好きな場所で展開します。

$ tar -xzvf cudnn-9.0-linux-x64-v7.tgz

cudaがインストールされたディレクトリの中にコピーしていきます。

$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h

deb形式のものを使う場合

三種類のdebを使用します。

$ cd <workdir>
$ sudo dpkg -i libcudnn7_7.0.5.15-1+cuda9.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.0.5.15-1+cuda9.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.0.5.15-1+cuda9.1_amd64.deb

動作チェック

$ cp -r /usr/src/cudnn_samples_v7/ ~
$ cd ~/cudnn_samples_v7/mnistCUDNN/
$ make clean && make
$ ./mnistCUDNN

はい動かない〜〜〜泣

Error: CUDA driver version is insufficient for CUDA runtime version

奮闘記

いろいろと格闘して、投げ出しそうになった時、、、神のような記事を見つけた。。。
Ubuntu 16.04.3にCUDA 8.0とcuDNN 6.0をインストールして、TensorFlow GPUの環境を作成する - Qiita
どうやらCUDA9シリーズは人類には早すぎたのが原因のようです。(2018/01/31現在)
解決策は[ドライバ周りのゴミを一掃する]->[CUDA8.0のインストールに向けて突き進む]です。
以下にお世話になったコマンドをまとめておきます。

ドライバ周りのゴミを一掃

$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*

NVIDIAドライバをインストール

Ubuntu16.04.3では何故かnvidia-384しかうまく動かないのか?

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ apt-cache search 'nvidia-[0-9]+$'
$ sudo apt install nvidia-384
$ reboot

CUDA8.0をインストール

$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda-8-0

cuDNN v7.0.5 for CUDA8.0のインストール

$ tar xfvz cudnn-8.0-linux-x64-v7.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64/
$ sudo chmod a+r /usr/local/cuda-8.0/lib64/libcudnn*

パスの設定

$ echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"' >> ~/.bashrc
$ source ~/.bashrc

動作確認

$ cd ~/cudnn_samples_v7/mnistCUDNN/
$ make clean && make
$ ./mnistCUDNN

動きました。ありがとうございますm(__)m

TensorFlow GPUインストール

いよいよです。こちらのページを参考にしながら進めます。
Installing TensorFlow on Ubuntu  |  TensorFlow

$ sudo apt-get install libcupti-dev

[Installing with native pip]で行きたいと思います。(仮想環境とかもうややこしいからヤメて。。。)

$ pip install --upgrade pip
$ pip install tensorflow-gpu

しかし、これでは

$ python
>>import tensorflow as tf
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory

怒られてしまいました。実は最近tensorflow v1.5がリリースされたのですが、これはCUDA9向けでCUDA8.0を使う場合はtensorflow v1.4を使わないとダメみたいです。
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory · Issue #15604 · tensorflow/tensorflow · GitHub
ということでv1.4をインストール

$ sudo pip install --upgrade tensorflow-gpu==1.4

ですが1.4はcuDNNのv6でしか動かないようです。

$ tar xfvz cudnn-8.0-linux-x64-v6.0.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64/
$ sudo chmod a+r /usr/local/cuda-8.0/lib64/libcudnn*

をやり直すと動くようになりました。。。しんど。。。

おまけ

$ sudo apt-get install git
$ git clone https://github.com/tensorflow/models.git
$ cd models/tutorials/image/cifar10
$ python cifar10_train.py 

動いた!!!!!!!

UbuntuとWindows10でデュアルブート

新しくデスクトップPCを購入したのでDeepLearning用マシンに育てていきます。

 

何はともあれ、まずはUbuntuのインストールですね!

ただ、元から入っていたWindowsを消してしまうのは勿体ないので、デュアルブートできるようにしようかと思います。

 

 

用意するもの

以上です。では早速作業を進めましょう。

Ubuntuのダウンロード

こちらのページからUbuntuのイメージファイルをダウンロードします。

Download Ubuntu Desktop | Download | Ubuntu

今回使うのは16.04.3です。

Ubuntuは4年に一度LTSといって長期サポートのものがリリースされます。オリンピックみたいですね。

 

UNetbootinのインストール

こちらのページからUNetbootinをインストールします。

UNetbootin - Homepage and Downloads

 これはUSBにisoを焼いてブータブルLiveUSBを作ることができるソフトです。

Downloadボタンをクリックするとexeファイルがダウンロードされるのでこれを実行するとUNetbootinが立ち上がります。

f:id:hirune924:20180128141008p:plain

 

USBにイメージを焼く

こんな感じに入力して[OK]を押す。UNetbootinを起動する前にUSBを挿しておかないと認識してくれないので注意。

f:id:hirune924:20180128191041p:plain

 

高速スタートアップを無効にする

昔はこんな手順は必要なかったんですが。。。

[コントロール パネル>ハードウェアとサウンド>電源オプション>電源ボタンの動作を選択する>現在利用可能でない設定を変更します]

から[高速スタートアップを有効にする]のチェックを外して変更を保存します。

 

Windowsのサイズを縮小する

この作業も昔はこの段階でしなくても後でスライドバー弄るだけでできたんですが。。。今は無理なのかな?

それではCドライブのサイズを縮小する前に、復元ポイントを削除します。

[コントロールパネル>システム>システムの保護>構成]から削除をクリックします。

これをしないとUbuntuに割り当てることのできる領域サイズの上限がCドライブの半分以下になってしまいます。

私は平等な人間なのでWindowsにもUbuntuにもそれぞれ半分ずつの領域を分け与えたいと思います。

[コンピュータの管理]を開いて[記憶域]の下の[ディスクの管理]を選びCドライブを右クリックし、[ボリュームの縮小]をクリックします。

あとは[縮小する領域のサイズ]を好きなだけ調節します。Windowsの分を減らしすぎると、、、どうなるか知りませんがきっと苦しむことになると思います。

 

BIOSの設定の変更

いよいよ完成が近づいてきました!USBブートができるようにBIOSの設定を変更します。

ここからはスクショを撮るのが面倒だったので画像は無しです、ご容赦くださいm(__)m

BIOSへの入り方は「PCメーカー名 BIOS」でググってください。

大抵の自作PCなら[F2]か[Delete]です。

再起動する前にUSBを挿しておいたほうが表示名が分かりやすくて良いです。

[Setting> Boot>Priorities]みたいなのからUSBを使いそうなものを上の方に持ってきてください。

変更を保存して終わりです。

Ubuntuの起動

作成したUSBをマシンに挿して、起動します。

黒い画面が出るので[Install Ubuntu]を選択します。

あとはウィザードに従って手順を進めていきます。

[インストールの種類]では[それ以外]を選択すること!これを間違えるとWindowsが帰らぬ人になる可能性もあります。

swap領域の設定

[空き領域]を選んで[+]をクリックします。

[サイズ]:4000
[新しいパーティションのタイプ]:論理パーティション 
[新しいパーティションの場所]:この領域の終点 
[利用方法]:スワップ領域

として[OK]を選択。

swap領域のサイズは諸説ありすぎて何が良いのかよく分かりません。

Ubuntuの領域の設定

[空き領域]を選んで[+]をクリックします。

[サイズ]:残り全て
[新しいパーティションのタイプ]:基本パーティション 
[新しいパーティションの場所]:この領域の始点 
[利用方法]:ex4ジャーナリングファイルシステム

[マウントポイント]:/

として[OK]を選択。

ブートローダをインストールするデバイス

/dev/sda を選んでおけば良いと思う。

 

これで[インストール]を押すとインストールが着々と進行して完了します。

 

BIOSの設定変更

BIOSを起動して、[Boot>UEFI Hard Disk Drive BBS Priorities]の設定でUbuntuを上に持ってきます。

これで再起動するとOS選択の画面が立ち上がるので、Ubuntuが立ち上がるのを確認すれば成功です!!

 

GPUドライバのインストール

 成功です!!と言いたいところでしたが自分はOS選択画面でUbuntuを選択しても紫色?の画面のまま固まってしまいました。

原因はGPUのドライバがデフォルトのnouveauでは相性が悪く、画面が映っていなかったようです。。。本当に焦った。。。泣

自分の場合はrecovery modeでUbuntu起動し、resumeを選択するとやたらとアイコンが大きい画面が表示されたのでそこでターミナルを開き、

$ sudo apt-get update
$ apt search "^nvidia-[0-9]{3}$"

ここで表示されるものの中に以下のページで検索したものがあればそれをインストールします。

NVIDIAドライバダウンロード

コマンドは毎度おなじみの

$ sudo apt-get install nvidia-...

 

これで再起動すると無事にubuntuを起動することができました。

長かった。。。。

次はTensorflowとか開発環境を整えていきます。

 

 参考記事

Ubuntu16.04 + Windows10 のデュアルブート環境を構築する - 俺とプログラミング

Ubuntu16.04をWindows10とデュアルブート in UEFI - 極楽とんぼのロボット製作記

Ubuntu日本語フォーラム / Ubuntu 16.04 LTSインストール後再起動しても画面がくらいままで、リカバリーモードを利用しないとログインできないようです