tensorflow沒(méi)有output結(jié)點(diǎn),存儲(chǔ)成pb文件的例子
Tensorflow中保存成pb file 需要 使用函數(shù)
graph_util.convert_variables_to_constants(sess, sess.graph_def,
output_node_names=[]) []中需要填寫(xiě)你需要保存的結(jié)點(diǎn)。如果保存的結(jié)點(diǎn)在神經(jīng)網(wǎng)絡(luò)中沒(méi)有被顯示定義該怎么辦?
例如我使用了tf.contrib.slim或者keras,在tf的高層很多情況下都會(huì)這樣。
在寫(xiě)神經(jīng)網(wǎng)絡(luò)時(shí),只需要簡(jiǎn)單的一層層傳導(dǎo),一個(gè)slim.conv2d層就包含了kernal,bias,activation function,非常的方便,好處是網(wǎng)絡(luò)結(jié)構(gòu)一目了然,壞處是什么呢?

在嘗試保存pb的 output node names時(shí),需要將最后的輸出結(jié)點(diǎn)保存下來(lái),與這個(gè)結(jié)點(diǎn)相關(guān)的,從輸入開(kāi)始,經(jīng)過(guò)層層傳遞的嵌套函數(shù)或者操作的相關(guān)結(jié)點(diǎn),都會(huì)被保存,但無(wú)效的例如 計(jì)算準(zhǔn)確率,計(jì)算loss等,就可以省略了,因?yàn)楸4娴膒b主要是用來(lái)做預(yù)測(cè)的。
在準(zhǔn)備查看所有的結(jié)點(diǎn)名稱(chēng)并選取保存時(shí),發(fā)現(xiàn)scope "local3"里面僅有相關(guān)的weights 和biases,這兩個(gè)是單獨(dú)存在的,即保存這兩個(gè)參數(shù)并沒(méi)有任何意義。

那么這時(shí)候有兩種解決辦法:
方法一:
graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=[var.name[:-2] for var in tf.global_variables()])
那么這個(gè)的意思是所有的variable的都被保存下來(lái) 但函數(shù)中要求的是 node name 我們通過(guò) global_variables獲得的是 變量名 并不是 節(jié)點(diǎn)名
(例如 output:0 就是變量名,又叫tensor name)
output就是 node name了。
在tensorboard中可以一窺究竟

