tensorflow學習(2):tensorflow中基本概念的理解
前言:
tensorflow中有很多基本概念要理解,最好的方法是去官網跟著教程一步一步看,這裡還有一些翻譯的版本,對照著看有助於理解:tensorflow1.0 文件翻譯
正文:
一,構建並執行計算圖的必要過程
1,graph(圖計算):詳見tf.Graph類
使用tensorflow訓練神經網路包括兩部分:構建計算圖和執行計算圖。
首先來講構建圖,一個計算圖包含了一組操作(operation objects,也叫節點)和一些tensor objects(節點之間傳遞的資料單元)。系統會預設構建一個計算圖,這也是mnist入門案例上來就可以定義節點的原因。不過我們在寫程式碼的時候,應該將構建計算圖的程式碼寫在一個with塊中
myGraph = tf.Graph()
with myGraph.as_default():
# Define operations and tensors in `myGraph `.(在下面定義op和tensor)
c = tf.constant(30.0)
2,operations(圖節點):詳見tf.Operation類
op是計算圖中的節點,它能接收tensor作為輸入,並能產生tensor作為輸出。op的建立方式有兩種,一種是呼叫了計算操作,比如mnist例子中的tf.matmul(),tf.nn.conv2d(),tf.nn.max_pool()函式等,這些函式名就是op。另一種方法是呼叫Graph.create_op()方法往圖裡加op。常用第一種方法。op在構建圖的階段不會執行,在執行圖階段才執行。
3,tensor(向量):詳見tf.Tensor類
tensor就是op計算的輸入/輸出結果。同樣的,tensor在構建圖時並不持有值,而是在執行時持有數值。tensor作為op的輸入/輸出在graph中傳遞,從而使得tensorflow能執行代表著大規模計算的計算圖,也正是Tensorflow得名的原因(向量流動)。常量和變數都是tensor。舉例如下,a,b,c,d就是tensor,它們可以作為op的輸出值,也可以作為op的輸入值。
# Build a dataflow graph.
a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.constant([[1.0, 1.0], [0.0, 1.0]] )
c = tf.matmul(c, d)
d = tf.Variable([1.0, 2.0])
4,session(會話):詳見tf.Session類
前面3步我們已經構建完了一個計算圖,現在需要執行這個計算圖。session就是執行計算圖的類。 tensor的執行要通過sess.run(tensor)來執行。session物件封裝了op執行和tensor傳遞的環境。session物件開啟後會持有資源,所以用完後要記得關閉,通常寫到一個with塊裡面。綜合1234,我們寫一個例子。
myGraph = tf.Graph()
with myGraph.as_default():
# Build a graph.
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# Using the context manager.
with tf.Session() as sess:
print(sess.run(c))
二, Tensor相關的屬性和方法
1,tensor的屬性,常用的有下面這些:
dtype:tensor中元素的型別(tf.int32, tf.float32等)
graph:tensor所屬的計算圖(返回Graph類物件的地址)
name:tensor的字串名字,若定義tensor的時候取了名字,則輸出你取的名字。若你自己沒有取,系統會按規則幫你給tensor取名字,規則如下:若tensor是常量,則第一個tensor取名“Const”,第二個tensor取名“Const_1”,第三個tensor取名“Const_2”,以此類推。若tensor是變數,則第一個tensor取名“Variable”,第二個tensor取名“Variable_1”,第三個tensor取名“Variable_2”,以此類推。這個知識點在save/restore模型的時候會用到。
op:產生改tensor的op名。會列出該op的詳細資訊。
shape:tensor的形狀。
舉例說明(tensor的屬性可直接列印,不需要放進sess.run()裡面):
# encoding=utf-8
import tensorflow as tf
graph = tf.Graph()
with graph.as_default():
x= tf.constant([[1.,2.,3.,4.],[5.,6.,7.,8.]],dtype=tf.float32)
x1= tf.constant([[1.,2.,3.,4.],[5.,6.,7.,8.]],dtype=tf.float32)
x2= tf.constant([[1.,2.,3.,4.],[5.,6.,7.,8.]],dtype=tf.float32)
y= tf.Variable([[0.,0.,-2.,1.],[-1,-2,-2,-3]])
y1= tf.Variable([[0.,0.,-2.,1.],[-1,-2,-2,-3]])
y2= tf.Variable([[0.,0.,-2.,1.],[-1,-2,-2,-3]])
y3= y1+y2
# shape:tensor的形狀
# size:tensor元素個數
# rank:tensor的維度
with tf.Session(graph=graph) as sess:
print(x.shape)
print(x.dtype)
print(x.graph)
print(x.name)
print(x1.name)
print(x2.name)
print(y.name)
print(y1.name)
print(y2.name)
print(y3.shape)
2,tensor的方法
–get_shape():得到tensor的shape,效果跟shape屬性一樣。
–eval(feed_dict=None, session=None):執行tensor的方法,呼叫這個方法將執行該tensor所需輸入的所有op。eval()方法要在session中呼叫。tensor.eval()效果與sess.run(tensor)相同,官網原文是這樣說的:t.eval() is a shortcut for calling tf.get_default_session().run(t)。至少我沒看出這兩個的區別。