Hike News
Hike News

深度學習-tensorflow基礎-自定義命令行參數

Introduction

可在程序運行前在不修改程序的情況下,去實時修改一些我們定義好可改變的參數

  • 類似於sys.argv的功能
  • tensorflow本身自帶一樣的功能
    • 常應用在設定訓練次數或是學習率
  • 流程:
    1. 首先定義有哪些參數需要在運行時指定
    2. 程序當中獲取定義命令行參數
    3. 替換要改變的參數

定義需要修改的參數(app.flags)

使用tf.app.flags支持應用從命令行接受參數,可以用來指定集群配置等。在tf.app.flags下面有各種定義接受不同參數的類型

  • DEFINE_string(flag_name,default_value,docstring)
  • DEFINE_integer(flag_name,default_value,docstring)
  • DEFINE_boolean(flag_name,default_value,docstring)
  • DEFINE_float(flag_name,default_value,docstring)
    • flag_name:指定參數名字
    • default_value:指定默認值
    • docstring:對此參數的說明

獲取定義命令行參數(app.flags.FLAGS)

使用tf.app.flags.FLAGS獲取定義好的參數

  • 之後可以使用tf.app.flags.FLAGS.參數名字獲取道參數
  • 但每次獲取參數名字太長,可以先把前面賦值給一變量在獲取
    1
    2
    FLAGS = tf.app.flags.FLAGS
    FLAGS.參數名字

範例

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
61
62
63
64
65
66
67
68
69
import tensorflow as tf
import os

# 1. 定義有哪些參數需要在運行時指定
tf.app.flags.DEFINE_integer("max_step",100,"模型訓練的步數")
tf.app.flags.DEFINE_float("learning_rate",0.1,"學習率")
tf.app.flags.DEFINE_string("ckpt_path"," ","模型文件加載路徑")

# 2. 定義獲取上面 定義命令行參數的物件
FLAGS = tf.app.flags.FLAGS

# 3. 替換要改變的參數
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(FLAGS.learning_rate).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,FLAGS.ckpt_path)
print("加載模型後 權重:%f, 偏置:%f" % (weight.eval(), bias.eval()))

#替換學習步數
for i in range(FLAGS.max_step):
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()

執行腳本

1
python commandline.py --max_step=300 --learning_rate=0.05 --ckpt_path=/Volumes/MacData/MEGA/pythonwork/ML_study/tensorflow_tutorial/checkpoint_document/LinearRegressionModel

Result

1
2
3
4
5
6
7
8
起始初始化權重:0.258629, 初始化偏置:0.000000
加載模型後 權重:0.700000, 偏置:0.799999
優化0次後 權重:0.700000, 優化偏置:0.799999
優化50次後 權重:0.700000, 優化偏置:0.799999
優化100次後 權重:0.700000, 優化偏置:0.799999
優化150次後 權重:0.700000, 優化偏置:0.799999
優化200次後 權重:0.700000, 優化偏置:0.799999
優化250次後 權重:0.700000, 優化偏置:0.799999