Tensorflow學習筆記(4)
模型票評估:使用驗證集來判斷。在這個程式的開始設定了初始學習率、學習率衰減率、隱藏層節點數量、迭代輪數等7種不同的引數。在大部分情況下,配置神經網路的這些引數都是需要通過實驗來調整的。雖然一個神經網路模型的效果最終是通過測試資料來評判的,但是我們不能直接通過模型在測試資料上的效果來選擇引數。使用測試資料來選取引數可能會導致神經網路模型過度擬合測試資料,從而失去對未知資料的預判能力。
因為神經網路的輸入是一個特徵向量,所以在此把一張二維影象的畫素矩陣放到一個一維陣列中可以方便TensorFlow將圖片的畫素矩陣提供給神經網路的輸入層。畫素矩陣中元素的取值範圍為[0,1],它代表了顏色的深淺。其中0表示白色背景(background),1表示黑色前景(foreground)。
持久化程式碼實現:
saver=tf.train.Saver()
with tf.Session() as sess:
saver.save(sess,"path/to/model.ckpt)
持久化會生成三個檔案:
- 第一個檔案為model.ckpt.meta,它儲存了tensorflow計算圖的結構。
- 第二個檔案為model.ckpt,這個檔案中儲存了TensorFlow程式中每一個變數的取值。
- 第三個檔案為checkpoint檔案,這個檔案中儲存了一個目錄下所有的模型檔案列表。
呼叫模型saver.restore(sess,"path/to/model/model.ckpt")
saver=tf.train.import_meta_graph("path/to/model/model.ckpt.meta")
使用tf.train.Saver()會儲存執行TensorFlow程式所需要的全部資訊,然而有時並不需要某些資訊。比如在測試或者離線預測時,只需要知道如何從神經網路的輸入層經過前向傳播計算得到輸出層即可,而不需要類似於變數初始化、模型儲存等輔助節點的資訊。
TensorFlow提供了convert_variables_to_constants函式,通過這個函式可以將計算圖中的變數及其取值通過常量的方式儲存,這樣整個TensorFlow計算圖可以統一存放在一個檔案中。
持久化原理:tensorflow持久化通過儲存的四個檔案來進行的。
TensorFlow通過元圖(MetaGraph)來記錄計算圖中節點的資訊以及執行計算圖中節點所需要的元資料。
1.tf.add_to_collection(name,value)
功能:將變數新增到名為name的集合中去。
引數:(1)name:集合名(2)value:被新增的變數
2.tf.get_collection(key,scope=None)
功能:獲取集合中的變數。
引數:(1)key:集合名
3.tf.add_n(inputs,name=None)
功能:以元素方式新增所有輸入張量。
引數:(1)inputs:張量物件列表,每個物件具有相同的形狀和型別。
(2) name:操作的名稱(可選)
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
函式說明:
在計算交叉熵之前,通常要用到softmax層來計算結果的概率分佈。因為softmax層並不會改變最終的分類結果(排序)。所以,tensorflow將softmax層與交叉熵函式進行封裝,形成一個函式方便計算:tf.nn.softmax_cross_entropy_with_logits(logits= , labels=)
。為了加速計算過程,針對只有一個正確答案(例如MNIST識別)的分類問題,tensorflow提供了tf.nn.sparse_softmax_cross_entropy_with_logits(logits= , labels=)
。
函式的區別:
兩個函式雖然功能類似,但是其引數labels有明顯區別。tf.nn.softmax_cross_entropy_with_logits()
中的logits和labels的shape都是[batch_size,num_classes]
,而tf.nn.sparse_softmax_cross_entropy_with_logits[]
中的labels是稀疏表示的,是(0,num_classes)
中的一個數值,代表正確分類結果。即sparse_softmax_cross_entropy_with_logits
直接用標籤計算交叉熵,而 softmax_cross_entropy_with_logits
是標籤的onehot向量參與計算。softmax_cross_entropy_with_logits
的 labels 是 sparse_softmax_cross_entropy_with_logits
的 labels 的一個獨熱版本one_hot。
tf.argmax()函式:
import tensorflow as tf
y=tf.constant([0.4,0.6,0.8,1.0,0.3])
arg=tf.argmax(y,-1)
with tf.Session() as sess:
tf.global_variables_initializer().run()
print(sess.run(arg))
print:3
#求y最大值的索引號。
tf.control_dependencies():
設計是用來控制計算流圖的,給圖中的某些計算指定順序。比如:我們想要獲取引數更新後的值,那麼我們可以這麼組織我們的程式碼。自己的理解:如果不是tf的tensor,並且沒有加入到整個圖中,則不會執行;
eg:
x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
y = tf.identity(x)#修改部分
with tf.Session() as sess:
tf.global_variables_initializer().run()
for i in range(5):
print(sess.run(y))
#This works: it prints 1, 2, 3, 4, 5.
#############################################
with tf.control_dependencies([a, b, c]):
# `d` and `e` will only run after `a`, `b`, and `c` have executed.
d = ...
e = ...
tf.Graph().as_default() :
表示將這個類例項,也就是新生成的圖作為整個 tensorflow 執行環境的預設圖,如果只有一個主執行緒不寫也沒有關係,tensorflow 裡面已經存好了一張預設圖,可以使用tf.get_default_graph() 來呼叫(顯示這張預設紙),當你有多個執行緒就可以創造多個tf.Graph(),就是你可以有一個畫圖本,有很多張圖紙,這時候就會有一個預設圖的概念了。
tf.train.get_checkpoint_state函式會通過checkpoint檔案自動找到目錄中最新的模型檔名
準確率計算:
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))