TensorFlowによる深層学習を始める前に、TensorFlowの基本的な構成要素であるテンソルとセッションを理解しておこう。TensorFlowのコード例を示しながら、できるだけコンパクトにまとめる。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
次回、画像認識でよく使われるディープラーニングの代表的手法「CNN」を紹介し、次々回は、TensorFlowを利用してCNNによる深層学習を実践していく。今回はその準備としてTensorFlowの基本的な構成要素であるテンソルとセッションについて説明しておく。
テンソルとセッションは、TensorFlowによる開発で非常に重要な概念である。基本的には、下記の2ステップで使用される。
現段階では、上記の意味は分からないかもしれないが、次々回、実際の開発作業の中で理解できるだろう。今回は、その内容とコーディング方法を押さえてほしい。
なお本連載では、Pythonプログラミングの基本的な知識がある、もしくは別のプログラミングを使って何か作ったことがあるなど、プログラマーとしての素養があるレベルを想定している。プログラミング初心者の場合は、まずはPython言語をマスターしてから読み進めることをお勧めする。
データフローグラフにおける各ノードは演算を表しており、その演算の入力(オペランド)と結果はテンソルである。演算に対するオペランドには具体的なテンソルの値が必要になるが、その定義の方法は4つある。すなわち、
である。それぞれもう少し詳しく説明しよう。
定数は、データフローグラフ中における不変な値を表す。
定数はtf.constant関数によって作成される(リスト16はそのコード例)。tf.constant関数の引数で特に重要なものを次の表に示す。
引数 | 概要 |
---|---|
value | テンソルの要素となる値 |
dtype | テンソルの要素のデータ型 |
shape | テンソルの次元 |
name | テンソルの名前 |
表1 tf.constant関数の引数 |
x = tf.constant(1.0) # x = tf.constant(value=1.0, dtype=tf.float32, shape=(), name='Const')と同様
with tf.Session():
print(x.eval())
tf.constant以外の定数定義の方法として、よく利用される定数を作成するための関数も存在する(表2)。
関数 | 概要 |
---|---|
tf.zeros | すべての要素が0のテンソルを作成する |
tf.ones | すべての要素が1のテンソルを作成する |
表2 定数テンソルを作成する関数 |
データフローグラフにおける演算の結果はテンソルであるため、演算そのものを「テンソル」と見なすことができる。
演算についてすべてをここで説明することはできないので、重要な演算のいくつかを次の表に示す。他の演算についてはAPIドキュメントを参照してほしい。なお、いずれの演算でも定数と同様にname引数によりテンソルの名前を定義できる。
演算 | 概要 |
---|---|
+、tf.add | 加算 |
-、tf.subtract | 減算 |
*、tf.multiply | 要素積(テンソルの要素同士を掛ける) |
*、tf.scalar_mul | スカラー積(すべての要素を定数倍する) |
tf.matmul | テンソル積 |
/、tf.divide | 除算 |
表3 重要な演算 |
プレースホルダーは定数と似ているが、その値はデータフローグラフの外部から与えられる。プレースホルダーに値を与えるには、evalメソッドのfeed_dict引数に辞書オブジェクトを与えるか(リスト2)、後述のセッションクラスで定義されているrunメソッドのfeed_dict引数を用いる。
プレースホルダーはtf.placeholder関数またはtf.placeholder_with_default関数によって作成される(リスト2はそのコード例)。。これらの関数の引数を次の表に示す。
引数 | tf.placeholder | tf.placeholder_with_default | 概要 |
---|---|---|---|
dtype | ○ | − | テンソルの要素のデータ型 |
input | − | ○ | テンソルの要素となる値 |
shape | ○ | ○ | テンソルの次元 |
name | ○ | ○ | テンソルの名前 |
x = tf.placeholder(tf.float32)
with tf.Session():
print(x.eval(feed_dict={x: 1.0}))
print(x.eval(feed_dict={x: 3.0}))
プレースホルダーの値が未定義の状態(リスト3)でデータフローグラフが評価されるとエラーが発生する。
x = tf.placeholder(tf.float32)
with tf.Session():
# xが定義されていないためエラー
print(x.eval())
変数は、データフローグラフ中で変化し得る値を表す。
第1回で「機械学習においては損失関数を用いてパラメーターの最適化を行う」と説明した。モデルにおけるパラメーターを変えると、損失関数から得られる値も変化する。TensorFlowの枠組みでは、データフローグラフ中に出現するパラメーターの値が変化することで損失を変化させられる。これによって損失の値が最小化するような最適化を行うことができる。つまり、ここで言う「変数」とは、モデルのパラメーターを表現するために利用するものである。
変数はtf.Variableクラスで提供される。tf.Variableクラスのコンストラクターの引数で重要なものを次の表に示す。
引数 | 概要 |
---|---|
initial_value | 変数の初期値 |
name | テンソルの名前 |
dtype | テンソルの要素のデータ型 |
expected_shape | テンソルの次元 |
constraint | 制約条件 |
表5 tf.Variableクラスのコンストラクターの引数 |
変数を利用する場合、利用するセッションの最初で初期化しなければならない。変数の初期化はtf.variables_initializer関数またはtf.global_variables_initializer関数を利用する。リスト4は、変数のコード例だ。
counter = tf.Variable(0)
increment = tf.assign_add(counter, 1)
with tf.Session() as sess:
sess.run(tf.variables_initializer([counter]))
print(counter.eval())
increment.eval()
print(counter.eval())
increment.eval()
print(counter.eval())
以上がテンソルの値の定義方法になる。次にセッションについて説明しよう。
Copyright© Digital Advantage Corp. All Rights Reserved.