第3回 TensorFlowの基本構成要素:「テンソル」と「セッション」TensorFlow入門(1/2 ページ)

TensorFlowによる深層学習を始める前に、TensorFlowの基本的な構成要素であるテンソルとセッションを理解しておこう。TensorFlowのコード例を示しながら、できるだけコンパクトにまとめる。

» 2018年04月20日 05時00分 公開
[安部晃生DATUM STUDIO]
「TensorFlow入門」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 次回、画像認識でよく使われるディープラーニングの代表的手法「CNN」を紹介し、次々回は、TensorFlowを利用してCNNによる深層学習を実践していく。今回はその準備としてTensorFlowの基本的な構成要素であるテンソルとセッションについて説明しておく。

 テンソルとセッションは、TensorFlowによる開発で非常に重要な概念である。基本的には、下記の2ステップで使用される。

  1. 「テンソル」を活用して、データフローグラフを構築する
  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())

リスト1 定数の定義と利用

 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 テンソルの名前
表4 tf.placeholder関数とtf.placeholder_with_default関数の引数
表中の○はその関数に引数が定義されていることを示す。

x = tf.placeholder(tf.float32)
with tf.Session():
  print(x.eval(feed_dict={x: 1.0}))
  print(x.eval(feed_dict={x: 3.0}))

リスト2 プレースホルダーの定義と利用

 プレースホルダーの値が未定義の状態(リスト3)でデータフローグラフが評価されるとエラーが発生する。

x = tf.placeholder(tf.float32)
with tf.Session():
  # xが定義されていないためエラー
  print(x.eval())

リスト3 未定義のプレースホルダーによるエラー

変数

 変数は、データフローグラフ中で変化し得る値を表す。

 第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())

リスト4 変数の定義と利用

 以上がテンソルの値の定義方法になる。次にセッションについて説明しよう。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。