チョと言います。
普段は主にCakePHP3を使ったWebアプリケーションの開発を行っています。
最近Pythonに興味があって個人的に触っています。
今回はTensorFlowを使って簡単な機械学習を作ってみた話を書きたいと思います。
対象者
・TensorFlowの初心者
環境
・macでdocker利用して開発を行います。
TensorFlowの特徴
・データフローグラフを利用した表現力
・コード修正なしでCPU/GPUモードで動く
・アイデアテストからサービスまで利用できる
・ Python /C++を支援する
設置
dockerのimageをとってcontainerを実行する
-
まず、dockerの環境から設置しましょう。
下記のURlを参考しながら、環境設定してください。
https://docs.docker.com/engine/installation/mac/#/docker-for-mac -
下記のコマンドを叩いてdocker imageからcontainer実行する
docker run -it b.gcr.io/tensorflow/tensorflow-full
-
動作確認する
$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>>
ここまでするともう開発の環境設定ができました。
用語
環境設定ができたので、
TensorFlowで使う用語について覚えましょう。
Operation
グラフ上のノードはOperation(op)と呼ばれます。
Operationは1つ以上のTensorを受け取れます。
Operationは計算を実行した結果を1つ以上のTensorとしてreturnします。
Tensor
内部的にすべてのデータはTensorを通じて表現します。
Tensorは多次元配列のようなもので、グラフ内のOperationの間でTensorのみでやりとりします。
Session
グラフを実行するためにはSession objectが必要です。
SessionはOperationの実行環境をカプセル化したものです。
Variables
Variablesはグラフの実行したら、パラメーターを保存して更新するときに使います。
メモリ上でTensorを保存するbufferの役割です。
では、本客的にTensorFlowを使ってみましょう。
最急降下法で因子を探してみる
最急降下法の詳細は下記のURLを参考してください。
https://ja.wikipedia.org/wiki/%E6%9C%80%E6%80%A5%E9%99%8D%E4%B8%8B%E6%B3%95
加重値行列W
とバイアスb
import tensorflow as tf
import numpy as np
# Numpy randomで 100個のデータを入れる.
x_data = np.float32(np.random.rand(2, 100))
# 学習目標は下記の計算式で算出. (W = [0.1, 0.2], b = 0.3)
y_data = np.dot([0.100, 0.200], x_data) + 0.300
入力したデータとW,bを利用してモデルを定義する
# bは 0,
b = tf.Variable(tf.zeros([1]))
# Wは 1x2 形のウエート変数 (均等random値で初期化)
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
# 損失関数定義
loss = tf.reduce_mean(tf.square(y - y_data))
# 最急降下法で損失関数を初期化(0.5は学習比率)
optimizer = tf.train.GradientDescentOptimizer(0.5)
# 学習Operation定義
train = optimizer.minimize(loss)
学習Session start
# すべての変数を初期化.
init = tf.initialize_all_variables()
# Session start
sess = tf.Session()
sess.run(init)
# 200回学習.
for step in xrange(0, 201):
sess.run(train)
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
結果
0 [[ 0.8228116 0.25179306]] [-0.21591029]
20 [[ 0.31065419 0.22789511]] [ 0.17903577]
40 [[ 0.15808699 0.20829338]] [ 0.26633102]
60 [[ 0.11601268 0.20247138]] [ 0.29062203]
80 [[ 0.10441278 0.20073807]] [ 0.2973859]
100 [[ 0.10121564 0.20022091]] [ 0.29927069]
120 [[ 0.10033476 0.20006624]] [ 0.29979634]
140 [[ 0.10009213 0.20001991]] [ 0.29994306]
160 [[ 0.10002533 0.20000601]] [ 0.29998407]
180 [[ 0.10000696 0.20000178]] [ 0.29999554]
200 [[ 0.10000192 0.20000054]] [ 0.29999873]
感じたこと
・とりあえず、Pythonすげ、TensorFlowすげ。
・今回はExample課題としてあげていた問題を解けて見る中で数学をもっと勉強しないといけないと感じました。
・今回はPythonで機械学習を少し触ってみたので、他のところも触ってみたいと思います。