リスト 1 . 1 : 足し算 # coding: UTF—8 from from from import constl const2 add—op future futu re_ future_ import absotute_import import division import print—function tf. add(constl, const2) tf. constant(3) tf. constant(2) tensorflow as tf with tf. Session() as sess: sess . run(add—op) result print(result) では、リスト 1.2 はどうでしようか リスト 1.2 : add_op を print 文で表示 定数 constl と c 。 nst2 を加算しています。実行すると「 2 + 3 」の結果「 5 」が表示されます。 constl const2 add—op tf. constant(2) tf. constant(3) tf. add(constl, const2) print(add—op) shape=(), dtype=int32) Tensor("Add:@" ドを「オペレーション (Operation: op ) 」と呼びます。 グラフは Tensor オプジェクトの「ノード」で構成されます。 TensorFIow では、これらのノー 繰り返しになりますが、 TensorFlow の処理は「データフローグラフ」として構築します。 グラフとノード、オペレーション 同様です。そのまま print しても、計算結果の値は表示されません。 文字列が表示され、加算した結果は得られませんでした。定数 c 。 nstl や c 。 nst2 についても 8 第 1 章 TensorFlow の基礎
Tensor("add 1:@" 3 3 3 , 4 ] ) 2 , 算できませんが、プロードキャスティングにより計算が可能になります。 リスト 1.18 のように、本来、一次元配列の arrayl とスカラーの valuel は、そのままでは計 スティングを使うと、形の異なる配列同士を自動的に変換して計算できます。 プロードキャスティング (Broadcasting) は、 NumPy5 で一般的な機能です。プロードキャ 1 .6 プロードキャスティング 置き換えられています。そのため、オペレーションを実行するまで値は得られません。 dtype=i nt32 ) であることに注意してください。演算子 + はオーバーロードで tf. add に shape=() , 度目の print(result2) で表示されるのが Tensor("add-1:@" resultl と resutt2 の結果は同じになりました。 nmport numpy as np リスト 1 . 1 8 : NumPy のプロードキャスティング shape=() , dtype=int32) arrayl valuel result np . a r ray ( [ 1 , 2 , 3 5 arrayl + valuel print(result) [ 6 7 8 9 ] TensorFlow にもプロードキャスティングの仕組みがあり、形の違う配列同士で演算するこ リスト 1 . 1 9 : TensorFlow のプロードキャスティング とができます ( リスト 1.19 ) 。 import tensorftow as tf 20 arrayl valuel result 第 1 章 tf. constant([l, tf. constant(5) TensorFlow の基礎 arrayl + valuel
リスト 1 .16 : プレースホルダーに値を与える with tf. Session() as sess: sess . run(tf. globat—variables—initiatizer() ) result hotder2 sess . run(mul—op, feed—dict={ 5 print(resutt) 25 実行結果に、プレースホルダーに与えた値が反映されています。 なお、プレースホルダーに値を与えずに関連したオペレーションを実行すると、必要なデー タがないため工ラーになります。必須でないプレースホルダーを示すため、あらかじめ初期値 を指定する tf. ptaceholder-with-default もあります。 1 .5 演算子のオーバーロード これまで演算オペレーションとして tf. add や tf. muttipty を使ってきました リスト 1 .17 : 廿 . d と演算子 + は同じ意味 般的な演算子に書き換えることができます ( リスト 1.17 ) 。 これらは一 va r 1 var2 resultl resuIt2 tf. constant(l) tf. constant(2) tf. add(varl, varl 十 var2 var2) print(resuIt2) 第 1 章 print(sess. run(result2)) print(sess. run(resultl)) with tf. Session() as sess: TensorFlow の基礎 19
図 1 . 1 : グラフを構成するオペレーション tf. add constl const2 今回の場合、 const1,const2,add-op は、 python プログラム上では変数ですが、 TensorFIow ではデータフローグラフを構成するノード、つまり「オペレーション」です 2 。そのため print で中身を見ようとしても「 Tensor 」としか表示されません。 グラフの実行 構築したグラフの処理結果を得るには、セッション (tf. Session) の中で、結果を得たい オペレーションを実行 ( ru n) する必要があります。 ru n は、オペレーションが指定されると、そのオペレーションに接続されているグラフを処 リスト 1.3 は、オペレーション add ー op を実行しています。 理して、結果を NumPy の ndarray オプジェクトとして返します。 sess . run(add—op) result seSS tf. Session() リスト 1 .3 : add_op を実行 リスト 1 .4 : mul_op と add_op を実行 ともできます。 print(resutt) また、 run の引数にオペレーションのリストを渡せば、複数のオペレーションを実行するこ constl const2 add—op mul—op tf. constant(2) tf. constant(3) tf. add(constl, const2) tf. multiply(add—op, const2) with tf. Session() as sess: mut_resutt, add_result sess. run( [mut—op, add—op] ) 第 1 章 TensorFlow の基礎 9
リスト 1 . IO : Tenso 「を変形 array = tf. range(), 6@) sliced—arrayl reshaped—array sticed sliced sliced concat —array2 —arrayl —array2 array tf. reshape(array, reshaped_array[@, reshaped—array[3, tf. reshape(sIiced—array2, [ 1 , tf. reshape(sliced_arrayl, [ 1 , tf. concat([sliced_arrayl, s1iced_array2] , axis=@) print(concat—array. get_shape() ) with tf. Session() as sess: resutt = sess. run(concat_array) print(result) ( 2 , 15 ) [ [ 0 1 2 3 4 5 6 7 8 9 1@ 11 12 13 14 ] [ 45 46 47 48 49 5@ 51 52 53 54 55 56 57 58 59 ] ] または、 concat を tf. hstack オペレーションに置き換えることでも同様の結果が得られ ます。 1 .4 変数とプレースホルダー TensorFIow では定数 (tf. constant) に加えて、変数 (Variable) とプレースホルダー (placeholder) を宣言できます。 tf. variable で変数を宣言します。変数に値を代入するときは tf. assign を使います。 リスト 1 .1 1 : 変数の宣言と代入 tf.VariabIe(@) tf. constant(3) va r 1 const2 add—op tf. add(varl, const2) update—varl tf. assign(varl, adcLop) mul—op tf. muttiply(add—op, update_varl) リスト 1.11 は、変数を使って状態を保存するプログラムです。変数 varl に 定数 const2 の 第 1 章 TensorFlow の基礎 15