いまさらTensorflow 始めます。第四撃  TensorBoardとは?

tensorflowを始めることになったので、記憶の定着もかねて、先人たちの記録をまとめて整理していく。

「TensorBoard」とは、「強力な可視化ツール」。 TensorBoardを使えばグラフを可視化して、Webブラウザで見ることができる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ライブラリのインポート
import tensorflow as tf

const1 = tf.constant(2)
const2 = tf.constant(3)
add_op = tf.add(const1, const2)
mul_op = tf.multiply(add_op, const2)

with tf.Session() as sess:
  result, result2 = sess.run([mul_op, add_op])
  print(result)
  #定数const1=2
  #定数const2=3
  #add_op=const1+const2=5
  #mul_op=add_op*const2=5*3=15
  print(result2)
  #定数const1=2
[http://www.buildinsider.net/small/booktensorflow/0104:embed:cite]


  #定数const2=3
  #add_op=const1+const2=5

  tf.summary.FileWriter('./', sess.graph)
tensorboard --logdir=[logpath]

Starting TensorBoard 41 on port 6006
(You can navigate to http://10.0.1.4:6006)

ブラウザでhttp://localhost:6006にアクセスして、上部メニューから「GRAPHS」を選択すると、構築したグラフ画像が表示される。 画像を見れば、オペレーション同士がどう結びついているのか視覚的に確認することができる。 上記オペレーションのグラフはこんな感じ。

参考:

www.buildinsider.net

いまさらTensorflow 始めます。第三撃  テンソルとは?

tensorflowを始めることになったので、記憶の定着もかねて、先人たちの記録をまとめて整理していく。

テンソル」とは、「n次元の多次元配列」。 wiki

テンソル - Wikipedia

テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念を一般化したもので、基底を選べば、多次元の配列として表現できるようなものである。しかし、テンソル自身は、特定の座標系によらないで定まる対象である。個々のテンソルについて、対応する量を記述するのに必要な配列の添字の組の数は、そのテンソルの階数とよばれる。 例えば、質量や温度などのスカラー量は階数0のテンソルだと理解される。同様にして力や運動量などのベクトル的な量は階数1のテンソルであり、力や加速度ベクトルの間の異方的な関係などをあらわす線型変換は階数2のテンソルで表される。 物理学や工学においてしばしば「テンソル」と呼ばれているものは、実際には位置や時刻を引数としテンソル量を返す関数である「テンソル場」であることに注意しなければならない。いずれにせよテンソル場の理解のためにはテンソルそのものの概念の理解が不可欠である。”

TensorFlowプログラムは、テンソルデータ構造を使用してすべてのデータを表現する。 TensorFlowテンソルは、n次元の配列やリストとして考えることができる。テンソルは静的型と動的次元を持ちます。 計算グラフでは、ノード間にはテンソルだけが渡されます。

Rank

TensorFlowプログラムでは、テンソルはRankと呼ばれる次元の単位で記述されます。 Rankはマトリックスランクと同じではありません。テンソルのRank(時々、次数または次数またはn次元と呼ばれる)は、テンソルの次元数です。

たとえば、次のテンソルPythonリストとして定義されています)のランクは2です。

t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Rank    Math entity                         Python example
0       Scalar (magnitude only)             s = 483
1       Vector (magnitude and direction)    v = [1.1, 2.2, 3.3]
2       Matrix (table of numbers)           m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3       3-Tensor (cube of numbers)          t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]]
n       n-Tensor (you get the idea)         ....

Shape

TensorFlowのドキュメントでは、テンソルの次元数を表すために3つの表記法である ランク、形状、ディメンション番号 が使用されます。 次の表は、これらが互いにどのように関連しているかを示しています。

Rank    Shape               Dimension number    Example
0       []                  0-D                 A 0-D tensor. A scalar.
1       [D0]                1-D                 A 1-D tensor with shape [5].
2       [D0, D1]            2-D                 A 2-D tensor with shape [3, 4].
3       [D0, D1, D2]        3-D                 A 3-D tensor with shape [1, 4, 3].
n       [D0, D1, ... Dn-1]  n-D                 A tensor with shape [D0, D1, ... Dn-1].

Data types

次元に加えて、テンソルにはデータ型があります。次のデータ型のいずれかをテンソルに割り当てることができます。

