久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TensorFlow學(xué)習(xí)系列(三):保存/恢復(fù)和混合多個(gè)模型

 雪柳花明 2017-05-26

目錄


TensorFlow學(xué)習(xí)系列(一):初識(shí)TensorFlow

TensorFlow學(xué)習(xí)系列(二):形狀和動(dòng)態(tài)維度

TensorFlow學(xué)習(xí)系列(三):保存/恢復(fù)和混合多個(gè)模型

TensorFlow學(xué)習(xí)系列(四):利用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)泛逼近器(universal approximator)

TensorFlow學(xué)習(xí)系列(五):如何使用隊(duì)列和多線程優(yōu)化輸入管道


在學(xué)習(xí)這篇博客之前,,我希望你已經(jīng)掌握了Tensorflow基本的操作,。如果沒(méi)有,,你可以閱讀這篇入門(mén)文章,。

為什么要學(xué)習(xí)模型的保存和恢復(fù)呢,?因?yàn)檫@對(duì)于避免數(shù)據(jù)的混亂無(wú)序是至關(guān)重要的,,特別是在你代碼中的不同圖,。

如何保存和加載模型

saver類(lèi)

在不同的會(huì)話中,當(dāng)需要將數(shù)據(jù)在硬盤(pán)上面進(jìn)行保存時(shí),,那么我們就可以使用Saver這個(gè)類(lèi),。這個(gè)Saver構(gòu)造類(lèi)允許你去控制3個(gè)目標(biāo):

  • 目標(biāo)(The target):這個(gè)參數(shù)設(shè)置目標(biāo)。在分布式架構(gòu)的情況下,,我們可以指定要計(jì)算哪個(gè)TF服務(wù)器或者“目標(biāo)”,。
  • 圖(The graph):這個(gè)參數(shù)設(shè)置保存的圖。保存你希望會(huì)話處理的圖。對(duì)于初學(xué)者來(lái)說(shuō),,這里有一件棘手的事情就是在Tensorflow中總是有一個(gè)默認(rèn)的圖,,并且你所有的操作都是在這個(gè)圖中首先進(jìn)行。所有,,你總是在“默認(rèn)圖范圍”內(nèi),。
  • 配置(The config):這個(gè)參數(shù)設(shè)置配置。你可以使用 ConfigProto 參數(shù)來(lái)進(jìn)行配置Tensorflow,。點(diǎn)擊這里,,查看更多信息。

Saver類(lèi)可以處理你的圖中元數(shù)據(jù)和變量數(shù)據(jù)的保存和恢復(fù),。而我們唯一需要做的是,,告訴Saver類(lèi)我們需要保存哪個(gè)圖和哪些變量。

在默認(rèn)情況下,,Saver類(lèi)能處理默認(rèn)圖中包含的所有變量,。但是,你也可以去創(chuàng)建很多的Saver類(lèi),,去保存你想要的任何子圖,。

import tensorflow as tf

# First, you design your mathematical operations
# We are the default graph scope

# Let's design a variable
v1 = tf.Variable(1. , name="v1")
v2 = tf.Variable(2. , name="v2")
# Let's design an operation
a = tf.add(v1, v2)

# Let's create a Saver object
# By default, the Saver handles every Variables related to the default graph
all_saver = tf.train.Saver() 
# But you can precise which vars you want to save under which name
v2_saver = tf.train.Saver({"v2": v2}) 

# By default the Session handles the default graph and all its included variables
with tf.Session() as sess:
  # Init v and v2   
  sess.run(tf.global_variables_initializer())
  # Now v1 holds the value 1.0 and v2 holds the value 2.0
  # We can now save all those values
  all_saver.save(sess, 'data.chkp')
  # or saves only v2
  v2_saver.save(sess, 'data-v2.chkp')

當(dāng)你運(yùn)行了上面的程序之后,如果你去看文件夾,,那么你會(huì)發(fā)現(xiàn)文件夾中存在了七個(gè)文件(如下)。在接下來(lái)的博客中,,我會(huì)詳細(xì)解釋這些文件的意義,。目前你只需要知道,模型的權(quán)重是保存在 .chkp 文件中,,模型的圖是保存在 .chkp.meta 文件中,。

├── checkpoint
├── data-v2.chkp.data-00000-of-00001
├── data-v2.chkp.index
├── data-v2.chkp.meta
├── data.chkp.data-00000-of-00001
├── data.chkp.index
├── data.chkp.meta

恢復(fù)操作和其它元數(shù)據(jù)

我想分享的最后一個(gè)信息是,Saver將保存與圖有關(guān)聯(lián)的任何元數(shù)據(jù),。這就意味著,,當(dāng)我們恢復(fù)一個(gè)模型的時(shí)候,我們還同時(shí)恢復(fù)了所有與圖相關(guān)的變量,、操作和集合,。

當(dāng)我們恢復(fù)一個(gè)元模型(restore a meta checkpoint)時(shí),實(shí)際上我們執(zhí)行的操作是將恢復(fù)的圖載入到當(dāng)前的默認(rèn)圖中,。所有當(dāng)你完成模型恢復(fù)之后,,你可以在默認(rèn)圖中訪問(wèn)載入的任何內(nèi)容,比如一個(gè)張量,,一個(gè)操作或者集合,。

