読者です 読者をやめる 読者になる 読者になる

デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す

Chainer ver2.xをWindowsにインストールしてみた

はじめに

2017/02/23に「Chainer」の大幅アップデートが公開されました。
気になっていたサンプルプログラムがChainer用だったこともあり、インストールしてみました。
Anacondaを使用しているのでパッケージ管理システム(conda)によりChainer用環境で作成しています。

環境

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」が表示されませんでした。

qiita.com

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のカーネルのみをインストールしました。
参照:Python2, Python3 を切り替えて jupyter notebook を使う|熱血エンジニアのブログ

(C:\Anaconda3) C:\Users\(ユーザー)>activate chainenv
(chainenv) C:\Users\(ユーザー)>conda install jupyter ipykernel

Jupyterの起動

(tensorenv) C:\Users\(ユーザー)>jupyter notebook

Jupyter上でchainenvが表示され切り替え出来るようになっています。 f:id:Yaju3D:20170322015143p:plain

動作テスト

動作テストとして下記サイトの実験用のソースコードを動かしてみました。古いバージョンの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も公開されているプログラムが多いので、これでいろいろ試してみます。