書籍転載:TensorFlowはじめました ― 実践!最新Googleマシンラーニング(2)

書籍転載:TensorFlowはじめました ― 実践!最新Googleマシンラーニング(2)

TensorFlow入門 ― 変数とプレースホルダー

2016年8月9日

転載2回目。TensorFlowの基礎の第2弾として、変数とプレースホルダーを実際のコードと実行結果で示しながら解説する。

有山 圭二
  • このエントリーをはてなブックマークに追加

 前回はTensorFlowの基礎として、データフローグラフや定数について説明しました。今回は、引き続き基礎編として、変数とプレースホルダーを紹介します。

書籍転載について

 本コーナーは、インプレスR&D[Next Publishing]発行の書籍『TensorFlowはじめました ― 実践!最新Googleマシンラーニング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 『TensorFlowはじめました ― 実践!最新Googleマシンラーニング』(Kindle電子書籍もしくはオンデマンドペーパーバック)の詳細や購入はAmazon.co.jpのページをご覧ください。書籍全体の目次は連載INDEXページに掲載しています。プログラムのダウンロードは、「TensorFlowはじめました」のサポート用フォームから行えます。

ご注意

本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

1.3 変数とプレースホルダー

 TensorFlowでは定数(tf.constant)に加えて変数(Variable)とプレースホルダー(placeholder)を宣言できます。

変数

 tf.Variableで変数を宣言します。変数に値を代入するときはtf.assignを使います。

Python
var1 = tf.Variable(0)
const2 = tf.constant(3)

add_op = tf.add(var1, const2)
update_var1 = tf.assign(var1, add_op)

mul_op = tf.mul(add_op, update_var1)
リスト1.5: 変数の宣言と代入

 リスト1.5は、変数を使って状態を保存するプログラムです。変数var1に、定数const2の値を足した結果を代入して、さらにvar1add_opを積算するグラフ(図1.4)を構築しています。

図1.4: 変数に値を代入している

 変数を使うには、セッション内でtf.initialize_all_variables()を実行して、変数を初期化する必要があります。

Python
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  
  print(sess.run([mul_op]))
  print(sess.run([mul_op]))
リスト1.6: 変数を初期化してオペレーションを実行

 リスト1.6を実行すると、オペレーションmul_opを実行するたびに結果が変わっているのがわかります。

[9]
[36]
変数とセッション

 変数はセッションに紐付きます。リスト1.7のコードでは、2つのセッション内で同じオペレーション「mul_op」を実行しています。

Python
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  
  print(sess.run([mul_op]))
  print(sess.run([mul_op, mul_op]))

with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  
  print(sess.run([mul_op]))
  print(sess.run([mul_op, mul_op]))
リスト1.7: 異なるセッションの変数
[9]
[36, 36]
[9]
[36, 36]

 mul_opは、処理の過程で変数を更新します。しかし、セッション間で変数の値は引き継がれていません。それぞれのセッションで変数が独立していることがわかります。

変数代入のタイミング

 変数に値が代入されるタイミングは、runに指定したオペレーションがすべて完了した後です。

Python
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  
  print(sess.run([mul_op]))
  print(sess.run([mul_op, mul_op]))
  print(sess.run([mul_op, mul_op]))
リスト1.8: mul_opを複数回実行する

 リスト1.8のコードでは、2つのmul_op要素を持つリストを実行していますが、runが終わるまで結果が変わっていないことがわかります。

[9]
[36, 36]
[81, 81]
プレースホルダー

 プレースホルダー(placeholder)はデータが格納される予定地です。データは未定のままグラフを構築し、具体的な値は実行するときに与えます。

 プレースホルダーを利用するケースとして、ファイルから読み込んだデータをグラフに与えて処理する場合が考えられます。

Python
var1 = tf.Variable(0)
holder2 = tf.placeholder(tf.int32)
add_op = tf.add(var1, holder2)
update_var1 = tf.assign(var1, add_op)
mul_op = tf.mul(add_op, update_var1)
リスト1.9: プレースホルダーの宣言

 リスト1.9では、プレースホルダーholder2を作成しています。しかし、定数や変数のときのように初期値を与えていません。型としてtf.int32を指定しているだけです。

図1.5: プレースホルダーを追加したグラフ

 プレースホルダーの値は、オペレーションの実行時にfeed_dictを通じて与えます。リスト1.10では、holder2の値として「5」を与えています。

Python
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  
  result = sess.run(mul_op, feed_dict={
    holder2: 5
  })
  
  print(result)
リスト1.10: プレースホルダーに値を与える
25

 実行結果に、プレースホルダーに与えた値が反映されています。

 なお、プレースホルダーに値を与えずに関連したオペレーションを実行すると、必要なデータがないためエラーになります。必須でないプレースホルダーを示すため、あらかじめ初期値を指定するtf.placeholder_with_defaultもあります。

 今回はTensorFlowの基礎として、変数とプレースホルダーを説明しました。次回は、テンソル(Tensor)とTensorBoardによるグラフの可視化を解説します。

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

1. TensorFlowとは? データフローグラフを構築・実行してみよう

技術書オンリー即売会「技術書典」で頒布された同名出版物をベースとして制作されたTensorFlowの入門書籍を転載開始。その1回目として、データフローグラフや定数といったTensorFlowの基礎を説明する。

2. 【現在、表示中】≫ TensorFlow入門 ― 変数とプレースホルダー

転載2回目。TensorFlowの基礎の第2弾として、変数とプレースホルダーを実際のコードと実行結果で示しながら解説する。

3. TensorFlowの“テンソル(Tensor)”とは? TensorBoardの使い方

転載3回目。テンソル(Tensor)とTensorBoardによるグラフの可視化を解説する。「第1章 TensorFlowの基礎」は今回で完結。

4. TensorFlowでデータの読み込み ― 画像を分類するCIFAR-10の基礎

転載4回目。今回から「畳み込みニューラルネットワーク」のモデルを構築して、CIFAR-10のデータセットを使った学習と評価を行う。今回はデータの読み込みを説明。

5. TensorFlowによる推論 ― 画像を分類するCIFAR-10の基礎

転載5回目。CIFAR-10データセットを使った学習と評価を行う。画像データの読み込みが終わったので、今回は画像の種類(クラス)を判別、つまり「推論」について説明する。

サイトからのお知らせ

Twitterでつぶやこう!