はじめに
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も公開されているプログラムが多いので、これでいろいろ試してみます。