1. 程式人生 > >tensorflow10 《TensorFlow實戰Google深度學習框架》筆記-05-03模型持久化code

tensorflow10 《TensorFlow實戰Google深度學習框架》筆記-05-03模型持久化code

01 ckpt檔案儲存方法

# 《TensorFlow實戰Google深度學習框架》05 minist數字識別問題
# win10 Tensorflow1.0.1 python3.5.3
# CUDA v8.0 cudnn-8.0-windows10-x64-v5.1
# filename:ts05.09.py # ckpt檔案儲存方法

import tensorflow as tf

# 1. 儲存計算兩個變數和的模型
v1 = tf.Variable(tf.constant(1.0, shape=[1]), name = "v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1
]), name = "v2") result = v1 + v2 init_op = tf.global_variables_initializer() saver = tf.train.Saver() with tf.Session() as sess: sess.run(init_op) # 需要在本python指令碼檔案下存在Saved_model目錄 # 否則提示錯誤 ValueError: Parent directory of Saved_model/model.ckpt doesn't exist, can't save. saver.save(sess, "Saved_model/model.ckpt"
) # 2. 載入儲存了兩個變數和的模型 with tf.Session() as sess: saver.restore(sess, "Saved_model/model.ckpt") print(sess.run(result)) # [3.] # 3. 直接載入持久化的圖 saver = tf.train.import_meta_graph("Saved_model/model.ckpt.meta") with tf.Session() as sess: saver.restore(sess, "Saved_model/model.ckpt") print(sess.run(tf.get_default_graph().get_tensor_by_name("add:0"
))) # [3.] # 4. 變數重新命名 v1 = tf.Variable(tf.constant(1.0, shape=[1]), name = "other-v1") v2 = tf.Variable(tf.constant(2.0, shape=[1]), name = "other-v2") saver = tf.train.Saver({"v1": v1, "v2": v2})

02 滑動平均類的儲存

# 《TensorFlow實戰Google深度學習框架》05 minist數字識別問題
# win10 Tensorflow1.0.1 python3.5.3
# CUDA v8.0 cudnn-8.0-windows10-x64-v5.1
# filename:ts05.10.py # 滑動平均類的儲存

import tensorflow as tf

# 1. 使用滑動平均
v = tf.Variable(0, dtype=tf.float32, name="v")
for variables in tf.global_variables():
    print(variables.name)
'''
v:0
'''
ema = tf.train.ExponentialMovingAverage(0.99)
maintain_averages_op = ema.apply(tf.global_variables())
for variables in tf.global_variables():
    print(variables.name)
'''
v:0
v/ExponentialMovingAverage:0
'''
# 2. 儲存滑動平均模型
saver = tf.train.Saver()
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    sess.run(tf.assign(v, 10))
    sess.run(maintain_averages_op)
    # 儲存的時候會將v:0  v/ExponentialMovingAverage:0這兩個變數都存下來。
    saver.save(sess, "Saved_model/model2.ckpt")
    print(sess.run([v, ema.average(v)]))
'''
[10.0, 0.099999905]
'''
# 3. 載入滑動平均模型
v = tf.Variable(0, dtype=tf.float32, name="v")

# 通過變數重新命名將原來變數v的滑動平均值直接賦值給v。
saver = tf.train.Saver({"v/ExponentialMovingAverage": v})
with tf.Session() as sess:
    saver.restore(sess, "Saved_model/model2.ckpt")
    print(sess.run(v))
'''
0.0999999
'''

03 variables_to_restore函式的使用樣例

# 《TensorFlow實戰Google深度學習框架》05 minist數字識別問題
# win10 Tensorflow1.0.1 python3.5.3
# CUDA v8.0 cudnn-8.0-windows10-x64-v5.1
# filename:ts05.11.py # variables_to_restore函式的使用樣例

import tensorflow as tf
v = tf.Variable(0, dtype=tf.float32, name="v")
ema = tf.train.ExponentialMovingAverage(0.99)
print(ema.variables_to_restore())
'''
{'v/ExponentialMovingAverage': <tensorflow.python.ops.variables.Variable object at 0x000001F0CFB260F0>}
'''
saver = tf.train.Saver({"v/ExponentialMovingAverage": v})
with tf.Session() as sess:
    saver.restore(sess, "Saved_model/model2.ckpt")
    print(sess.run(v))
'''
0.0999999
'''

04 pb檔案儲存方法

# 《TensorFlow實戰Google深度學習框架》05 minist數字識別問題
# win10 Tensorflow1.0.1 python3.5.3
# CUDA v8.0 cudnn-8.0-windows10-x64-v5.1
# filename:ts05.12.py # pb檔案儲存方法

import tensorflow as tf

# 1. pb檔案的儲存方法
import tensorflow as tf
from tensorflow.python.framework import graph_util

v1 = tf.Variable(tf.constant(1.0, shape=[1]), name = "v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]), name = "v2")
result = v1 + v2

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    graph_def = tf.get_default_graph().as_graph_def()
    output_graph_def = graph_util.convert_variables_to_constants(sess, graph_def, ['add'])
    with tf.gfile.GFile("Saved_model/combined_model.pb", "wb") as f:
           f.write(output_graph_def.SerializeToString())

# 2. 載入pb檔案
from tensorflow.python.platform import gfile

with tf.Session() as sess:
    model_filename = "Saved_model/combined_model.pb"

    with gfile.FastGFile(model_filename, 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())

    result = tf.import_graph_def(graph_def, return_elements=["add:0"])
    print(sess.run(result)) # [array([ 3.], dtype=float32)]