TensorFlow入門(3)

TensorFlow入門(3)

TensorFlowの基本構成要素:「テンソル」と「セッション」

Tutor 2018年4月20日

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

安部晃生 DATUM STUDIO株式会社 安部 晃生

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

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

  1. 「テンソル」を活用して、データフローグラフを構築する
  2. 「セッション」の中で、そのデータフローグラフを学習させてモデルを完成させる

 現段階では、上記の意味は分からないかもしれないが、次々回、実際の開発作業の中で理解できるだろう。今回は、その内容とコーディング方法を押さえてほしい。

 なお本連載では、Pythonプログラミングの基本的な知識がある、もしくは別のプログラミングを使って何か作ったことがあるなど、プログラマーとしての素養があるレベルを想定している。プログラミング初心者の場合は、まずはPython言語をマスターしてから読み進めることをお勧めする。

テンソル

 データフローグラフにおける各ノードは演算を表しており、その演算の入力(オペランド)と結果はテンソルである。演算に対するオペランドには具体的なテンソルの値が必要になるが、その定義の方法は4つある。すなわち、

  • 定数
  • 演算
  • プレースホルダー
  • 変数

である。それぞれもう少し詳しく説明しよう。

定数

 定数は、データフローグラフ中における不変な値を表す。

 定数はtf.constant関数によって作成される(リスト16はそのコード例)。tf.constant関数の引数で特に重要なものを次の表に示す。

引数概要
valueテンソルの要素となる値
dtypeテンソルの要素のデータ型
shapeテンソルの次元
nameテンソルの名前
表1 tf.constant関数の引数
Python
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.placeholdertf.placeholder_with_default概要
dtypeテンソルの要素のデータ型
inputテンソルの要素となる値
shapeテンソルの次元
nameテンソルの名前
表4 tf.placeholder関数とtf.placeholder_with_default関数の引数

表中の○はその関数に引数が定義されていることを示す。

Python
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)でデータフローグラフが評価されるとエラーが発生する。

Python
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は、変数のコード例だ。

Python
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回で「TensorFlowの基本はデータフローグラフによる演算操作である」と説明した。TensorFlowのセッションとは、構築されたデータフローグラフの演算処理を実際に行うランタイムへのクライアントのことだ。

 TensorFlowのセッションは、tf.Sessionクラスとtf.InteractiveSessionクラスにより提供される。

 名前の通り、対話モードやJupyter Notebookなどでインタラクティブにデータフローグラフの構築と評価を行いたい場合は、tf.InteractiveSessionを使えばよい。

 バッチ処理などではtf.Sessionを使えばよい。

 tf.InteractiveSessionクラスは、インタラクティブに操作するためのデフォルトセッションであるため、データフローグラフを構築する前にインスタンスを作成する必要がある(リスト5)。
 一方、tf.Sessionクラスは、データフローグラフとは独立して定義できる(リスト6)。

 いずれのセッションクラスのインスタンスも、最後にcloseメソッドを呼び出してリソースの解放を行うべきである。

 tf.InteractiveSessionクラスは、その用途上、closeメソッドを明示的に呼ぶことになる(リスト5)。

 一方、tf.Sessionクラスは、Pythonのwith構文を利用することでスコープが明示しやすくなる*4(リスト6)。

  • *4 tf.InteractiveSessionクラスがwith構文を利用できないというわけではない。
Python
sess = tf.InteractiveSession()

a = tf.constant(2.0)
b = tf.constant(1.5)
mul = tf.multiply(a, b)
mul.eval()

sess.close()
リスト5 tf.InteractiveSessionクラスを利用した書き方

セッションのインスタンス作成をグラフ作成前に行う必要がある。

Python
a = tf.constant(2.0)
b = tf.constant(1.5)
mul = tf.multiply(a, b)

with tf.Session():
  print(mul.eval())
リスト6 tf.Sessionクラスを利用した書き方

セッションのインスタンス作成はグラフ作成と独立に記述できる。

 データフローグラフを評価実行するためには、runメソッドを用いる。これまでevalメソッドを用いてきたが、evalメソッドはデータフローグラフ中の1つのノードに対する評価を行うものであることに対して、runメソッドを用いると複数のノードの演算結果を1回の評価で取得できる。

Python
a = tf.constant(1.5)
b = tf.constant(2.0)
c = tf.constant(-1.0)
d = tf.constant(3.0)

x = tf.add(a, b)
y = tf.multiply(c, d)
z = tf.add(x, y)

with tf.Session() as sess:
  result = sess.run([x, y, z])
  print(result)
リスト7 runメソッドを用いたデータフローグラフの評価

 次回は、ディープラーニングの代表的な手法の一つ、「CNN」について説明する。

【TL;DR】TensorFlowの基本構成要素

  • テンソル: データフローグラフにおける各ノードは演算を表し、その演算の入力(オペランド)と結果は「テンソル」である
  • テンソルの値の定義方法: 「定数」「演算」「プレースホルダー」「変数」の4つの方法がある
  • 定数: データフローグラフ中における不変な値。tf.constant関数によって作成される
  • 演算: データフローグラフにおける演算の結果はテンソルなので、演算そのものが「テンソル」と見なせる。+tf.addtf.matmulなど多数ある
  • プレースホルダー: データフローグラフの外部から与えられる値。tf.placeholder関数などによって作成され、evalメソッドなどによって値が与えられる
  • 変数: データフローグラフ中で変化し得る値。tf.Variableクラスで提供される
  • セッション: 構築されたデータフローグラフの演算処理を実際に行うランタイムへのクライアントのこと。tf.Sessionクラスとtf.InteractiveSessionクラスにより提供される
  • tf.InteractiveSession: 対話モードなどで使う。インタラクティブに操作できるセッションで、データフローグラフ構築前にインスタンスを作成して、明示的にcloseする必要がある
  • tf.Session: バッチ処理などに使う。データフローグラフとは独立に定義できるセッションで、Pythonのwith構文でスコープを明示するとよい
  • データフローグラフの評価実行: 複数のノードの演算結果をまとめて取得するにはrunメソッドを用いる。個別ノード単位で取得するにはevalメソッドを用いる
  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

TensorFlow入門(3)
1. TensorFlowとは? 入門連載始動! データフローグラフ、事例、学び方

TensorFlowの概要と適用範囲を説明。最重要な基本概念であるデータフローグラフについて解説する。また、深層学習との関係や、事例、学び方についても紹介する。

TensorFlow入門(3)
2. TensorFlow環境の構築

本連載のゴールは「エンジニア向けに、とりあえずTensorFlow使ってみて、ディープラーニングを体感してみる」こと。実際にTensorFlowを使っていくために、まずは環境構築を行おう。

TensorFlow入門(3)
3. 【現在、表示中】≫ TensorFlowの基本構成要素:「テンソル」と「セッション」

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

TensorFlow入門(3)
4. CNN(Convolutional Neural Network)を理解しよう(TensorFlow編)

画像認識でよく使われるディープラーニングの代表的手法「CNN」を解説。「畳み込み」「プーリング」「活性化関数」「CNNのネットワーク構成」「ソフトマックス関数」といった基礎と、注意点を押さえよう。

TensorFlow入門(3)
5. 画像認識を行う深層学習(CNN)を作成してみよう(TensorFlow編)

ディープラーニングの代表的手法「CNN」により画像認識を行う機械学習モデルを構築してみる。CNNによる深層学習がどのようなものか体験しよう。

Deep Insider の SNS :