通過(guò)這樣 也可以將 所有的變量全部保存下來(lái)(但是你并不能使用,是因?yàn)槟愕膐utput并沒(méi)有名字,所以你不可以通過(guò)常用的sess.graph.get_tensor_by_name來(lái)使用)
方法二:
那就是直接改寫(xiě)神經(jīng)網(wǎng)絡(luò)了....當(dāng)然了還是比較簡(jiǎn)單的,只要改寫(xiě)最后一個(gè),改寫(xiě)成output即可,tensorflow中無(wú)論是 變量、操作op、函數(shù)、都可以命名,那么這個(gè)地方是一個(gè)簡(jiǎn)單的全連接,僅需要將weights*net(上一層的輸出) +bias 即可,我們只要將bias相加的結(jié)果命名為 ouput即可:
with tf.name_scope('local3'):
local3_weights = tf.Variable(tf.truncated_normal([4096, self.output_size], stddev=0.1))
local3_bias = tf.Variable(tf.constant(0.1, shape=[self.output_size]))
result = tf.add(tf.matmul(net, local3_weights), local3_bias, name="output")
這樣將上述的convert_variables_to_constants中的output_node_names只需要填寫(xiě)一個(gè)['output']即可,因?yàn)檫@一個(gè)output結(jié)點(diǎn),需要從input開(kāi)始,將所有的神經(jīng)網(wǎng)絡(luò)前向傳播的操作和參數(shù)全部保存下來(lái),因此保存的結(jié)點(diǎn)數(shù)量 和 方法一保存的結(jié)點(diǎn)數(shù)量是一樣的(console顯示都是 convert 24)。
完整的pb保存為:(我是將ckpt讀入進(jìn)來(lái),然后存成pb的)
from tensorflow.python.platform import gfile
load_ckpt():
path = './data/output/loss1.0/'
print("read from ckpt")
ckpt = tf.train.get_checkpoint_state(path)
saver = tf.train.Saver()
saver.restore(sess, ckpt.model_checkpoint_path)
def write2pb_file():
constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph_def,
output_node_names=["output"])
with tf.gfile.GFile(path+'loss1.0.pb', mode='wb') as f:
f.write(constant_graph.SerializeToString())
print("Model is saved as " + path+'loss1.0.pb')
def main():
load_ckpt()
write2pb_file()
如果是簡(jiǎn)單的直接保存,那就更簡(jiǎn)單了。
pb文件的read,很多人會(huì)將一個(gè)net寫(xiě)成一個(gè)類(lèi),在引入的時(shí)候會(huì)將新建這個(gè)類(lèi),然后讀入ckpt文件,這完全沒(méi)有問(wèn)題,但是在讀取pb時(shí),就會(huì)發(fā)生問(wèn)題,因?yàn)閜b中已經(jīng)包含了圖與參數(shù),引入時(shí)會(huì)創(chuàng)建一個(gè)默認(rèn)的圖,但是net類(lèi)中自己也會(huì)創(chuàng)建一個(gè)圖,那么這時(shí)候你運(yùn)行程序,參數(shù)其實(shí)并沒(méi)有使用.pb的文件。
所以我們不能創(chuàng)建net類(lèi),然后直接讀入.pb文件,對(duì).pb文件,通過(guò)如下代碼,獲取.pb的graph中的輸入和輸出。
self.output = self.sess.graph.get_tensor_by_name("output:0")
self.input = self.sess.graph.get_tensor_by_name("images:0")
注意此時(shí)要加:0 因?yàn)槟惬@取的不再是結(jié)點(diǎn)了,而是一個(gè)真實(shí)的變量,我的理解是,結(jié)點(diǎn)相當(dāng)于一個(gè)類(lèi),:0是對(duì)象,默認(rèn)初始化值就是對(duì)象的初始化。
然后就可以通過(guò)self.sess.run(self.output(feed_dict={self.input: your_input})))運(yùn)行你的網(wǎng)絡(luò)了!
以上這篇tensorflow沒(méi)有output結(jié)點(diǎn),存儲(chǔ)成pb文件的例子就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
pycharm 使用心得(九)解決No Python interpreter selected的問(wèn)題
PyCharm 是由JetBrains打造的一款 Python IDE。具有智能代碼編輯器,能理解 Python 的特性并提供卓越的生產(chǎn)力推進(jìn)工具:自動(dòng)代碼格式化、代碼完成、重構(gòu)、自動(dòng)導(dǎo)入和一鍵代碼導(dǎo)航等。這些功能在先進(jìn)代碼分析程序的支持下,使 PyCharm 成為 Python 專(zhuān)業(yè)開(kāi)發(fā)人員和剛起步人員使用的有力工具。2014-06-06
詳解Python如何檢查一個(gè)數(shù)字是否是三態(tài)數(shù)
在數(shù)學(xué)中,三態(tài)數(shù)(Triangular?Number)是一種特殊的數(shù)列,它是由自然數(shù)按照一定規(guī)律排列而成的,本文主要介紹了如何使用Python檢查判斷一個(gè)數(shù)字是否是三態(tài)數(shù),需要的可以參考下2024-03-03
利用Python腳本實(shí)現(xiàn)自動(dòng)刷網(wǎng)課
這篇文章主要介紹了利用Python腳本實(shí)現(xiàn)自動(dòng)刷網(wǎng)課,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
基于python批量處理dat文件及科學(xué)計(jì)算方法詳解
今天小編就為大家分享一篇基于python批量處理dat文件及科學(xué)計(jì)算方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Django動(dòng)態(tài)展示Pyecharts圖表數(shù)據(jù)的幾種方法
本文主要介紹了Django動(dòng)態(tài)展示Pyecharts圖表數(shù)據(jù)的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08

