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

Windows でLasagne (NeuralNet)

(情報が古いため近日中に新しく更新する予定です。最新版ではおそらく動かないと思います。追記:2016/06/02)

kaggle 勢でdeeplearning はよく用いられていますが、windows ユーザーは何かとインストールなどで苦労する点が多いように思えます。R ではh2O のdeeplearning ほぼ1択です。python では様々ありますが、個人的にはLasagne に落ち着いたのでこれのインストールと基本的な使い方のコードを紹介したいと思います。
 まずLasagne の説明とコードは
Welcome to Lasagne — Lasagne 0.2.dev1 documentation
github.com
が参考になります。
 windows ではWinPython を使うのが最も簡単に環境構築できました。インストールの注意点はPython 2.7の32bit 版(2015/07/31現在の最新版はWinPython-2.7.10.1)を使用することです(64bit 版も頑張ればできるかも)。
 まず、環境変数の設定をします。

C:\<該当するパスを入れて下さい>\WinPython-32bit-2.7.10.1\python-2.7.10;
C:\<該当するパスを入れて下さい>\WinPython-32bit-2.7.10.1\python-2.7.10\Scripts;

github からのダウンロードとLasagne のインストールです。

git clone https://github.com/Lasagne/Lasagne.git
cd Lasagne
pip install -r requirements.txt
python setup.py install

 WinPython-32-bit-2.7.10.1\python-2.7.10 の配下にあるpython.exe を直接実行してimport theano とするとエラーがでるのですが、なぜかWinPython-32-bit-2.7.10.1 にあるWinPython Command Prompt.exe を立ち上げて、こちらからpython.exe を実行し、import theano とすると無事にインポートできます。

WinPython Command Prompt.exe -> python.exe

の順に試して頂ければよいかと思います。

import theano
import lasagne

エラーが出なければOKです。

サンプルコードとして、examples の中にmnist.py が含まれていますので、とりあえずこれを実行してみると雰囲気が分かるとは思います。個人的には、このコードは分かりにくいのであまり参考にするものではないかなという印象です。kaggle でよく使われているのはnolearn の方なので、こちらをインストールします。

git clone https://github.com/dnouri/nolearn.git
cd nolearn
pip install -r requirements.txt
python setup.py develop

nolearn の詳細はgithub に記載されています。
github.com
基本的なコードの書き方で参考になりそうなのは、
Neural Net では
kaggle_otto/nn_adagrad.py at master · ahara/kaggle_otto · GitHub
convolutional Neural Net では
kfkd-tutorial/kfkd.py at master · dnouri/kfkd-tutorial · GitHub
があります。

最近の更新で、やや不安定になった感じ(random.seedが効かない、あるいはconvolutional Neural Net が動作しないなど)はありますが、
kaggle のdigit recognizer で使用しているコードの一部を抜粋して、それぞれのコードを紹介します。ここで使用するコードはgithub
GitHub - puyokw/kaggle_digitRecognizer: Scripts for digit Recognizer in kaggle
上にあります。

# multi layer perceptron
layers0 = [('input', InputLayer),
           	('dense0', DenseLayer),
           	('dropout', DropoutLayer),
		('dense1', DenseLayer),
           	('dropout', DropoutLayer),
           	('dense2', DenseLayer),
		('dropout', DropoutLayer),
           	('output', DenseLayer)]
net0 = NeuralNet(layers=layers0,
                     input_shape=(None, num_features),
                     dense0_num_units=1024,
                     dropout_p=0.5,
                     dense1_num_units=1024,
                     dense2_num_units=2048,
                     output_num_units=num_classes,
                     output_nonlinearity=softmax,
                     update=adagrad,
                     eval_size=0.01,
                     verbose=1,
                     max_epochs=20,
                     update_learning_rate=theano.shared(float32(0.01)),
                     on_epoch_finished=[
                     AdjustVariable('update_learning_rate', start=0.01, stop=0.001),])

net0.fit(X, y)
 y_prob = net0.predict_proba(X_test)
# convolutional Neural Net
net = NeuralNet(
    layers=[
        ('input', InputLayer),
        ('conv1', Conv2DLayer),
        ('pool1', MaxPool2DLayer),
        ('dropout1', DropoutLayer),
        ('conv2', Conv2DLayer),
        ('pool2', MaxPool2DLayer),
        ('dropout2', DropoutLayer),
        ('hidden3', DenseLayer),
        ('dropout3', DropoutLayer),
        ('hidden4', DenseLayer),
        ('dropout4', DropoutLayer),
        ('output', DenseLayer),
        ],
    input_shape=(None, 1, 28, 28),
    conv1_num_filters=32, conv1_filter_size=(3, 3), pool1_pool_size=(2, 2),
    dropout1_p=0.2,
    conv2_num_filters=64, conv2_filter_size=(3, 3), pool2_pool_size=(2, 2),
    dropout2_p=0.2,
    hidden3_num_units=1024,
    dropout3_p=0.5,
    hidden4_num_units=1024,
    dropout4_p=0.5,
    output_num_units=num_classes,
    output_nonlinearity=softmax,
    update=adagrad,
    update_learning_rate=theano.shared(float32(0.03)),
    eval_size=0.01,
    on_epoch_finished=[
        AdjustVariable('update_learning_rate', start=0.01, stop=0.0001),
        ],
    max_epochs=30,
    verbose=1,
    )
net.fit(X, y)
y_prob = net.predict_proba(X_test)

これらが各々のニューラルネットの構成を指定している部分です。自分のノートPC ではconvolutional Neural Netの 1epoch に20分くらいかかっていました。gpu を使うと10倍以上速くなるらしいですが、金銭的な余裕がないのでgpu を使用した場合は試せていません。