1)構建模型
|_> y = w1x1 + w2x2 + …… + wnxn + b
2)構造損失函數
|_> 均方偏差
3)優化損失
|_> 梯度降低html
準備真實數據
100樣本
x 特徵值 形狀 (100, 1) 100行1列
y_true 目標值 (100, 1)
y_true = 0.8x + 0.7 假設特徵值和目標值直接的線性關係
假定x 和 y 之間的關係 知足
y = kx + b
k ≈ 0.8 b ≈ 0.7
流程分析:
(100, 1) * (1, 1) = (100, 1)
y_predict = x * weights(1, 1) + bias(1, 1)
1)構建模型: 矩陣:matmul
y_predict = tf.matmul(x, weights) + bias
2)構造損失函數: 平均:reduce_mean 平方: square
error = tf.reduce_mean(tf.square(y_predict - y_true))
3)優化損失: 梯度降低的評估器GradientDescentOptimizer
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
5 學習率的設置、步數的設置與梯度爆炸java
demo:瀏覽器
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression(): """ 自實現一個線性迴歸 :return: """ # 1)準備數據 with tf.variable_scope(name_or_scope='prepare_data'): X = tf.random_normal(shape=[100, 1], mean=2) y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定義了一個一行一列 # 2)構造模型 # 定義模型參數 用 變量 with tf.variable_scope("create_model"): weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 隨機產生一個一行一列 bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 隨機產生一個一行一列 y_predict = tf.matmul(X, weights) + bias # 3)構造損失函數: 均方偏差 with tf.variable_scope("loss_function"): error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)優化損失 with tf.variable_scope("optimizer"): optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 默認0.01 # 顯式地初始化變量 init = tf.global_variables_initializer() with tf.Session() as sess: # 初始化變量 sess.run(init) # 查看初始化模型參數以後的值 print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 開始訓練 for i in range(10): sess.run(optimizer) print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) if __name__ == "__main__": linear_regression()
通過上面的訓練咱們能夠發現,在學習率不變的狀況下,迭代的次數越多,則效果越好。同理在迭代次數必定的狀況下,學習率越高效果越好,但也是有必定限制的。app
增長TensorBoard顯示dom
1)建立事件文件
2)收集變量
3)合併變量
4)每次迭代運行一次合併變量
5)每次迭代將summary對象寫入事件文件函數
變量dashboard顯示demo:學習
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression(): """ 自實現一個線性迴歸 :return: """ # 第一步: # 1)準備數據 X = tf.random_normal(shape=[100, 1], mean=2) y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定義了一個一行一列 # 2)構造模型 # 定義模型參數 用 變量 # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True) # 隨機產生一個一行一列 bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 隨機產生一個一行一列 y_predict = tf.matmul(X, weights) + bias # 3)構造損失函數: 均方偏差 error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)優化損失 optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 顯式地初始化變量 init = tf.global_variables_initializer() # 第二步:收集變量 tf.summary.scalar("error", error) tf.summary.histogram("weights", weights) tf.summary.histogram("bias", bias) # 第三步:合併變量 merged = tf.summary.merge_all() with tf.Session() as sess: # 初始化變量 sess.run(init) # 1_建立事件文件 file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型參數以後的值 print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 開始訓練 for i in range(100): sess.run(optimizer) print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 運行合併變量操做 summary = sess.run(merged) # 將每次迭代後的變量寫入事件文件 file_writer.add_summary(summary, i) # i是迭代次數 if __name__ == "__main__": linear_regression()
Tensorboard的可視化:http://ftl2018:6006/#graphs&run=.(火狐瀏覽器)優化
增長命名空間demo命令行
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression(): """ 自實現一個線性迴歸 :return: """ # 第一步: # 1)準備數據 with tf.variable_scope(name_or_scope='prepare_data'): X = tf.random_normal(shape=[100, 1], mean=2, name='feature') y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定義了一個一行一列 # 2)構造模型 # 定義模型參數 用 變量 # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True with tf.variable_scope("create_model"): weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights') # 隨機產生一個一行一列 bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias') # 隨機產生一個一行一列 y_predict = tf.matmul(X, weights) + bias # 3)構造損失函數: 均方偏差 with tf.variable_scope("loss_function"): error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)優化損失 with tf.variable_scope("optimizer"): optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 顯式地初始化變量 init = tf.global_variables_initializer() # 第二步:收集變量 tf.summary.scalar("error", error) tf.summary.histogram("weights", weights) tf.summary.histogram("bias", bias) # 第三步:合併變量 merged = tf.summary.merge_all() with tf.Session() as sess: # 初始化變量 sess.run(init) # 1_建立事件文件 file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型參數以後的值 print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 開始訓練 for i in range(100): sess.run(optimizer) print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 運行合併變量操做 summary = sess.run(merged) # 將每次迭代後的變量寫入事件文件 file_writer.add_summary(summary, i) # i是迭代次數 if __name__ == "__main__": linear_regression()
saver = tf.train.Saver(var_list=None,max_to_keep=5)
1)實例化Saver
2)保存
saver.save(sess, path)
3)加載
saver.restore(sess, path)scala
模型保存(須要提早準備好目錄)與加載demo
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression(): """ 自實現一個線性迴歸 :return: """ # 第一步: # 1)準備數據 with tf.variable_scope(name_or_scope='prepare_data'): X = tf.random_normal(shape=[100, 1], mean=2, name='feature') y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定義了一個一行一列 # 2)構造模型 # 定義模型參數 用 變量 # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True with tf.variable_scope("create_model"): weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights') # 隨機產生一個一行一列 bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias') # 隨機產生一個一行一列 y_predict = tf.matmul(X, weights) + bias # 3)構造損失函數: 均方偏差 with tf.variable_scope("loss_function"): error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)優化損失 with tf.variable_scope("optimizer"): optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 顯式地初始化變量 init = tf.global_variables_initializer() # 第二步:收集變量 tf.summary.scalar("error", error) tf.summary.histogram("weights", weights) tf.summary.histogram("bias", bias) # 第三步:合併變量 merged = tf.summary.merge_all() # 保存模型:建立Saver對象 saver = tf.train.Saver(max_to_keep=5) with tf.Session() as sess: # 初始化變量 sess.run(init) # 1_建立事件文件 file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型參數以後的值 print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 開始訓練 for i in range(100): sess.run(optimizer) print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval())) # 運行合併變量操做 summary = sess.run(merged) # 將每次迭代後的變量寫入事件文件 file_writer.add_summary(summary, i) # i是迭代次數 # 保存模型(保存模型參數,而參數在會話中)--》路徑須要先建立好 if i % 10 == 0: saver.save(sess, "./tmp/my_linear.ckpt") # # 加載模型 # if os.path.exists("./tmp/model/checkpoint"): # saver.restore(sess, "./tmp/model/my_linear.ckpt") if __name__ == "__main__": linear_regression()
命令行參數使用
1)tf.app.flags
tf.app.flags.DEFINE_integer("max_step", 0, "訓練模型的步數")
tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
2)FLAGS = tf.app.flags.FLAGS
經過FLAGS.max_step調用命令行中傳過來的參數
三、經過tf.app.run()啓動main(argv)函數
具體調用:
命令行demo
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 1)定義命令行參數 tf.app.flags.DEFINE_integer("max_step", 100, "訓練模型的步數") tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路徑+模型名字") # 2)簡化變量名 FLAGS = tf.app.flags.FLAGS def command_demo(): """ 命令行參數演示 :return: """ print("max_step:\n", FLAGS.max_step) print("model_dir:\n", FLAGS.model_dir) return None def main(argv): print("code start", argv) return None if __name__ == "__main__": # 命令行參數演示 # command_demo() tf.app.run()