Data type       Python type     Description   
DT_FLOAT        tf.float32      32 bits floating point.
DT_DOUBLE       tf.float64      64 bits floating point.
DT_INT8         tf.int8         8 bits signed integer.
DT_INT16        tf.int16        16 bits signed integer.
DT_INT32        tf.int32        32 bits signed integer.
DT_INT64        tf.int64        64 bits signed integer.
DT_UINT8        tf.uint8        8 bits unsigned integer.
DT_UINT16       tf.uint16       16 bits unsigned integer.
DT_STRING       tf.string       Variable length byte arrays. Each element of a Tensor is a byte array.
DT_BOOL         tf.bool         Boolean.
DT_COMPLEX64    tf.complex64    Complex number made of two 32 bits floating points: real and imaginary parts.
DT_COMPLEX128   tf.complex128   Complex number made of two 64 bits floating points: real and imaginary parts.
DT_QINT8        tf.qint8        8 bits signed integer used in quantized Ops.
DT_QINT32       tf.qint32       32 bits signed integer used in quantized Ops.
DT_QUINT8       tf.quint8       8 bits unsigned integer used in quantized Ops.

画像データを表す場合は、 TensorのRankは[3]、 Shapeは[width, height, channel]、 データ型はtf.uint8*3 となる。

参考: Tensor Ranks, Shapes, and Types  |  TensorFlow

www.buildinsider.net

いまさらTensorflow 始めます。第二撃  変数とプレースホルダー

tensorflowを始めることになったので、記憶の定着もかねて、先人たちの記録をまとめて整理していく。

TensorFlowの定数「tf.constant」以外に、変数「Variable」とプレースホルダー「placeholder」がある。

ライブラリのインポート

import tensorflow as tf

変数は「tf.Variable」で変数を宣言する。 変数に値を代入するときは「tf.assign」を使う。 変数var1に、定数const2の値を足した結果を代入して、さらにvar1とadd_opを積算するグラフを構築する。 変数を使うには、セッション内で「tf.initialize_all_variables()」を実行して、変数を初期化する必要がある。

var1 = tf.Variable(0)#変数宣言
const2 = tf.constant(3)#定数3

add_op = tf.add(var1, const2)#変数var1と定数const2のsum
update_var1 = tf.assign(var1, add_op)#変数var1にadd_opを代入
mul_op = tf.multiply(add_op, update_var1)#代入した値とadd_opの積


with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())

  print(sess.run([mul_op]))
  print(sess.run([mul_op]))

結果

WARNING:tensorflow:From sample.py:24: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use `tf.global_variables_initializer` instead.
[9]
[36]

WARNING出たけどとりあえず無視。 それぞれの変数の値はセッション内でこんな感じで変化していると考えられる。

with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())

  print(sess.run([mul_op]))
  # var1=0 const2=3 add_op=3 update_var1=3 var1=3 
  # mul_op=9 
  print(sess.run([mul_op]))
  # var1=3 const2=3 add_op=6 update_var1=6 var1=6 
  # mul_op=36 

WARNINGは「tf.initialize_all_variables()」を使わないで「tf.global_variables_initializer()」を使えということかな?

ちょっと修正。 修正したら出なくなった。

Sessionを二回まわしてみる

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

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  print(sess.run([mul_op]))
  print(sess.run([mul_op, mul_op]))
Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K80, pci bus id: a097:00:00.0)
[9]
[36, 36]
Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K80, pci bus id: a097:00:00.0)
[9]
[36, 36]

それぞれ同じ値が表示された。 mul_opはSession処理の過程で変数を更新する。 そのため、セッション間で変数の値は引き継がれない。 それぞれのセッションで変数が独立している。

変数代入のタイミング 変数に値が代入されるタイミングは、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, mul_op]))

これを実行すると、以下のようになる。

[9]
[36, 36]
[81, 81, 81]

runに渡したオペレーションがそれぞれ終わってから値が表示される。

プレースホルダ

プレースホルダー「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.multiply(add_op, update_var1)

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  result = sess.run(mul_op, feed_dict={holder2: 5})

  print(result)

これを実行すると以下のような答えが出る。

Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla K80, pci bus id: a097:00:00.0)
25

処理の中を書くとこんな感じ。

