研究室ブログの紹介
研究室のメンバーで、月1ハッカソン的な企画を始めました。
その毎月の報告をブログの形にすることになったので、
是非御覧ください。
monthly-hack.hatenablog.com
報告
こんにちは。最後に記事を投稿してから、約3ヶ月がたちました。
本記事は、今までとこれからについてです。
今まで
2月はリクルートでデータ解析インターンに参加していました。
recruit-jinji.jp
3月、4月は就職活動でした。データ分析や機械学習周りのお仕事がしたいです。
これから
今後は論文と実装を中心に記事を書きたいと思います。
また研究室単位でブログを立ち上げる動きもあるので、
そちらに注力するかもしれません。
macでmkl&numpyを構築した
前回記事の投稿から数時間後, きちんとmkl&numpyの構築に成功した.
pip-install-deeplearning.hatenadiary.jp
兆候
前回記事 'ここに辿り着くまで' で記載したエラーの対処方法を調べていると 'dynamic link' がどうたらこうたら, という話をたくさん見かけました.
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so, 2): Library not loaded: libmkl_rt.dylib Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so Reason: image not found
そこではDYLD_LIBRARY_PATHを設定することも示唆されていたので, 改めて調べ直すと有力な記事を発見.
github.com
構築
記事ではnumpy-1.8.1, python3.4ですが, numpy-1.10.4, python2.7でも構築できました.
/numpy-1.10.4/site.cfg または ~/.numpy-site.cfg を以下の内容で用意
[mkl] library_dirs = /opt/intel/mkl/lib include_dirs = /opt/intel/include:/opt/intel/mkl/include mkl_libs = mkl_rt lapack_libs =
~/.bash_profile を設定
export CC=clang export CXX=clang++ export FFLAGS=-ff2c export PYLINK="import sys; import os; print('-L' + os.path.abspath(os.__file__ + '/../..') + ' -lpython2.' + str(sys.version_info[1]))" export DYLD_LIBRARY_PATH="/opt/intel/lib/intel64:/opt/intel/lib:/opt/intel/mkl/lib:$DYLD_LIBRARY_PATH"
/numpy-1.10.4/setup.py を実行
python setup.py config --compiler=intelem python setup.py build --compiler=intelem python setup.py install
検証
インストールが終わったところで各種検証をしていきます.
python -c'import numpy; numpy.show_config()' lapack_opt_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include'] blas_opt_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include'] openblas_lapack_info: NOT AVAILABLE lapack_mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include'] blas_mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include'] mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/include', '/opt/intel/mkl/include']
速度比較すると一目瞭然. 早くなっています(anacondaで構築したmklよりも早い).
chainer
またchainer_mnistのエラーもちゃんと解消されています.
pip-install-deeplearning.hatenadiary.jp
python train_mnist.py n_units 1000 load MNIST dataset epoch 1 graph generated train mean loss=0.190347706894, accuracy=0.942616669834 test mean loss=0.106343430469, accuracy=0.966100007296 epoch 2 train mean loss=0.0741488920168, accuracy=0.976766676207 test mean loss=0.086192065514, accuracy=0.974100006819 epoch 3 train mean loss=0.048918632143, accuracy=0.984400010208 test mean loss=0.0637195110742, accuracy=0.980100007057 epoch 4 train mean loss=0.0352272967775, accuracy=0.988666675289 test mean loss=0.0778577751776, accuracy=0.97710000515 epoch 5 train mean loss=0.0289251541828, accuracy=0.990183341404 test mean loss=0.0699444887941, accuracy=0.981000007987 epoch 6 train mean loss=0.0223340781424, accuracy=0.992733340065 test mean loss=0.0735415374582, accuracy=0.981900007725 epoch 7 train mean loss=0.023896622029, accuracy=0.99221667399 test mean loss=0.0738069448388, accuracy=0.98120000422 epoch 8 train mean loss=0.0157400782724, accuracy=0.994600005051 test mean loss=0.0902125522017, accuracy=0.979400005341 epoch 9 train mean loss=0.0156944541644, accuracy=0.994666671356 test mean loss=0.0669454357358, accuracy=0.983200008273 epoch 10 train mean loss=0.0164206012773, accuracy=0.994833338062 test mean loss=0.0776587059804, accuracy=0.981800007224 epoch 11 train mean loss=0.0131828821437, accuracy=0.995750004053 test mean loss=0.0715873185383, accuracy=0.984500007033 epoch 12 train mean loss=0.012000972836, accuracy=0.996083337069 test mean loss=0.0895336843703, accuracy=0.982900007963 epoch 13 train mean loss=0.0143335766766, accuracy=0.995516670843 test mean loss=0.0933588848546, accuracy=0.981100007892 epoch 14 train mean loss=0.0109565397249, accuracy=0.99610000362 test mean loss=0.10498684463, accuracy=0.97990000546 epoch 15 train mean loss=0.0104289456925, accuracy=0.997233335972 test mean loss=0.0856612050419, accuracy=0.983500004411 epoch 16 train mean loss=0.00717544781743, accuracy=0.997816668749 test mean loss=0.108521250341, accuracy=0.982600008845 epoch 17 train mean loss=0.00981602142994, accuracy=0.997100002766 test mean loss=0.0990101728047, accuracy=0.982200005651 epoch 18 train mean loss=0.0136716291517, accuracy=0.996433336735 test mean loss=0.109974410593, accuracy=0.981400005817 epoch 19 train mean loss=0.00630845916929, accuracy=0.998033335209 test mean loss=0.124410866243, accuracy=0.977700008154 epoch 20 train mean loss=0.0124550565974, accuracy=0.996566669941 test mean loss=0.106592905503, accuracy=0.981600005627 save the model save the optimizer
さいごに
自分自身にお疲れ様でしたと言いたいです.
macでmkl&numpyを構築したかった
numpyの計算を裏でサポートしてくれるmklを導入してみました. ネット上にmacでの導入例が少なく, 調べたり試行錯誤にかなり時間を費やしたので, 報告. mkl&numpyの構築には2つの方法があり, 片方はとても怪しい方法です. そして結論を言ってしまうと構築できていません.
構築できました(追記: 1/30)
pip-install-deeplearning.hatenadiary.jp
numpyを重ねる
pipでnumpyをインストールをした状態で, numpyソースコードのsetup.pyを動かす怪しい荒技です. numpyが重なっている?共存している状態になります. なぜこんなことをするのかも後ほど.
まずIntel MKLを入手します. 以下のサイトから'click here now to register and download'から必要事項を入力してダウンロード, インストールをします.
No Cost Options for Intel Math Kernel Library (MKL), Support Yourself, Royalty-Free | Intel® Developer Zone
次にnumpyのソースコードを入手します(執筆時はv1.10.4). 次のどちらかのサイトからダウンロードできます.
Numerical Python - Browse Files at SourceForge.net
Release v1.10.4 · numpy/numpy · GitHub
ではまずは初期状態を確認します. numpyをインストールしてどのライブラリを使っているか確認します.
pip install numpy python -c'import numpy; numpy.show_config()' lapack_opt_info: extra_link_args = ['-Wl,-framework', '-Wl,Accelerate'] extra_compile_args = ['-msse3'] define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)] openblas_lapack_info: NOT AVAILABLE atlas_3_10_blas_threads_info: NOT AVAILABLE atlas_threads_info: NOT AVAILABLE atlas_3_10_threads_info: NOT AVAILABLE atlas_blas_info: NOT AVAILABLE atlas_3_10_blas_info: NOT AVAILABLE atlas_blas_threads_info: NOT AVAILABLE openblas_info: NOT AVAILABLE blas_mkl_info: NOT AVAILABLE blas_opt_info: extra_link_args = ['-Wl,-framework', '-Wl,Accelerate'] extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers'] define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)] atlas_info: NOT AVAILABLE atlas_3_10_info: NOT AVAILABLE lapack_mkl_info: NOT AVAILABLE mkl_info: NOT AVAILABLE
次にダウンロードしたnumpyのソースコード内から上書きインストールをします. まずはソースコードの内にsite.cfgというファイルを作ります(ファイルの中身は以下). これでインストールしたmklの場所を指定してあげます.
[mkl] library_dirs = /opt/intel/mkl/lib/ include_dirs = /opt/intel/mkl/include mkl_libs = mkl_rt lapack_libs =
configオプションで, ちゃんとmklを認識できているか確認します.
python setup.py config Running from numpy source directory. /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'test_suite' warnings.warn(msg) blas_opt_info: blas_mkl_info: /Users/mutoumasahiro/Downloads/numpy-1.10.4/numpy/distutils/system_info.py:635: UserWarning: Specified path is invalid. warnings.warn('Specified path %s is invalid.' % d) FOUND: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] FOUND: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] non-existing path in 'numpy/distutils': 'site.cfg' F2PY Version 2 lapack_opt_info: openblas_lapack_info: libraries openblas not found in ['/Library/Frameworks/Python.framework/Versions/2.7/lib', '/usr/local/lib', '/usr/lib'] NOT AVAILABLE lapack_mkl_info: mkl_info: FOUND: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] FOUND: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] FOUND: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'define_macros' warnings.warn(msg) running config
いろいろWarningが出ているのですが, よくわかりません. ここらへんを解決できるといいのですが... とりあえずmklを認識できているのを確認したら, インストールします. その後LD_LIBRARY_PATHを通して, show_config()できちんとmklがライブラリとして認識されているのをチェックします.
python setup.py install export LD_LIBRARY_PATH="/opt/intel/mkl/lib:$LD_LIBRARY_PATH" cd #エラーが起きるのでnumpyのディレクトリから離れる python -c'import numpy; numpy.show_config()' lapack_opt_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] blas_opt_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] openblas_lapack_info: NOT AVAILABLE lapack_mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] blas_mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include'] mkl_info: libraries = ['mkl_rt', 'pthread'] library_dirs = ['/opt/intel/mkl/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['/opt/intel/mkl/include']
これで一応成功です. ちなみにpip uninstall numpyが2回できるので, 本当に重なっている?ことがわかります.
ここに辿り着くまで
Numpy/Scipy with Intel® MKL and Intel® Compilers | Intel® Developer Zoneにはmkl&numpyの構築方法が乗っているんですが, Linux仕様のせいか同じことをやってもうまくいきませんでした. 同じようにやって引っかかったのはこちら.
python -c'import numpy; numpy.show_config()' Traceback (most recent call last): File "<string>", line 1, in <module> File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/__init__.py", line 180, in <module> from . import add_newdocs File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/add_newdocs.py", line 13, in <module> from numpy.lib import add_newdoc File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/__init__.py", line 8, in <module> from .type_check import * File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/type_check.py", line 11, in <module> import numpy.core.numeric as _nx File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/__init__.py", line 14, in <module> from . import multiarray ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so, 2): Library not loaded: libmkl_rt.dylib Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/multiarray.so Reason: image not found
これの解決法を調べるのが難しくて, もしかして共存させればいいんじゃないかなとふと思いついた次第. とても悪手ですが, 長時間の試行錯誤でだいぶ心が折れていたので動けばいいやと...
Anacondaから入れる
Anacondaがmkl, numpy, scipyなどをまとめて構築してくれます. 先の方法と比べてとても簡単で感覚的にも正攻法です. numpy.show_config()で確認します.
conda install mkl python -c'import numpy; numpy.show_config()' lapack_opt_info: libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'] library_dirs = ['//anaconda/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['//anaconda/include'] blas_opt_info: libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'] library_dirs = ['//anaconda/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['//anaconda/include'] openblas_lapack_info: NOT AVAILABLE lapack_mkl_info: libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'] library_dirs = ['//anaconda/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['//anaconda/include'] blas_mkl_info: libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'] library_dirs = ['//anaconda/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['//anaconda/include'] mkl_info: libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread'] library_dirs = ['//anaconda/lib'] define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)] include_dirs = ['//anaconda/include']
詳しくはMKL Optimizations — Continuum documentation
Anacondaを入れていない人はこちらからWhy Anaconda? | Continuum
検証
ここからはテストコードを用いて速度比較及び動作検証を行います. テストコードはこちら
テストのうち'Matrix Multiplication (double precision)'の結果を比較します. これはmn行列とnk行列の内積を計算していて,
]
となっています. 結果を見る限りそんなに早くなっていないと思います(後述のubuntuの結果を見ると一目瞭然).
chainerのエラー解消
以前, ブログに書いたchainer/examples/mnist/train_mnist.pyがバグるというお話. これの原因がnumpyを裏で計算しているパッケージによるものという可能性が示唆されていました. そこでanaconda構築したmkl環境で確認したところ, エラーが解消されていました. ということでこの問題の関係方法として'他のライブラリを導入する'が挙げられます.
pip-install-deeplearning.hatenadiary.jp
さいごに
最初のnumpyを重ねた方法でのmklでは, chainer_mnistのエラーが残っていたのでおそらくちゃんとmklライブラリを使っていないと思います. それに対してanacondaはエラーがなくなっているので一応mklライブラリを使っているようです(もちろん他よりは高速化しているのも根拠). またMacBookPro環境ではmklを使ったところでCPUが1枚なので高速化されないのかも知れないです.
そもそも大規模な計算をするならGPU環境でやるので, macbookpro上で高速化するメリットも特に無いです. 今回はmac上でmklを構築した例があまりネット上に出回っていなかったので挑戦してみました. だけどうまくいかないので, これ以上はあがきません. 誰かがこれを見て, 引き継いでくれることを祈ります. 何かあったら教えて下さい.
おまけ
Linux(Ubuntu)上でmkl, numpy構築しました. 参考記事の通りにやるだけでとても簡単. 簡単すぎてmacの恐ろしさを改めて感じました. 明らかに早くなっています.Python - mkl numpyのインストール方法 - Qiita
DCGAN
Deeplearningを使って画像を生成するDCGANを紹介します.
論文と合わせて, chainerで実装した例を読むと理解しやすいです.
Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
(Alec Radfold, Luke Mets, Soumith Chintala, http://arxiv.org/pdf/1511.06434v2.pdf)
Chainerを使ってコンピュータにイラストを描かせる - Qiita
Chainerで顔イラストの自動生成 - Qiita
はじめに
こんにちは。大したことを書いていないのに, 毎日アクセスされていてびっくりです. アクセスされている間は, ちゃんと記事を書こうと思い, 年末に読んでいたDCGANを紹介します.
これはニューラルネットワークを使って画像生成するアルゴリズムで, デモを見る限り, うまく生成しているし, Word2vecのように画像の意味をベクトル化できているようです.
そもそもGANすら読んでいないので「'Adversarial'ってなんだ?」というところから始まり, Qiita上の実装コードやデモ, いろんな人の説明を読むまでを通して理解しました.
※注意
去年の4月からDeepLearningの勉強をし始めたので, わからないところ, 間違っている可能性があります.(もしよければ指摘してください)
その上, 英語も堪能ではないので, 誤解している可能性があります.
(もしよければ指摘してください)
Generative Adverasarial Networks
DCGANの説明に入る前に, 元となる手法であるGANを紹介します.GANは下図のように生成モデルと識別モデルが交互に学習をします. 例えて言うなら, 偽造犯と鑑定士のイタチごっこです. 変数や式を説明は以下のとおり.
- :生成モデル. から の画像を生成.
- :識別モデル. をとして判定.がから生成されたと判定した時, .
- : n次元の一様分布に従う変数.
- 鑑定士は本物の絵画を見て, (正解)になるように学習.
- 鑑定士は偽物の絵画を見て, (正解)になるように学習.
- 偽造犯は材料から偽物の絵画を描き, (不正解)になるように学習.
以上を繰り返すことで, 偽造犯の腕がどんどん磨かれて, より本物っぽい絵画をかけるようになります.
(画像はこちらから拝借: Chainerで顔イラストの自動生成 - Qiita)
(GANの論文はこちら: http://arxiv.org/pdf/1406.2661v1.pdf)
DCGANができたこと
それっぽい画像の生成
これはベッドルームの画像を生成した例です.
ぱっと見ると, 本当のベッドルームみたい.
(論文中,図3)
Word2vecのようなベクトル演算
'メガネベクトル'や'笑顔ベクトル'など意味演算ができていました.
これがどこまでいけるのかを今度試します.
なんでこのようなベクトル演算ができたのかというと, 生成される画像はn次元空間のzのパラメータで決まるところに注目するとわかります. このn次元空間上で異なる2つの画像を作る点, またはそれらの画像の平均z1, z2の差がベクトルになるわけです.
Chainerと読む「深層学習」-vol.2
「深層学習 (機械学習プロフェッショナルシリーズ) 」をChainerのコードと交えて読み進めようという趣旨。
こんにちは。Chainerがバージョンアップして
サンプルコードのネットワークの定義方法が変わりました。
pythonのclassの使い方を少し理解した気がします。
今回は第2章の順伝播型ネットワーク(FFNN)です。
Chapter2 順伝播型ネットワーク
2.1 ユニットの出力
順伝播型ネットワーク(以降:FFNN)の出力は線形結合となっていて
上の式のように入力xに重みwをかけて、バイアスbを足す。
これをchainerではchainer.linksのLinear関数で表す。
import chainer.links as L u1 = L.Linear(4, 1) # (2.1a) u2 = L.Linear(4, 1) # (2.1b) u3 = L.Linear(4, 1) # (2.1c) u = L.Linear(4, 3) # (2.3a)
Linear関数を詳しく説明すると、
class chainer.links.Linear(in_size, out_size, wscale=1, bias=0, nobias=False, initialW=None, initial_bias=None)
Linear(入力素子数, 出力素子数, 重みの標準偏差, バイアスの初期値, バイアスの有無, 重みの指定, バイアスの指定)
といった引数ががあり、重みやバイアスの初期値が渡されていない場合は、重みは正規分布、バイアスは0となる。
2.2 活性化関数
活性化関数はシナプスの役割をしていて、特定の値で発火する。単調または非線形関数が主に使われている。
これをchainerではchainer.functionsに用意されている。
import chainer.functions as F z = F.sigmoid(u) # ロジスティックシグモイド関数 z = F.tanh(u) # 双曲線正接関数 z = F.relu(u) # 正規化線形関数
他にも様々な活性化関数が用意されている。
2.3 多層ネットワーク
図2.4(a)をchainerで表してみよう。
入力をx, 出力をyとすると
# まずは各層を定義する。 u2 = L.Linear(4, 3) u3 = L.Linear(3, 2) # 次に繋げる x = [x1, x2, x3, x4] z2 = relu(u2(x)) z3 = sigmoid(u3(z2)) y = z3
という感じになる。
2.4 出力層の設計と誤差関数
正解ラベルの型
chainerでは問題の種別によって、
正解ラベル(本書だと望ましい出力d)の型を整える必要があります。
回帰の場合、正解ラベルをnumpy.float32型
分類の場合、正解ラベルをnumpy.int32型
にする必要がある。変換方法はdという配列に対して
d = d.astype(numpy.float32) # 回帰 d = d.astype(numpy.int32) # 分類
誤差関数
誤差関数は活性化関数と同様にchainer.functionsに用意されていて、
yをネットワークの出力、dを望ましい出力にすると
loss = F.mean_squared_error(y, d) loss = F.softmax_cross_entropy(y, d)
と表すことができる。
次回は確率的勾配法です。
github.com
- 作者: 岡谷貴之
- 出版社/メーカー: 講談社
- 発売日: 2015/04/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
chainerのエラー
OS X El Captain上でChainer(ver1.5.1)のMnistサンプルを動かしたら、
学習が進まないエラーを見つけた話
numpyが裏で使っている計算ライブラリを変更することで解決できました.
ついでに計算速度も良くなるので是非, Intel MKLを導入しましょう. (追記: 1/30)
pip-install-deeplearning.hatenadiary.jp
学習が進まない
新年あけましておめでとうございます。
今年1年間このブログを続けるようにがんばります。
前回、Macを新調した話をしましたが、
あのあとChainerの動作チェックしたら
おそらくMac環境依存のエラーに出くわしました。
GithubにあるChainerのソースコードには様々なサンプルコードがあって
examples/mnist/train_mnist.py でmnistをニューラルネットワークで解けます。
github.com
通常だとこのように学習が進むのですが、
(こちらから拝借しました)
Python - 【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。 - Qiita
epoch 1 train mean loss=0.278375425202, accuracy=0.914966667456 test mean loss=0.11533634907, accuracy=0.964300005436 epoch 2 train mean loss=0.137060894324, accuracy=0.958216670454 test mean loss=0.0765812527167, accuracy=0.976100009084 epoch 3 train mean loss=0.107826075749, accuracy=0.966816672881 test mean loss=0.0749603212342, accuracy=0.97770000577 epoch 4 train mean loss=0.0939164237926, accuracy=0.970616674324 test mean loss=0.0672153823725, accuracy=0.980000005364 epoch 5 train mean loss=0.0831089563683, accuracy=0.973950009048 test mean loss=0.0705943618687, accuracy=0.980100004673
僕のやったところ...
学習エラーが大きすぎるし、学習が進んでいない?事態に。
epoch 1 graph generated train mean loss=103.601352873, accuracy=0.455199998431 test mean loss=248.828919678, accuracy=0.364100000262 epoch 2 train mean loss=477.577273048, accuracy=0.449366665569 test mean loss=570.153792725, accuracy=0.587700000107 epoch 3 train mean loss=910.396587283, accuracy=0.505549998085 test mean loss=735.400798035, accuracy=0.496799997687 epoch 4 train mean loss=1791.45682208, accuracy=0.513516665933 test mean loss=1289.56998779, accuracy=0.512299997807 epoch 5 train mean loss=2166.74419698, accuracy=0.55141666539 test mean loss=2102.33599121, accuracy=0.617300002873
詳しく調査
何がおかしいのかいろいろ調べると中間層の値(n_units)が
1000付近だと異常を起こすことを特定。(簡単のため、epoch=1)
n_units = 900, 910, ... , 1090にしたときのtrain loss(青)
n_units = 990, 991, ... , 1009にしたときのtrain loss(青)
環境
一応、僕の環境はこんな感じ。
OS X El Captian v10.11.2
MacBook Pro (Retina 13-inch、Early 2015)
プロセッサ 3.1 GHz Intel Core i7
メモリ 16 GB 1867 MHz DDR3
Chainer公式に報告
自分では原因を特定できないので、Chainer公式に報告しました。
Chainer (@ChainerOfficial) | Twitter
にリプライを送ると、こちらに似たような問題を抱えた人を発見。
groups.google.com
予想通り、Mac環境に依存したエラーのようですね。
このままだと研究してる時にこのPCから出た数値を信用できなくなるので
次のアップデートぐらいで改善されてると嬉しいです。