Hike News
Hike News

深度學習-tensorflow基礎-模型的保存與加載

Introduction

  • 可保存目前為止訓練的結果,等待繼續訓練或使用
  • 完整模型儲存的方式應該每訓練一段步數後就保存一些成果,例如權重、偏置等變量
  • 模型的保存與加載預設也是保存及加載變量值

保存模型

  • 模型的保存就是將訓練後改變的變量儲存起來
  • 保存模型的文件格式為checkpoint文件(檢查點文件)

train.Saver

使用tf.train.Saver(var_list=None,max_to_keep=5)返回一個saver物件

  • var_list:指定要保存和還原的變量,可以作為一個dict或是一個list傳遞進去
  • max_to_keep:指示要保留的最近檢查點文件的最大數量
    • 創建新文件時,會刪除較舊的文件
    • 如果無舊文件,則保留所有檢查點文件,預設為5(即保留最新的5個檢查點文件)
  • 使用返回的saver物件去操作保存(save)或是加載(restore)
    • saver.save(sess,"保存路徑及模型名")
    • saver.restore(sess,"加載路徑及模型名")

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import tensorflow as tf

def LinearRegression():
with tf.variable_scope("data_preparation"):
X = tf.random_normal([100,1],mean=1.75,stddev=0.5, name="x_data")
y_true = tf.matmul(X,[[0.7]]) + 0.8

with tf.variable_scope("LinearRegression_model_build"):
weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w") #必須用變量定義才能優化(改變)
bias = tf.Variable(0.0,name="bias")
y_predict = tf.matmul(X,weight) + bias

with tf.variable_scope("loss_calculate"):
loss = tf.reduce_mean(tf.square(y_true - y_predict))

with tf.variable_scope("optimize"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

tf.summary.scalar("Loss",loss)

tf.summary.histogram("Weight",weight)
tf.summary.scalar("Bias",bias)

merged = tf.summary.merge_all()

init_var_op = tf.global_variables_initializer()

# 定義一個 保存/加載 模型的物件
Saver = tf.train.Saver()

with tf.Session() as sess:
sess.run(init_var_op)
print("起始初始化權重:%f, 初始化偏置:%f"%(weight.eval(),bias.eval()))

FileWriter = tf.summary.FileWriter("./summary/",graph=sess.graph)

for i in range(1000):
sess.run(train_op)

summary = sess.run(merged)

FileWriter.add_summary(summary,i)

if i%50 == 0:
print("優化%d次後 權重:%f, 優化偏置:%f" % (i,weight.eval(), bias.eval()))

else:
#訓練完成後保存模型
Saver.save(sess, "/Volumes/MacData/MEGA/pythonwork/ML_study/tensorflow_tutorial/checkpoint_document/LinearRegressionModel")


if __name__ == '__main__':
LinearRegression()

Result

在欲儲存的路徑下會多了四個文件分別如下
Imgur

  • checkpoint文件中,只記載model儲存的位置及檔名
  • 變量數據皆保存在 後綴名為.data-00000-of-00001的文件中
    • 每次更新時會一直往後加1
      • data-00001-of-00002
      • data-00002-of-00003

加載模型

  • 再次訓練之前應先加載模型
  • 加載後會覆蓋graph中使用變量定義的參數,例如:權重(weight),偏置(bias)
  • 與儲存模型一樣須創建一個 加載/儲存的 saver物件,調用restore()方法加載
  • saver.restore(sess,"加載路徑及模型名")

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import tensorflow as tf
import os

def LinearRegression():
with tf.variable_scope("data_preparation"):
X = tf.random_normal([100,1],mean=1.75,stddev=0.5, name="x_data")
y_true = tf.matmul(X,[[0.7]]) + 0.8

with tf.variable_scope("LinearRegression_model_build"):
weight = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name="w") #必須用變量定義才能優化(改變)
bias = tf.Variable(0.0,name="bias")
y_predict = tf.matmul(X,weight) + bias

with tf.variable_scope("loss_calculate"):
loss = tf.reduce_mean(tf.square(y_true - y_predict))

with tf.variable_scope("optimize"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

tf.summary.scalar("Loss",loss)

tf.summary.histogram("Weight",weight)
tf.summary.scalar("Bias",bias)

merged = tf.summary.merge_all()

init_var_op = tf.global_variables_initializer()

# 定義一個 加載/保存 模型的物件
Saver = tf.train.Saver()

with tf.Session() as sess:
sess.run(init_var_op)
print("起始初始化權重:%f, 初始化偏置:%f"%(weight.eval(),bias.eval()))

FileWriter = tf.summary.FileWriter("./summary/",graph=sess.graph)

# 再次訓練之前先加載模型,覆蓋模型中利用變量定義的參數
if os.path.exists("/Volumes/MacData/MEGA/pythonwork/ML_study/tensorflow_tutorial/checkpoint_document/checkpoint"):
Saver.restore(sess,"/Volumes/MacData/MEGA/pythonwork/ML_study/tensorflow_tutorial/checkpoint_document/LinearRegressionModel")
print("加載模型後 權重:%f, 偏置:%f" % (weight.eval(), bias.eval()))

# 從上次訓練結果的地方開始訓練
for i in range(1000):
sess.run(train_op)

summary = sess.run(merged)

FileWriter.add_summary(summary,i)

if i%50 == 0:
print("優化%d次後 權重:%f, 優化偏置:%f" % (i,weight.eval(), bias.eval()))

else:
#訓練完成後保存模型
Saver.save(sess, "/Volumes/MacData/MEGA/pythonwork/ML_study/tensorflow_tutorial/checkpoint_document/LinearRegressionModel")


if __name__ == '__main__':
LinearRegression()

Result

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
起始初始化權重:0.093984, 初始化偏置:0.000000
加載模型後 權重:0.700002, 偏置:0.799997
優化0次後 權重:0.700002, 優化偏置:0.799997
優化50次後 權重:0.700001, 優化偏置:0.799998
優化100次後 權重:0.700001, 優化偏置:0.799999
優化150次後 權重:0.700001, 優化偏置:0.799999
優化200次後 權重:0.700001, 優化偏置:0.799999
優化250次後 權重:0.700001, 優化偏置:0.799999
優化300次後 權重:0.700001, 優化偏置:0.799999
優化350次後 權重:0.700001, 優化偏置:0.799999
優化400次後 權重:0.700000, 優化偏置:0.799999
優化450次後 權重:0.700000, 優化偏置:0.799999
優化500次後 權重:0.700000, 優化偏置:0.799999
優化550次後 權重:0.700000, 優化偏置:0.799999
優化600次後 權重:0.700000, 優化偏置:0.799999
優化650次後 權重:0.700000, 優化偏置:0.799999
優化700次後 權重:0.700000, 優化偏置:0.799999
優化750次後 權重:0.700000, 優化偏置:0.799999
優化800次後 權重:0.700000, 優化偏置:0.799999
優化850次後 權重:0.700000, 優化偏置:0.799999
優化900次後 權重:0.700000, 優化偏置:0.799999
優化950次後 權重:0.700000, 優化偏置:0.799999
  • 可以看到加載後的模型就是上次訓練最後的結果,其又被繼續練,並儲存