var1 = tf.Variable(0)#変数 var1=0
holder2 = tf.placeholder(tf.int32)#プレースホルダーholder2 int32型
add_op = tf.add(var1, holder2)#オペレーション 変数var1とholder2のsum
update_var1 = tf.assign(var1, add_op)#var1にadd_opを代入
mul_op = tf.multiply(add_op, update_var1)#add_opとupdate_var1の積

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())#変数の初期化
  result = sess.run(mul_op, feed_dict={holder2: 5})
  #add_opとupdate_var1の積を実行。holder2=5の場合の処理を行う。
  #add_op = tf.add(var1, holder2)#add_op=5
  #update_var1 = tf.assign(var1, add_op)#var1=5 update_var1=5
  #mul_op = tf.multiply(add_op, update_var1)#mul_op=25
  #result = sess.run(mul_op, feed_dict={holder2: 5})#result=mul_op
  print(result)#25

下みたいに、プレースホルダーの値を入れないでrunするとエラーが出る。

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.multiply(add_op, update_var1)

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  result = sess.run(mul_op)

  print(result)

エラーはこんな感じ。

Invalid argument: You must feed a value for placeholder tensor 'Placeholder' with dtype int32
[[Node: Placeholder = Placeholder[dtype=DT_INT32, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
(~中略~)
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype int32
[[Node: Placeholder = Placeholder[dtype=DT_INT32, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
Caused by op u'Placeholder', defined at:
(~中略~)
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype int32
[[Node: Placeholder = Placeholder[dtype=DT_INT32, shape=[], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]

参考:

www.buildinsider.net

sample2.py全文

var1 = tf.Variable(0)#変数宣言
const2 = tf.constant(3)#定数3

add_op = tf.add(var1, const2)#変数var1と定数const2のsum
update_var1 = tf.assign(var1, add_op)#変数var1にadd_opを代入
mul_op = tf.multiply(add_op, update_var1)#代入した値とadd_opの積



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

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


with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())

  print(sess.run([mul_op]))
  print(sess.run([mul_op, mul_op]))
  print(sess.run([mul_op, mul_op, mul_op]))



var1 = tf.Variable(0)#変数 var1=0
holder2 = tf.placeholder(tf.int32)#プレースホルダーholder2 int32型
add_op = tf.add(var1, holder2)#オペレーション 変数var1とholder2のsum
update_var1 = tf.assign(var1, add_op)#var1にadd_opを代入
mul_op = tf.multiply(add_op, update_var1)#add_opとupdate_var1の積



with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  result = sess.run(mul_op, feed_dict={holder2: 5})

  print(result)

#with tf.Session() as sess:
#  sess.run(tf.global_variables_initializer())
#  result = sess.run(mul_op)
#
#  print(result)

いまさらTensorflow 始めます。第一撃 データの流れの確認

tensorflowを始めることになったので、記憶の定着もかねて、先人たちの記録をまとめて整理していく。

tensorflow ライブラリのインポート

import tensorflow as tf

tensorflow上のノードに値を入れる

const1 = tf.constant(5)
const2 = tf.constant(2)

tensorflow上のノード同士を足しす

add_op = tf.add(const1, const2)

グラフの実行 構築したグラフの処理結果を得る セッションtf.Sessionの中で、結果を得たいオペレーションを実行runします。

with tf.Session() as sess:
  result = sess.run(add_op)

そうすることで、結果を得ることができる。

print(result)
const1 = tf.constant(5)
print(const1)
const2 = tf.constant(2)
print(const2)
add_op = tf.add(const1, const2)
print(add_op)

こんなことをしても、求めたい値は得られない。

Tensor("Const_2:0", shape=(), dtype=int32)
Tensor("Const_3:0", shape=(), dtype=int32)
Tensor("Add_1:0", shape=(), dtype=int32)

単純にテンソルの文字列が出てくる。

値を求めるなら session内で表示させること。

runの引数にリストを渡すと複数の処理を実行することもできる。

const1 = tf.constant(5)
const2 = tf.constant(2)
add_op = tf.add(const1, const2)#足し算
mul_op = tf.multiply(add_op, const2)#掛け算
 with tf.Session() as sess:
  result, result2 = sess.run([mul_op, add_op])
  print(result)
  print(result2)

結果

14
7

参考:

www.buildinsider.net