Neural Networkでハートを描く!!@TensorFlow[関数近似]
Tensorflowを使ってハートを描く関数を近似してみようと思います。
sin波の関数近似
手始めにsin波の関数近似を試したいと思います。
ソースコードはこちらにおいてあります。
github.com
今回用いたネットワークはこのようなシンプルなFFNです。
これで学習を走らせると...
このようにsin波を描くことができました!簡単ですね。
ハート関数
いよいよハートを描いていく前にハート関数をおさらいしておきます。
ハートを描くための関数はいろいろあるのですが、今回は実装が簡単そうなこちらの関数を採用しました。
【閑話】フルタチさんCM「ハートのグラフ」をエクセルで書いてみた – ウェブプラ
さて実装
いよいよハートを描いていきましょう。
sin波と違ってこれが難しいのはひとつのxに対して2つの出力があり、実質2つの関数を同時に学習する必要がある部分です。
とりあえず下のようなグラフを作成しました。
そして結果がこちら
うん、努力は認める。
たぶんlossの関数とか最適化の手法とかをいじくればできるかもしれないけど、あまり筋道だった解決プランが思いつかなかったので力技に出ることにした。(いい方法あったら教えてください)
力技で解決
悩みに悩んだ末、力技を持って解決しました。
採用されたのが下のグラフ
いや〜、力技過ぎてもはやダサい。。。
ちなみにlossを計算するときは2つの出力を一つにまとめて誤差逆伝搬にもっていってます。
こういうのはなんて言うんだろう、アンサンブル学習?マルチタスクLoss???
このグラフを学習した結果がこちら
いや〜、もう完璧ですね!
上と下のグラフがくっつきそうでくっつかない、いじらしいところが片想いの初恋のようですね!!
まとめ
単純なグラフでは複数の関数を一度に近似するのは難しいことがわかりました。
もっと現実的な問題を扱う時でも、明らかに種類の違うタスクを一度に学習させる必要があるときは出力層の手前でネットワークを分けるのが良いかもしれませんね。
関数近似は試すのは簡単ですがいろいろと考えることが多くとても勉強になるのでおすすめです!
活性化関数を変えてみてもグラフの形が微妙に変わって面白いです!
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のダウンロード
- UNetbootinのインストール
- 高速スタートアップを無効にする
- Windowsのサイズを縮小する
- BIOSの設定の変更
- Ubuntuの起動
- BIOSの設定変更
- GPUドライバのインストール
- 参考記事
用意するもの
以上です。では早速作業を進めましょう。
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が立ち上がります。
USBにイメージを焼く
こんな感じに入力して[OK]を押す。UNetbootinを起動する前にUSBを挿しておかないと認識してくれないので注意。
高速スタートアップを無効にする
昔はこんな手順は必要なかったんですが。。。
[コントロール パネル>ハードウェアとサウンド>電源オプション>電源ボタンの動作を選択する>現在利用可能でない設定を変更します]
から[高速スタートアップを有効にする]のチェックを外して変更を保存します。
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を選択するとやたらとアイコンが大きい画面が表示されたのでそこでターミナルを開き、
ここで表示されるものの中に以下のページで検索したものがあればそれをインストールします。
コマンドは毎度おなじみの
これで再起動すると無事にubuntuを起動することができました。
長かった。。。。
次はTensorflowとか開発環境を整えていきます。
参考記事
Ubuntu16.04 + Windows10 のデュアルブート環境を構築する - 俺とプログラミング
Ubuntu16.04をWindows10とデュアルブート in UEFI - 極楽とんぼのロボット製作記
Ubuntu日本語フォーラム / Ubuntu 16.04 LTSインストール後再起動しても画面がくらいままで、リカバリーモードを利用しないとログインできないようです