インフィニットループ 技術ブログ

2017年11月20日 (月)

著者 : nob

入門 Keras (1) Windows に Tensorflow と Keras をセットアップ


本連載ではこれからディープラーニングを手軽にはじめてみたいという方、普段使っている PC でディープラーニングをはじめてみたいという方を対象に、高レベル・ニューラルネットワーク API の Keras を使いながら、実践的かつ入門的にディープラーニングについて初歩から解説していきたいと思います。

Keras とは

紙に描く絵画をオンラインで学んだり共有できる Wysp というサービスを作った、Google 社員の François Chollet 氏作成のライブラリです。Tensorflow, Theano, CNTK などのディープラーニングフレームワークをバックエンドの基盤として使い、より簡単にディープラーニングの仕組みを作ることが出来ます。
Keras で作成するニューラルネットのネットワークは、ゼロからスクラッチでニューラルネットの計算をするプログラムを書いたり、既存のフレームワークを直接使ってネットワークを構築したりするのに比べると、抽象化や簡略化によってその分は性能で劣る可能性があります。
一方、本格的なディープラーニングにおいては大規模な GPU のクラスタの構成が必要になることから、気軽に手元の PC ではじめてみようという本連載の趣旨においては Keras の性能で十分であると考えました。また学習コストの回収を考えると、より簡単に学べて長く使える方がメリットが多くなります。これらを考慮し、基盤として複数のフレームワークに対応しそれらを抽象化出来る Keras を本入門のテーマとしました。

Windows で Keras を使うために必要なソフトウェア

  1. Python 本体と numpy などのライブラリ
  2. データサイエンスや機械学習で人気のある対話実行環境 Jupyter Notebook
  3. Tensorflow
  4. Keras
本連載ではお手元の PC で Keras を使ってみることをテーマにしていますが、それにはこれらのソフトウェアが必要です。Windows に実行環境を用意するには Python を単体でインストールしてセットアップを進めていく方法などいろいろありますが、Python と R のデータサイエンス向けソフトウェア・ディストリビューションの Anaconda を使った環境構築が、簡単かつ安定して動作しますので採用することにしました。
その Anaconda ですが、Python 関係全部入りの素晴らしいパッケージではあるものの、2017年11月現在の Anaconda 5.01 のサイズで 515MB もあります。ダウンロードにも時間がかかりますし、使わないソフトも多く含まれていますので、今回は同じ Anaconda ベースで最小限のパッケージに絞った Miniconda を使って Keras をセットアップすることにしました。

Miniconda から Jupyter Notebook までのインストール

https://conda.io/miniconda.html にアクセスし、Python 3.6 用の Windows 64-bit (exe installer) をダウンロードします。(キャプチャ画像はクリックすると拡大します)

ダウンロードした exe ファイルを起動します。

License 条項を OK した後、インストールタイプは 「Just Me」を選びます

Minicondaをインストールする場所を聞かれますが、ユーザーのホームディレクトリ
直下になっているデフォルトのままで OK です。

次に起動 Path に関する質問を聞かれますが、下の「 Register Anaconda as my default Python 3.6 」だけチェックして、上は空にして「 Install 」します。

あとはインストールが進み Complete すれば Miniconda のインストールは終了です。

セットアップ作業の中心となるのが Anaconda Prompt です。Windows のコマンドプロンプトとよく似たツールです。Windows のメニューの AAnaconda3 (64-bit) のところに Anaconda Prompt がありますので起動します。

keras 専用の環境を作成する

Anaconda では pyenv などのように複数の環境を作成し、環境別に異なるパッケージをインストールしたり設定を分けるなど環境別に運用することが可能です。インストールやセットアップでのトラブル対応を考慮しますと、分けて運用するニーズが自分には無くても、とりあえず専用の環境を作成してそこに対してセットアップを行うのが得策です。

今回は mykeras という名前の環境を作ってそこにセットアップしてみましょう。 Anaconda Prompt 上でコマンド

conda create -n mykeras

を実行して環境を作成します。

作成した mykeras へ実行環境を移すには

activate mykeras

を実行します。これによりプロンプト左端の( )の中がディレクトリから環境名 mykeras に切り変わります。

専用環境で最初に追加インストールするのは Jupyter Notebook です。

conda install notebook

でインストールしましょう。この先 Anaconda Prompt で「実行しますか (y/n) 」と聞かれる場面が多数ありますが、特に説明が無い限り yes を選択する前提とします。
notebook インストールの最後にこのようなデバッグメッセージが表示されるバージョンがありますが、Windows のメニューを編集したことに関するもので問題ありません。

Windows のメニューの Anaconda Prompt の下の方に Jupyter Notebook (mykeras) というメニューが追加されている筈です。起動してみましょう。

メニューが上手く追加されていない場合

Jupyter Notebook のメニューが上手く追加されていない場合も、あわてることはありません。Anaconda Prompt の実行したい環境で

(実行したい環境へ移動)activate mykeras
 jupyter-notebook

