みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

TensorFlow はじめの一歩(1)

Googleが2015年11月に深層学習フレームワーク「TensorFlow」をオープンソースとして公開した. Googleの画像検索をはじめ, いくつかのサービスで実際に使用しているということもあり, 大変注目を集めている.

私自身を含め, TensorFlowがなんだか話題になっているから触ってみたという人も多いと思う. しかし, 実際にTensorFlowを使って自分で何か試そうと思うと, 機械学習ニューラルネットワークなどの基礎的な知識やアルゴリズム, そしてTensorFlowのプログラミング方法などがわかっていないと何もできない.

1. はじめに [1]
TensorFlowを使おうとすると, まずは以下の3つを知る必要がある.

1.1 グラフ
「グラフ」はノードと呼ばれる計算や処理を行うブロックとノード間の入出力関係をエッジと呼ばれる線で繋いだものである. データはノードからノードへ, エッジの繋がりに従って受け渡され, 計算が行われる.
f:id:moonlight-aska:20160213111758p:plain

行列の積を例に説明する.
f:id:moonlight-aska:20160213113413p:plain

import tensorflow as tf

# 1x2行列を生成するConstant op(operationの略)を作成する.
# そのOpは, デフォルトグラフにノードとして加えられる.
#
# コンストラクタからの戻り値は, Constant opの出力を表す.
matrix1 = tf.constant([[3., 3.]])

# 2x1行列を生成するもう一つのConstantを作成する.
matrix2 = tf.constant([[2.],[2.]])

# 入力として'matrix1'と'matrix2'をとるMatmul opを作成する.
# 戻り値'product'は, 行列の乗算(積)の結果を表す.
product = tf.matmul(matrix1, matrix2)

1.2 セッション
TensorFlowで, グラフで表した計算を実行するには, セッションを用いる.

# デフォルトのグラフを起動する.
sess = tf.Session()

# Matmul opを実行するために, Matmal opの出力を表す'product'を渡し.
# セッションの'run()'メソッドをコールする.
# これはMatmul opの出力を返してもらうコールを示している.
#
# opによって必要とされるすべての入力は, セッションによって自動的に実行される.
# これらは, 概して並列に実行される.
#
# こうして'run(product)'コールは, グラフの3つのop(2つのConstantとMatmul)
# の実行を引き起こす.
#
# opの出力は, numpyの'ndarray'オブジェクトとして'result'に返される.
result = sess.run(product)
print result
# ==> [[ 12.]]

# 終了したらセッションをクローズする.
sess.close()

また, Ipythonのような対話的なPython環境では, InteractiveSessionクラスを使うことで, 対話的に処理することもできる.

# 対話的なTensorFlowセッションに入る.
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# Initializer opのrun()メソッドを使って, 'x'を初期化する.
x.initializer.run()

# 'x'から'a'を減算するopを追加する. それを実行し, 結果を表示する.
sub = tf.sub(x, a)
print sub.eval()
# ==> [-2. -1.]

# 終了したらセッションをクローズする.
sess.close()

1.3 テンソル
TensorFlowでは, 変数はVariable opで定義し, 初期化してから使用する.

カウンターを例に説明する.
f:id:moonlight-aska:20160213143332p:plain

# 0で初期化されるVariableを作成する. 
state = tf.Variable(0, name="counter")

# stateに1を加算するOpを作成する.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# グラフを起動した後, 'init' Opが実行されVariablesが初期化される.
# そのために, グラフに'init' Opを追加しなければならない.
init_op = tf.initialize_all_variables()

# グラフを起動し, opsを実行する.
with tf.Session() as sess:
  # 初期化を行う.
  sess.run(init_op)
  # 'state'の初期値を表示する.
  print sess.run(state)
  # 'state'を更新し, 'state'を表示するopを実行する. 
  for _ in range(3):
    sess.run(update)
    print sess.run(state)

# output:

# 0
# 1
# 2
# 3

次に, 処理の出力を取り出すには, グラフをrun()する際に引数としてテンソルを渡せばよい.

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)

# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

今回は, とりあえず「TensorFlowは計算をグラフとして定義し, セッションで実行するんだ」ということだけ分かればよい.

----
参照URL:
[1] Basic Usage | TensorFlow

初めてのディープラーニング --オープンソース

初めてのディープラーニング --オープンソース"Caffe"による演習付き

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

はじめての人工知能 Excelで体験しながら学ぶAI

はじめての人工知能 Excelで体験しながら学ぶAI

フリーソフトではじめる機械学習入門

フリーソフトではじめる機械学習入門