書籍転載:TensorFlowはじめました ― 実践!最新Googleマシンラーニング(2)
TensorFlow入門 ― 変数とプレースホルダー
転載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
を使います。
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は、変数を使って状態を保存するプログラムです。変数var1
に、定数const2
の値を足した結果を代入して、さらにvar1
とadd_op
を積算するグラフ(図1.4)を構築しています。
変数を使うには、セッション内でtf.initialize_all_variables()
を実行して、変数を初期化する必要があります。
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run([mul_op]))
print(sess.run([mul_op]))
|
リスト1.6を実行すると、オペレーションmul_op
を実行するたびに結果が変わっているのがわかります。
[9]
[36]
|
変数とセッション
変数はセッションに紐付きます。リスト1.7のコードでは、2つのセッション内で同じオペレーション「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]))
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(sess.run([mul_op]))
print(sess.run([mul_op, mul_op]))
|
[9]
[36, 36]
[9]
[36, 36]
|
mul_op
は、処理の過程で変数を更新します。しかし、セッション間で変数の値は引き継がれていません。それぞれのセッションで変数が独立していることがわかります。
変数代入のタイミング
変数に値が代入されるタイミングは、run
に指定したオペレーションがすべて完了した後です。
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のコードでは、2つのmul_op
要素を持つリストを実行していますが、run
が終わるまで結果が変わっていないことがわかります。
[9]
[36, 36]
[81, 81]
|
プレースホルダー
プレースホルダー(placeholder)はデータが格納される予定地です。データは未定のままグラフを構築し、具体的な値は実行するときに与えます。
プレースホルダーを利用するケースとして、ファイルから読み込んだデータをグラフに与えて処理する場合が考えられます。
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では、プレースホルダーholder2
を作成しています。しかし、定数や変数のときのように初期値を与えていません。型としてtf.int32
を指定しているだけです。
プレースホルダーの値は、オペレーションの実行時にfeed_dict
を通じて与えます。リスト1.10では、holder2
の値として「5」を与えています。
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
result = sess.run(mul_op, feed_dict={
holder2: 5
})
print(result)
|
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データセットを使った学習と評価を行う。画像データの読み込みが終わったので、今回は画像の種類(クラス)を判別、つまり「推論」について説明する。