背景
データ解析の会社に入って5ヶ月ぐらい経ちました。この間、機械学習や深層学習の基礎的な部分をメインで勉強していました。
またまた専門家になるにはかなりの差を感じますが、現時点での知識だけでも、そろそろ実践的なことをやりたいなと思って来たので、chainer, keras, q-learningなどの実例をみながら、プログラミングを初めています。
今回は、morvan pythonという方のtutorialをみながら、kerasの勉強をしていたので、ちょこちょこ勉強したことをまとめておきます。
kerasとは?
Kerasは,Pythonで書かれた,TensorFlowまたはCNTK,Theano上で実行可能な高水準のニューラル ネットワークライブラリです(オフィシャルドキュメントから)。
Kerasはニューラルネットワークを構築する時、バックエンドでTensorFlow, CNTK, Theanoなどいずれかの機械学習ライブラリを使って計算を行うことができます。まだ、Kerasは他のライブラリと比べると、もっと簡単に、速く直感的な一連のネットワークが構築できるというメリットがあります。
この意味で、Kerasの中心的な開発者、メンテナのFrançois Chollet氏は、
Kerasはタスク全体を担う機械学習ライブラリよりむしろインターフェースとして着想された
と表現しています。
kerasを使う場面として、オフィシャルのドキュメントでは、以下のように定義しています。
次のような場合で深層学習ライブラリが必要なら,Kerasを使用してください:
1. 容易に素早くプロトタイプの作成が可能(ユーザーフレンドリー,モジュール性,および拡張性による)
2. CNNとRNNの両方,およびこれらの2つの組み合わせをサポート
3. CPUとGPU上でシームレスな動作
インストール
pip3 install tensorflow
pip3 install keras
上の順番でインストールすると、kerasのバックエンドは, 自動的にtensorflowになります。 もちろん、以下のいずれかの方法でも、バックエンドを指定することができます。
~/.keras/keras.json
ファイルを編集プログラムの先頭でバックエンドを宣言
import os os.environ['KERAS_BACKEND']='tensorflow'
回帰モデルの構築
プログラムの説明
1. 単層ニューラルネットワークを作って、回帰を行います。
2. Sequentialモデル使って、モデルを構築。Sequentialモデルでは、ネットワークの各層を定義し、順次的に追加していくことで、ネットワークを構築します。
3. 今回は、単層で、かつ入力も、出力も一つだけのネットワークなので、普通の結合層を定義するDenseを使います。
ソースコード
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
# create sample data
np.random.seed(1337)
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200,))
X_train, Y_train = X[:160], Y[:160]
X_test, Y_test = X[160:], Y[160:]
# build a neural network from the 1st layer to the last layer
model = Sequential()
model.add(Dense(input_dim=1, output_dim=1))
# choose loss function and optimizing method
model.compile(loss='mse', optimizer='sgd')
# training
print('Training ...')
for step in range(301):
train_cost = model.train_on_batch(X_train, Y_train)
# test
print('Testing ...')
cost = model.evaluate(X_test, Y_test, batch_size=40)
print('test cost: ', cost)
W, b = model.layers[0].get_weights()
print('Weights: ', W)
print('Biases=: ', b)
# plotting the prediction
Y_pred = model.predict(X_test)
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred)
plt.show()
実行結果
**データ作成の時に、Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200,))
と重みとバイアスをそれぞれ0.5, 2に設定したんですが、結果的に近似できていることがわかります。
まとめ
今回は、morvan pythonさんのtutorialをみながら、ほぼ同じコードを作成してみました。