import tensorflow as tf

# Let's laod a previous meta graph in the current graph in use: usually the default graph
# This actions returns a Saver
saver = tf.train.import_meta_graph('results/model.ckpt-1000.meta')

# We can now access the default graph where all our metadata has been loaded
graph = tf.get_default_graph()

# Finally we can retrieve tensors, operations, etc.
global_step_tensor = graph.get_tensor_by_name('loss/global_step:0')
train_op = graph.get_operation_by_name('loss/train_op')
hyperparameters = tf.get_collection('hyperparameters')

恢復(fù)權(quán)重

請(qǐng)記住,在實(shí)際的環(huán)境中,,真實(shí)的權(quán)重只能存在于一個(gè)會(huì)話中,。也就是說(shuō),,restore 這個(gè)操作必須在一個(gè)會(huì)話中啟動(dòng),然后將數(shù)據(jù)權(quán)重導(dǎo)入到圖中,。理解恢復(fù)操作的最好方法是將它簡(jiǎn)單的看做是一種數(shù)據(jù)初始化操作,。

with tf.Session() as sess:
    # To initialize values with saved data
    saver.restore(sess, 'results/model.ckpt-1000-00000-of-00001')
    print(sess.run(global_step_tensor)) # returns 1000

在新圖中導(dǎo)入預(yù)訓(xùn)練模型

至此,你應(yīng)該已經(jīng)明白了如何去保存和恢復(fù)一個(gè)模型,。然而,,我們還可以使用一些技巧去幫助你更快的保存和恢復(fù)一個(gè)模型。比如:

  • 一個(gè)圖的輸出能成為另一個(gè)圖的輸入嗎,?

答案是確定的,。但是目前我的做法是先將第一個(gè)圖進(jìn)行保存,然后在另一個(gè)圖中進(jìn)行恢復(fù),。但是這種方案感覺(jué)很笨重,,我不知道是否有更好的方法。

但是這種方法確實(shí)能工作,,除非你想要去重新訓(xùn)練第一個(gè)圖,。在這種情況下,你需要將輸入的梯度重新輸入到第一張圖中的特定的訓(xùn)練步驟中,。我想你已經(jīng)被這種復(fù)雜的方案給逼瘋了把,。:-)

  • 我可以在一個(gè)圖中混合不同的圖嗎?

答案當(dāng)然是肯定的,,但是你必須非常小心命名空間,。這種方法有一點(diǎn)好處是,簡(jiǎn)化了一切,。比如,,你可以預(yù)加載一個(gè)VGG-19模型。然后訪問(wèn)圖中的任何節(jié)點(diǎn),,并執(zhí)行你自己的后續(xù)操作,,從而訓(xùn)練一整個(gè)完整的模型。

如果你只想微調(diào)你自己的節(jié)點(diǎn),,那么你可以在你想要的地方中斷梯度,。

import tensorflow as tf

# Load the VGG-16 model in the default graph
vgg_saver = tf.train.import_meta_graph(dir + '/vgg/results/vgg-16.meta')
# Access the graph
vgg_graph = tf.get_default_graph()

# Retrieve VGG inputs
self.x_plh = vgg_graph.get_tensor_by_name('input:0')

# Choose which node you want to connect your own graph
output_conv =vgg_graph.get_tensor_by_name('conv1_2:0')
# output_conv =vgg_graph.get_tensor_by_name('conv2_2:0')
# output_conv =vgg_graph.get_tensor_by_name('conv3_3:0')
# output_conv =vgg_graph.get_tensor_by_name('conv4_3:0')
# output_conv =vgg_graph.get_tensor_by_name('conv5_3:0')

# Stop the gradient for fine-tuning
output_conv_sg = tf.stop_gradient(output_conv) # It's an identity function

# Build further operations
output_conv_shape = output_conv_sg.get_shape().as_list()
W1 = tf.get_variable('W1', shape=[1, 1, output_conv_shape[3], 32], initializer=tf.random_normal_initializer(stddev=1e-1))
b1 = tf.get_variable('b1', shape=[32], initializer=tf.constant_initializer(0.1))
z1 = tf.nn.conv2d(output_conv_sg, W1, strides=[1, 1, 1, 1], padding='SAME') + b1
a = tf.nn.relu(z1)

References:

http:///questions/38947658/tensorflow-saving-into-loading-a-graph-from-a-file

http:///questions/34343259/is-there-an-example-on-how-to-generate-protobuf-files-holding-trained-tensorflow?rq=1

http:///questions/39468640/tensorflow-freeze-graph-py-the-name-save-const0-refers-to-a-tensor-which-doe?rq=1

http:///questions/33759623/tensorflow-how-to-restore-a-previously-saved-model-python

http:///questions/34500052/tensorflow-saving-and-restoring-session?noredirect=1&lq=1

http:///questions/35687678/using-a-pre-trained-word-embedding-word2vec-or-glove-in-tensorflow

https://github.com/jtoy/awesome-tensorflow


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多