深層神經網路2
使用驗證集判斷模型效果
為了評測神經網路模型在不同引數下的效果,一般會從訓練集中抽取一部分作為驗證資料。除了使用驗證資料集,還可以採用交叉驗證(cross validation )
的方式驗證模型效果,但是使用交叉驗證會花費大量的時間。但在海量資料情況下,一般採用驗證資料集的形式評測模型的效果。
一般採用的驗證資料分佈越接近測試資料分佈,模型在驗證資料上的表現越可以體現模型在測試資料上的保險。
使用滑動平均模型和指數衰減的學習率在一定程度上都是限制神經網路中引數更新的速度。
在處理複雜問題時,使用滑動平均模型、指數衰減的學習率和正則化損失可以明顯提升模型的訓練效果。
變數管理
Tensorflow提供了通過變數名稱來建立或者獲取一個變數的機制,避免了複雜神經網路頻繁傳遞引數的情況。通過該機制,在不同的函式中可以直接通過變數的名字來使用變數,而不需要將變數通過引數的形式到處傳遞。
Tensorflow中通過變數名獲取變數的機制主要通過tf.get_variable()
和tf.variable_scope()
函式實現。
-
tf.get_variable()
該函式建立變數的方法和tf.Variable()
函式的用法基本一樣,提供維度資訊(shape
)以及初始化方法(initializer
)的引數。該函式的變數名稱是一個必填引數,函式會根據這個名字去建立或者獲取變數。當已經有同名引數時,會報錯。 -
tf.variable_scope()
該函式可以控制tf.get_variable()
函式的語義。當tf.variable_scope()
函式使用引數reuse=True
生成上下文管理器時,這個上下文管理器內所有的tf.get_variable()
函式會直接獲取已經建立的變數。如果不存在,則報錯;當reuse=False
或者reuse=None
建立上下文管理器時,tf.get_variable()
操作將建立新的變數,如果同名變數已經存在,則報錯。
同時tf.variable_scope()
函式可以巢狀。新建一個巢狀的上下文管理器但不指定reuse,這時的reuse的取值和外面一層保持一致。當退出reuse設定為True的上下文之後reuse的值又回到了False(內層reuse不設定)。
同時,tf.variable_scope()函式生成的上下文管理器也會建立一個Tensorflow中的名稱空間,在名稱空間內建立的變數名稱都會帶上這個名稱空間名作為字首。可以直接通過帶名稱空間名稱的變數名來獲取其它名稱空間下的變數(建立一個名稱為空的名稱空間,並設定為reuse=True)。
with tf.variable_scope(" ", reuse=True):
v5 = tf.get_variable("foo/bar/v", [1])
print(v5.name)
===>v:0 # 0表示variable這個運算輸出的第一個結果
Tensorflow模型持久化
將訓練得到的模型儲存下來,可以方便下次直接使用(避免重新訓練花費大量的時間)。Tensorflow提供的持久化機制可以將訓練之後的模型儲存到檔案中。
Tensorflow提供了tf.train.Saver
類來儲存和還原神經網路模型。當儲存模型之後,目錄下一般會出現三個檔案,這是因為Tensorflow會將計算圖的結構和圖上引數值分開儲存。
-
model.ckpy.meta
檔案,儲存了Tensorflow計算圖的結構。 -
model.ckpt
檔案,儲存了Tensorflow程式每一個變數的取值。 -
checkpoint
檔案,儲存了一個目錄下所有的模型檔案列表。
儲存模型saver = tf.train.Saver()
saver.save(sess, "path/model.ckpt")
載入模型,此時不用進行變數的初始化過程saver.restore(sess, "path/model.ckpt")
sess.run(result)
為了儲存和載入部分變數,在宣告tf.train.Saver類時可以提供一個列表來指定需要儲存或載入的變數,saver = tf.train.Saver([v1])
。同時,tf.train.Saver類也支援在儲存或者載入時給變數重新命名,如果直接載入就會導致程式報變數找不到的錯誤,Tensorflow提供通過字典將模型儲存時的變數名和要載入的變數聯絡起來。
v = tf.Variable(tf.constant(1.0, shape=[1]), name='other-v1')
saver = tf.train.Saver({"v1": v})
將原先變數名為v1的變數載入到變數v中,變數v的名稱為other-v1。
這樣做的目的時為了方便使用變數的滑動平均值。因為每一個變數的滑動平均值是通過影子變數維護的,如果在載入模型時直接將影子變數對映到變數自身,就不需要在呼叫函式來獲取變數的平均值了。
為了方便載入重新命名滑動平均變數,tf.train.ExponentialMovingAverage類提供了variables_to_restore()函式來生成tf.train.Saver類所需要的變數重新命名字典。
v = tf.Variable(0)
ema = tf.train.ExponentialMovingAverage(0.99)
saver = tf.train.Saver(ema.variable_to_restore())
with tf.Session() as sess:
saver.restore(sess, "path/model.ckpt")
sess.run(v)
有時候不需要類似於變數初始化、模型儲存等輔助節點的資訊,Tensorflow提供了convert_variables_to_constants()函式將計算圖中的變數及其取值通過常量的方式儲存。
持久化原理及資料格式
Tensorflow程式中所有計算都會被表達為計算圖上的節點。
MetaGraphDef
Tensorflow通過元圖(MetaGraph)
來記錄計算圖中節點的資訊以及執行計算圖中節點所需要的後設資料,元圖是由MetaGraphDef Protocol Buffer
定義的,MetaGraphDef
中的內容構成了Tensorflow持久化的第一個檔案,也就是model.ckpt.meta
檔案。
-
meta_info_def
屬性,記錄了Tensorflow計算圖中的後設資料以及Tensorflow程式中所有使用到的運算方法的資訊。後設資料包括了計算圖的版本號以及使用者指定的一些標籤,其中meta_info_def
屬性的stripped_op_list
屬性儲存了Tensorflow運算方法的資訊,如果一個運算方法在計算圖中出現了多次,在該欄位中也只出現一次。stripped_op_list
屬性的型別是OpList
,OpList
型別是一個OpDef
型別的列表,該型別定義了一個運算的所有資訊,包括運算名、輸入輸出和運算的引數資訊。 -
graph_def
屬性,主要記錄了Tensorflow計算圖上的節點資訊,Tensorflow計算圖的每一個節點對應了Tensorflow程式中的一個運算。meta_info_def
屬性已經包含了所有運算的具體資訊,所以graph_def
屬性只關注運算的連線結果。
該屬性是通過GraphDef Protocol Buffer定義的,GraphDef主要包含了一個NodeDef
型別的列表,GraphDef
的versions
屬性儲存了Tensorflow的版本號,node
屬性記錄了所有的節點資訊。node
為NodeDef
型別,該型別的op
屬性給出了該節點使用的運算方法名稱,具體資訊可以通過meta_info_def
獲取,input
屬性是一個字串列表,定義了運算的輸入,device
屬性定義了處理該運算的裝置,attr
屬性定義了和當前運算相關的配置資訊。 -
saver_def
屬性,記錄了持久化模型所需要用到的一些引數,比如儲存到檔案的檔名,儲存操作和載入操作的名稱以及儲存頻率、清理歷史記錄等。
該屬性主要通過SaverDef
定義。 -
collention_def
屬性,Tensorflow計算圖中可以維護不同的集合,底層實現就是通過collention_def
這個屬性。collection_def
屬性是一個從集合名稱到集合內容的對映,其中集合名稱為字串,集合內容為CollentionDef Protocol Buffer
。Tensorflow計算圖上的集合主要可以維護4類不同的集合:NodeList
用於維護計算圖上的節點集合;BytesList
用於維護字串或者序列化之後的Protocol Buffer的集合;Int64List
用於維護整數集合;FloatList
用於維護實數集合。
SSTable
持久化Tensorflow中變數的取值,tf.Save
r得到的model.ckpt
檔案儲存了所有的變數,該檔案使用SSTable
格式儲存的,相當於一個(key, value)
列表。
CheckpointState
持久化的最後一個檔名叫checkpoint
,這個檔案是tf.train.Saver
類自動生成且自動維護的。該檔案中維護了一個由tf.train.Saver
類持久化的所有Tensoflow模型檔案的檔名,當某個模型檔案被刪除時,這個模型對應的檔名也會被移除,checkpoint中內容的格式為CheckpointState Protocol Buffer
。
相關文章
- 深度學習教程 | 深層神經網路深度學習神經網路
- 【深度學習】1.4深層神經網路深度學習神經網路
- 吳恩達《神經網路與深度學習》課程筆記(5)– 深層神經網路吳恩達神經網路深度學習筆記
- 第二課改善深層神經網路assignment1-Initialization神經網路
- 02改善深層神經網路-Regularization-第一週程式設計作業2神經網路程式設計
- 三、淺層神經網路神經網路
- MXNET:多層神經網路神經網路
- 神經網路入門篇之深層神經網路:詳解前向傳播和反向傳播(Forward and backward propagation)神經網路反向傳播Forward
- 案例剖析:利用LSTM深層神經網路進行時間序列預測神經網路
- 神經網路中間層輸出神經網路
- 何為神經網路卷積層?神經網路卷積
- 0603-常用的神經網路層神經網路
- 卷積神經網路-2卷積神經網路
- 02改善深層神經網路-Initialization-第一週程式設計作業1神經網路程式設計
- 02改善深層神經網路-Gradient+Checking-第一週程式設計作業3神經網路程式設計
- 02改善深層神經網路-Optimization+methods-第二週程式設計作業1神經網路程式設計
- 吳恩達《神經網路與深度學習》課程筆記(4)– 淺層神經網路吳恩達神經網路深度學習筆記
- 神經網路:numpy實現神經網路框架神經網路框架
- 卷積神經網路 part2卷積神經網路
- 神經網路神經網路
- Coursera Deep Learning 2 改善深層神經網路:超引數除錯、正則化以及優化 第二週習題神經網路除錯優化
- Coursera Deep Learning 2 改善深層神經網路:超引數除錯、正則化以及優化 第一週習題神經網路除錯優化
- 卷積神經網路—基本部件(2)卷積神經網路
- umich cv-5-2 神經網路訓練2神經網路
- 18-神經網路-自定義帶引數的層神經網路
- 利用淺層神經網路識別圖片中的英文神經網路
- 構建兩層以上BP神經網路(python程式碼)神經網路Python
- 8、神經網路神經網路
- LSTM神經網路神經網路
- 聊聊從腦神經到神經網路神經網路
- 圖神經網路GNN 庫,液體神經網路LNN/LFM神經網路GNN
- 3、基於Python建立任意層數的深度神經網路Python神經網路
- [譯] 淺析深度學習神經網路的卷積層深度學習神經網路卷積
- 1. 從多層感知機到卷積神經網路卷積神經網路
- 神經網路篇——從程式碼出發理解BP神經網路神經網路
- 【神經網路篇】--RNN遞迴神經網路初始與詳解神經網路RNN遞迴
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 神經網路(neural networks)神經網路
- 人工神經網路(ANN)神經網路