中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

tensorflow saver如何實現保存和恢復指定tensor

發布時間:2021-07-23 14:10:58 來源:億速云 閱讀:183 作者:小新 欄目:開發技術

小編給大家分享一下tensorflow saver如何實現保存和恢復指定tensor,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

在實踐中經常會遇到這樣的情況:

1、用簡單的模型預訓練參數

2、把預訓練的參數導入復雜的模型后訓練復雜的模型

這時就產生一個問題:

如何加載預訓練的參數。

下面就是我的總結。

為了方便說明,做一個假設:簡單的模型只有一個卷基層,復雜模型有兩個。

卷積層的實現代碼如下:

import tensorflow as tf
# PS:本篇的重擔是saver,不過為了方便閱讀還是說明下參數
# 參數
# name:創建卷基層的代碼這么多,必須要函數化,而為了防止變量沖突就需要用tf.name_scope
# input_data:輸入數據
# width, high:卷積小窗口的寬、高
# deep_before, deep_after:卷積前后的神經元數量
# stride:卷積小窗口的移動步長
def make_conv(name, input_data, width, high, deep_before,deep_after, stride, padding_type='SAME'):
 global parameters
 with tf.name_scope(name) asscope:
  weights =tf.Variable(tf.truncated_normal([width, high, deep_before, deep_after],
   dtype=tf.float32,stddev=0.01), trainable=True, name='weights')
  biases =tf.Variable(tf.constant(0.1, shape=[deep_after]), trainable=True, name='biases')
  conv =tf.nn.conv2d(input_data, weights, [1, stride, stride, 1], padding=padding_type)
  bias = tf.add(conv,biases)
  bias = batch_norm(bias,deep_after, 1) # batch_norm是自己寫的batchnorm函數
  conv =tf.maximum(0.1*bias, bias)
  return conv

簡單的預訓練模型就下面一句話

conv1 =make_conv('simple-conv1', images, 3, 3, 3, 32, 1)

復雜的模型是兩個卷基層,如下:

conv1 = make_conv('complex-conv1',images, 3, 3, 3, 32, 1)
pool1= make_max_pool('layer1-pool1', conv1, 2, 2)
conv2= make_conv('complex-conv2', pool1, 3, 3, 32, 64, 1)

這時簡簡單單的在預訓練模型中:

saver = tf.train.Saver()
with tf.Session() as sess:
saver.save(sess,'model.ckpt')

就不行了,因為:

1,如果你在預訓練模型中使用下面的話打印所有tensor

all_v =tf.global_variables()
for i in all_v: print i

會發現tensor的名字不是weights和biases,而是'simple-conv1/weights和'simple-conv1/biases,如下:

<tf.Variable'simple-conv1/weights:0' shape=(3, 3, 3, 32) dtype=float32_ref>

<tf.Variable'simple-conv1/biases:0' shape=(32,) dtype=float32_ref>

<tf.Variable 'simple-conv1/Variable:0' shape=(32,)dtype=float32_ref>

<tf.Variable 'simple-conv1/Variable_1:0' shape=(32,)dtype=float32_ref>

<tf.Variable 'simple-conv1/Variable_2:0' shape=(32,)dtype=float32_ref>

<tf.Variable 'simple-conv1/Variable_3:0' shape=(32,)dtype=float32_ref>

同理,在復雜模型中就是complex-conv1/weights和complex-conv1/biases,這是對不上號的。

2,預訓練模型中只有1個卷積層,而復雜模型中有兩個,而tensorflow默認會從模型文件('model.ckpt')中找所有的“可訓練的”tensor,找不到會報錯。

解決方法:

1,在預訓練模型中定義全局變量

parm_dict={}

并在“return conv”上面添加下面兩行

parm_dict['complex-conv1/weights']= weights
parm_dict['complex-conv1/']= biases

然后在定義saver時使用下面這句話:

saver= tf.train.Saver(parm_dict)

這樣保存后的模型文件就對應到復雜模型上了。

2,在復雜模型中定義全局變量

parameters= []

并在“return conv”上面添加下面行

parameters+= [weights, biases]

然后判斷如果是第二個卷積層就不更新parameters。

接著在定義saver時使用下面這句話:

saver= tf.train.Saver(parameters)

這樣就可以告訴saver,只需要從模型文件中找weights和biases,而那些什么complex-conv1/Variable~ complex-conv1/Variable_3統統滾一邊去(上面紅色部分)。

最后使用下面的代碼加載就可以了

with tf.Session() as sess:
 ckpt= tf.train.get_checkpoint_state('.')
 if ckpt and ckpt.model_checkpoint_path:
  saver.restore(sess,ckpt.model_checkpoint_path)
 else:
  print ' no saver.'
  exit()

以上是“tensorflow saver如何實現保存和恢復指定tensor”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

额敏县| 深水埗区| 星座| 肥城市| 双流县| 江津市| 密云县| 伽师县| 海兴县| 庄浪县| 荣昌县| 宝清县| 峨山| 无锡市| 石棉县| 白河县| 谷城县| 东乌珠穆沁旗| 利川市| 石阡县| 平塘县| 长治市| 滁州市| 简阳市| 西安市| 门头沟区| 肃北| 通化县| 彰武县| 东平县| 二连浩特市| 和林格尔县| 滦南县| 民勤县| 蓝山县| 敦化市| 平度市| 于田县| 利川市| 寻甸| 高唐县|