深層神經網絡2


使用驗證集判斷模型效果

為了評測神經網絡模型在不同參數下的效果,一般會從訓練集中抽取一部分作為驗證數據。除了使用驗證數據集,還可以采用交叉驗證(cross validation )的方式驗證模型效果,但是使用交叉驗證會花費大量的時間。但在海量數據情況下,一般采用驗證數據集的形式評測模型的效果。
一般采用的驗證數據分布越接近測試數據分布,模型在驗證數據上的表現越可以體現模型在測試數據上的保險。
使用滑動平均模型和指數衰減的學習率在一定程度上都是限制神經網絡中參數更新的速度。
在處理復雜問題時,使用滑動平均模型、指數衰減的學習率和正則化損失可以明顯提升模型的訓練效果。


變量管理

Tensorflow提供了通過變量名稱來創建或者獲取一個變量的機制,避免了復雜神經網絡頻繁傳遞參數的情況。通過該機制,在不同的函數中可以直接通過變量的名字來使用變量,而不需要將變量通過參數的形式到處傳遞。
Tensorflow中通過變量名獲取變量的機制主要通過tf.get_variable()tf.variable_scope()函數實現。

  1. tf.get_variable()
    該函數創建變量的方法和tf.Variable()函數的用法基本一樣,提供維度信息(shape)以及初始化方法(initializer)的參數。該函數的變量名稱是一個必填參數,函數會根據這個名字去創建或者獲取變量。當已經有同名參數時,會報錯。
  2. 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會將計算圖的結構和圖上參數值分開保存。

  1. model.ckpy.meta文件,保存了Tensorflow計算圖的結構。
  2. model.ckpt文件,保存了Tensorflow程序每一個變量的取值。
  3. 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屬性的類型是OpListOpList類型是一個OpDef類型的列表,該類型定義了一個運算的所有信息,包括運算名、輸入輸出和運算的參數信息。
  • graph_def屬性,主要記錄了Tensorflow計算圖上的節點信息,Tensorflow計算圖的每一個節點對應了Tensorflow程序中的一個運算。meta_info_def屬性已經包含了所有運算的具體信息,所以graph_def屬性只關注運算的連接結果。
    該屬性是通過GraphDef Protocol Buffer定義的,GraphDef主要包含了一個NodeDef類型的列表,GraphDefversions屬性存儲了Tensorflow的版本號,node屬性記錄了所有的節點信息。nodeNodeDef類型,該類型的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.Saver得到的model.ckpt文件保存了所有的變量,該文件使用SSTable格式存儲的,相當于一個(key, value)列表。

CheckpointState

持久化的最后一個文件名叫checkpoint,這個文件是tf.train.Saver類自動生成且自動維護的。該文件中維護了一個由tf.train.Saver類持久化的所有Tensoflow模型文件的文件名,當某個模型文件被刪除時,這個模型對應的文件名也會被移除,checkpoint中內容的格式為CheckpointState Protocol Buffer

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

  • 簡單線性回歸 import tensorflow as tf import numpy # 創造數據 x_dat...
    CAICAI0閱讀 3,558評論 0 49
  • 躺在石頭上, 另一塊皎潔的漂在空中。 夾在兩塊石頭之中。 如柴房角落里的百腳蟲。
    李辦蠟閱讀 283評論 0 0
  • 前幾天在商場選唇彩,卻意外被一支洗面奶所吸引。 這支輕巧的洗面奶簡單、樸素,毫不起眼,站在眾多包裝考究的化妝品里,...
    阿蘭若素瀟雨閱讀 314評論 0 1
  • 那是一張我四歲,弟弟不滿周歲的照片。母親在過年之際想用照片記下弟弟不滿周歲的樣子,所以我們去了照相館。那時候覺得照...
    愛吃魚的小白羊閱讀 226評論 1 1