繼續來看 Session 的部分。

Session 是 Tensorflow 用來執行命令的語句。可以利用 seesion.run() 來執行已經建立好的 graph 上的某個部份的運算結果。這裡 Session 的筆記和範例程式碼一樣來自官方文件

Session 會把 graph ops 放到你的機器上面,例如 CPUs 或 GPUs,並且提供執行他們的方法。

建立 graph

這邊先來建立一個簡單的 graph。先從 source ops,也就是不需要任何 input 的 op 開始。例如從建立 Constant 開始,然後將這些常數傳給其他 ops 來做計算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf
# Create a Constant op that produces a 1x2 matrix. The op is
# added as a node to the default graph.
# The value returned by the constructor represents the output
# of the Constant op.
matrix1 = tf.constant([[3., 3.]])
# Create another Constant that produces a 2x1 matrix.
matrix2 = tf.constant([[2.],[2.]])
# Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product = tf.matmul(matrix1, matrix2) # matrix multiply np.dot(m1, m2)

建立與開啟 session

目前為止這個 graph 有三個節點:兩個 constant() ops 和一個 matmul() op。而要實際執行 matmul(),也就是矩陣乘法,必須要把這個 graph launch 在一個 session 裡。要 launch 一個 graph 必須先建立一個 Session object。而使用 Session 的方式有兩種,首先看一下第一種。

要得到 product 的執行結果必須利用 session.run(product)。Session 去呼叫 run(product) 會執行三個 graph 中的 ops: 兩個 constants 和 matmul。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Launch the default graph.
sess = tf.Session()
# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op. This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session. They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the matmul is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result) # [[ 12.]]
# Close the Session when we're done.
sess.close()

第二種方式使用 with。在 with block 結束的同時,session 會被一併關閉。

1
2
3
with tf.Session() as sess:
result = sess.run([product])
print(result)

前面有提到 Session 會把 graph 放到 CPUs 或 GPUs 上,而如果有多的 CPU 或 GPU 可以利用,with…Device 這個 statement 可以去指定你要用的 CPU 或是 GPU:

1
2
3
4
5
6
with tf.Session() as sess:
with tf.device('/gpu:1'):
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
...
  • /cpu:0: The CPU of your machine.
  • /gpu:0: The GPU of your machine, if you have one.
  • /gpu:1: The second GPU of your machine, etc.