はじめに
2017/02/23に「Chainer」の大幅アップデートが公開されました。
気になっていたサンプルプログラムがChainer用だったこともあり、インストールしてみました。
Anacondaを使用しているのでパッケージ管理システム(conda)によりChainer用環境で作成しています。
環境
- Windows 10 Home 64bit
- Anaconda 4.2.0
- Python 3.5
Python数値計算環境「Anaconda」のインストール
下記サイトを参考にしてください。自分は、「C:\Anaconda3」をインストール先にしました。 yaju3d.hatenablog.jp
AnacondaのChainer用環境を作成
Anaconda3 (64-bit)メニュー配下から「Anaconda Prompt」を選択します。
Chainer用環境を作成するため、コマンドプロンプト上で下記のコマンドを入力します。
名前は「chainenv」にしました。envは環境(environment)の略称
※(ユーザー)のところは各自違います。
(C:\Anaconda3) C:\Users\(ユーザー)> conda create --name=chainenv python=3.5
環境が作成されていきます、途中のProceedの確認は「y」を入力します。
Fetching package metadata ......... Solving package specifications: .......... Package plan for installation in environment C:\Anaconda3\envs\chainenv: The following packages will be downloaded: package | build ---------------------------|----------------- python-3.5.3 | 0 30.8 MB The following NEW packages will be INSTALLED: pip: 9.0.1-py35_1 python: 3.5.3-0 setuptools: 27.2.0-py35_1 vs2015_runtime: 14.0.25123-0 wheel: 0.29.0-py35_0 Proceed ([y]/n)? y Fetching packages ... python-3.5.3-0 100% |###############################| Time: 0:00:35 906.77 kB/s Extracting packages ... [ COMPLETE ]|##################################################| 100% Linking packages ... [ COMPLETE ]|##################################################| 100% # # To activate this environment, use: # > activate chainenv # # To deactivate this environment, use: # > deactivate chainenv # # * for power-users using bash, you must source #
以下のコマンドで作った環境の一覧を表示できます。
(C:\Anaconda3) C:\Users\(ユーザー)>conda info -e # conda environments: # chainenv C:\Anaconda3\envs\chainenv tensorenv C:\Anaconda3\envs\tensorenv tensorenv2 C:\Anaconda3\envs\tensorenv2 root * C:\Anaconda3
作成した環境を有効にするには下記のコマンドを入力します。
※Windows版はsourceコマンドが無いため、activateからとなります。
(C:\Anaconda3) C:\Users\(ユーザー)>activate chainenv
これで先頭に「(chainenv)」が付くようになります。
(chainenv) C:\Users\(ユーザー)>
ちなみに作成した環境から戻るには下記のコマンドを入力します。
(chainenv) C:\Users\(ユーザー)> deactivate
Chainer ver2.xのインストール
※chainer 2.0.0a1はアルファ版なので --preを入れないとchainer1.21.0が入ります。
(chainenv) C:\Users\(ユーザー)>pip install chainer --pre Collecting chainer Downloading chainer-2.0.0a1.tar.gz (260kB) 100% |################################| 266kB 426kB/s Requirement already satisfied: filelock in c:\anaconda3\lib\site-packages (from chainer) Requirement already satisfied: nose in c:\anaconda3\lib\site-packages (from chainer) Requirement already satisfied: numpy>=1.9.0 in c:\anaconda3\lib\site-packages (from chainer) Collecting protobuf (from chainer) Using cached protobuf-3.2.0-py2.py3-none-any.whl Requirement already satisfied: six>=1.9.0 in c:\anaconda3\lib\site-packages (from chainer) Requirement already satisfied: setuptools in c:\anaconda3\envs\chainenv\lib\site-packages\setuptools-27.2.0-py3.5.egg (from protobuf->chainer) Building wheels for collected packages: chainer Running setup.py bdist_wheel for chainer ... done Stored in directory: C:\Users\hirap_000\AppData\Local\pip\Cache\wheels\e6\9a\0b\c4e3932853d1c6837b9528f7a98a74e5e22a9fafb4f00376d4 Successfully built chainer Installing collected packages: protobuf, chainer Successfully installed chainer-2.0.0a1 protobuf-3.2.0
Jupyter ipykernelのインストール
rootにJupyter Notebookが入っているんだから、Jupyter Notebookのインストール不要にならないかと調べてみましたが、結論からするとインストールが必要と思われます。
インストールしないで下記サイトで環境を切り替えようとしましたが、そもそも「chainenv」が表示されませんでした。
Jupyterの設定ファイル生成
rootに戻ってから実行してください。
jupyter notebook --generate-config
C:\Users(ユーザー)\.jupyterフォルダに「jupyter_notebook_config.py」という設定ファイルが生成されます。
jupyter_notebook_config.pyの末尾に下記を追加します。自分の場合はインストール先環境フォルダ(C:/Anaconda3/envs/)を指定しています。
c.EnvironmentKernelSpecManager.conda_env_dirs = [ 'C:/Anaconda3/envs/' ]
今回はJupyter Notebookのインストールの代わりに、下記サイトを参考にJupyter Notebookのカーネルのみをインストールしました。
参照:http://ameblo.jp/nekketsu-engineer/entry-12143280349.html
(C:\Anaconda3) C:\Users\(ユーザー)>activate chainenv (chainenv) C:\Users\(ユーザー)>conda install jupyter ipykernel
Jupyterの起動
(tensorenv) C:\Users\(ユーザー)>jupyter notebook
Jupyter上でchainenvが表示され切り替え出来るようになっています。
動作テスト
動作テストとして下記サイトの実験用のソースコードを動かしてみました。古いバージョンのChainerで作られているため、2点修正しています。
1. FunctionSetをChainに変更
2. model.collect_parameters() を modelのみに変更
qiita.com
#!/usr/bin/env python # coding: utf-8 __author__ = 'k_morishita' """ N bit の 2進数で表される 2**N 個の数字を 2**N個のOutputのどれかを1にするということを学習させる。 """ import numpy as np from chainer import cuda, Function, Chain, gradient_check, Variable, optimizers import chainer.functions as F def forward(model, x_data, y_data): x = Variable(x_data) t = Variable(y_data) if hasattr(model, "l2"): h1 = model.l1(x) y = model.l2(h1) else: y = model.l1(x) return F.softmax_cross_entropy(y, t), F.accuracy(y, t) def generate_training_cases(n_bit): x_data = [] t_data = [] output_len = 2**n_bit for i in range(output_len): x_data.append(list((int(x) for x in ("0"*n_bit + bin(i)[2:])[-n_bit:]))) t_data.append(i) return np.array(x_data, dtype=np.float32), np.array(t_data, dtype=np.int32) def main(n_bit, h1_size): if h1_size > 0: model = Chain( l1=F.Linear(n_bit, h1_size), l2=F.Linear(h1_size, 2**n_bit) ) else: model = Chain( l1=F.Linear(n_bit, 2**n_bit) ) optimizer = optimizers.SGD() optimizer.setup(model) x_data, t_data = generate_training_cases(n_bit) for epoch in range(10000): optimizer.zero_grads() loss, accuracy = forward(model, x_data, t_data) loss.backward() if epoch % 100 == 0: print("epoch: %s, loss: %s, accuracy: %s" % (epoch, loss.data, accuracy.data)) if accuracy.data == 1: break optimizer.update() print("epoch: %s, loss: %s, accuracy: %s" % (epoch, loss.data, accuracy.data)) return epoch, accuracy.data if __name__ == '__main__': fp = open("result.txt", "w") fp.write("N\tH1\tepoch\taccuracy\n") for n_bit in range(4, 5): for h1_size in [0, n_bit, n_bit * 2, n_bit * 4, 2**n_bit]: epoch, accuracy = main(n_bit, h1_size) fp.write("%s\t%s\t%s\t%s\n" % (n_bit, h1_size, epoch, accuracy))
実行結果
epoch: 0, loss: 3.287376642227173, accuracy: 0.125 epoch: 100, loss: 3.181671142578125, accuracy: 0.125 ︙ epoch: 4167, loss: 1.5223073959350586, accuracy: 1.0 epoch: 0, loss: 3.0385913848876953, accuracy: 0.0625 epoch: 100, loss: 2.8190338611602783, accuracy: 0.0 ︙ epoch: 2538, loss: 0.8443756103515625, accuracy: 1.0 epoch: 0, loss: 2.8999969959259033, accuracy: 0.125 epoch: 100, loss: 2.708193063735962, accuracy: 0.1875 ︙ epoch: 1319, loss: 1.2255289554595947, accuracy: 1.0 epoch: 0, loss: 3.109937906265259, accuracy: 0.0625 epoch: 100, loss: 2.705632209777832, accuracy: 0.125 ︙ epoch: 1130, loss: 1.066486120223999, accuracy: 1.0 epoch: 0, loss: 2.917494773864746, accuracy: 0.125 epoch: 100, loss: 2.641525983810425, accuracy: 0.125 ︙ epoch: 981, loss: 1.286677360534668, accuracy: 1.0
最後に
Chainerも公開されているプログラムが多いので、これでいろいろ試してみます。