とコマンドを打てばメニューから選んだのと同じように実行出来ます。Jypter Notebook が起動しましたら、早速 Python のコマンドを対話実行してみましょう。自動的に開いたブラウザのウィンドウに以下の様にホームディレクトリをリストした状態で実行されると思います。
右手の方にある「 New 」メニューから Notebook の Python3 を選び、新規ノートブックを作成します。

あたらしく開いた Untitled ノートブックで、In [ ] と書かれたテキストボックスが用意されます。

このテキストボックスが Jupyter Notebook の セル と呼ばれるもので、このセルの中に複数行の Python のコードを記述して Run させることが出来ます。早速

print("Hello Jupyter!")

と入力し、Run ボタンを押すか CTRL + ENTER で実行してみましょう。セルの下の方に Hello Jupyter! が表示されていれば、セットアップは完了です。

このように作成されたノートブックを保存するには File メニューから Save and Checkpoint にて行います。
また、裏方のウィンドウで動いている Anaconda Prompt で CTRL-C を押すことで Jupyter Notebook のバックエンドとしてポート 8888 で動いている Web サーバーを停止させることが出来ます。

Numpy, Tensorflow と Keras のインストール

Jupyter Notebook が無事動きましたら、次はいよいよ numpy, tensorflow, keras などのライブラリ群をインストールします。

activate mykeras # プロンプトが (mykeras) 環境になってないときだけ実行
conda install keras

このコマンドで以下の様に依存ライブラリを一括してインストールしてくれます。

これで Keras までインストールが終わりました。まずは動作確認をしましょう。numpy で 3×3 の行列を生成してみます。

import numpy as np
a = np.arange(1,10).reshape(3,3)
a

を実行します。3×3 行列が表示されましたら、次は Tensorflow のセッションで定数 Hello TensorFlow!を表示するだけのコマンドを実行してみます。

import tensorflow as tf
hello = tf.constant('Hello TensorFlow!')
sess = tf.Session()
print(sess.run(hello))


これでバックエンドは整いましたので Keras のテストは少しディープラーニングらしいものを使ってみます。
keras 作者の fchollet 氏が用意してくれている exapmle で MNIST データセットを学習するもの mnist_cnn.py を試してみます。(MNIST は手書き文字の学習で、ディープラーニングの入り口としてよく使われる学習データです。)

# 元ファイルは https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py
'''Trains a simple convnet on the MNIST dataset.
Gets to 99.25% test accuracy after 12 epochs
(there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
batch_size = 128
num_classes = 10
epochs = 2 # 実行時間が長いのでここだけ 12 から 2 に変更しました
# input image dimensions
img_rows, img_cols = 28, 28
# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

このコードをセルに貼り付けたら Run しましょう。
PC の性能にもよりますが 10 分以下で2回分の学習を終えて、その正答率を表示してくれると思います。

Keras と Tensorflow から GPU を使う

NVDIA のグラフィクスカード GTX シリーズ搭載 PC の方は GPU を使ったディープラーニングを手軽に試すことが可能です。最初に作成した mykras 環境と同様に mykeras-gpu 環境を作成し、Jupyter Notebook のインストールまで行います。
次に Keras をインストールしますが、このときパッケージ名は keras-gpu で行います。

conda install keras-gpu

このコマンドだけで tensorflow-gpu や cudatoolkit, cudann など GPU を使うために必要なものを全て入れてくれます。
次に Windows の PATH 環境変数へ cuda 関連の DLL が格納されている C:\Users\ユーザー名\Miniconda3\envs\mykeras-gpu\DLLs を登録します。
Windows のコマンドプロンプトで control と入力してコントロールパネルを起動します。その後「システムとセキュリティ」 > 「システム」 と選択していって、「システムの詳細設定」をクリックします。

すると、さらに別ウィンドウが開きますので、「詳細設定」タブの 「環境変数」をクリックします。

ユーザー環境変数に Path が既にあれば「編集」を押して

%USERPROFILE%Miniconda3\envs\mykeras-gpu\DLLs

を追加します。


ユーザー変数に Path が無い場合は「新規」で作成します。システム変数の PATH に mykeras-gpu の DLL のパスが追加されるように記述します。

Jupyter Nootebook や起動している Prompt があれば全て閉じて正しく環境変数が読み込まれるようにします。
次にメニューから Jupyer Notebook (mykeras-gpu) アイコンで起動するか、または Anaconda Promptactivate mykeras-gpu してから jupyter-notebook コマンドで
Jupyter Notebook を起動します。
前述の MNIST のトレーニングを実行してみます。

この例では GTX-965M を使っていますが、CPU で 1 回の実行に約3分かかっていた学習が GPU では 16秒で終了しました! GPU の力は素晴らしいです!

さいごに

駆け足でしたが、連載 1回目 Windows に Tensorflow と Keras をセットアップ は以上で終了です。
次回からはニューラルネットと Keras の基本について学んでみたいと思います。ご期待ください。

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!