線性回歸:w1x1+w2x2+w3x3+......+wnxn+bias(這是一個偏移量),我們采用的算法是:線性回歸,策略是:均方誤差,優化是:梯度下降API,
1.轉准備好實驗的數據:100個數據,每一個有一個特征值,所以形成一個【100,1】的列表,在准備一個目標函數:y=0.8x+0.7那么怎么知道為什么是0.8和0.7呢,這是我們假設的
2.建立一個模型,需要我們隨機生成兩個參數,一個是權重w一個是偏置b , y_predict = x * w + b,需要注意的是這個模型的參數必須要用變量來定義
3.求損失誤差,我們求的是均方誤差,公式是:((y1-y1')^2+(y2-y2')^2+.......+(y100-y100')^2)/100
4.接下來就是利用梯度下降來優化誤差,這個梯度下降是tensorflow里邊自己實現的,我們只需要指定一個學習率就行了
Tensorflow運算的API
矩陣運算:tf.matmul(x,w)
平方運算:tf.square(參數1)
均值運算:tf.reduce_mean(參數1)
梯度下降API: tf.train.GradientDescentOptimizer(learning_rate);這是一個梯度下降優化器,learn_rate一般是method:minimize(loss),返回一個梯度下降的op
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低 def myLineregression(): #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行 x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data") y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了 #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量 #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化 weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣 bias = tf.Variable(0.0,name='b') y_predict = tf.matmul(x,weigth) + bias; #3建立損失函數 loss = tf.reduce_mean(tf.square(y_true - y_predict)) #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op init_op = tf.global_variables_initializer() with tf.Session() as sess: #初始化變量 sess.run(init_op) #打印最先初始化的權重個偏置 print("最先初始化的權重:%f 和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077 和 偏置是:0.000000 # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607 和 偏置是:0.581311 # sess.run(train_op) #循環訓練,運行優化,優化1000次,越多越精確,越接近我們的假設值 for i in range(1000): sess.run(train_op) #打印優化后的權重和偏置 print("第%d次優化后的權重:%f 和 偏置是:%f" % (i,weigth.eval(), bias.eval())) return None if __name__ == "__main__": myLineregression()
.......
那么你可能有一個疑問,為什么weight和bias會一直變化呢,因為他兩是tf.Variable類型的,在Variable()最后一個參數是trainable默認是True,如果你指定他是False的話,weight和bias就不會隨着我們梯度變化來變化了
我們接下來用變量作用域來實現一下:這樣的作用有兩個:第一:使得我們的代碼更加爽目;第二:使得我們后台顯示很流暢,否則可能會有點凌亂
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低 def myLineregression(): with tf.variable_scope("data"): #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行 x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data") y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了 with tf.variable_scope("model"): #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量 #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化 weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣 bias = tf.Variable(0.0,name='b') y_predict = tf.matmul(x,weigth) + bias; with tf.variable_scope("loss"): #3建立損失函數 loss = tf.reduce_mean(tf.square(y_true - y_predict)) with tf.variable_scope("Optimizer"): #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op init_op = tf.global_variables_initializer() with tf.Session() as sess: #在后台可視化觀察圖結構 fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph) #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可 #初始化變量 sess.run(init_op) #打印最先初始化的權重個偏置 print("最先初始化的權重:%f 和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077 和 偏置是:0.000000 # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607 和 偏置是:0.581311 # sess.run(train_op) #循環訓練,運行優化 for i in range(1000): sess.run(train_op) #打印優化后的權重和偏置 print("第%d次優化后的權重:%f 和 偏置是:%f" % (i,weigth.eval(), bias.eval())) return None if __name__ == "__main__": myLineregression()
后台樣式:
但是在大多數的時候我們需要觀察我們變量的變化圖示,這時候我們需要添加變量顯示 ,步驟如下:
添加變量顯示的目的:觀察模型的參數,損失值等變量值的變化
第一步驟:收集變量,有下列三種函數,任選一中
tf.summary.scalar(name="",tensor);name是你需要把他顯示成什么名字的別名,tensor就是你顯示的張量
tf.summary.histogram(name="",tensor);收集高緯度的變量參數
tf.summary.image(name="",tensor);收集輸入圖片張量能顯示圖片
第二步驟:合並變量並寫入到事件文件中,下列函數按步驟來,都要寫!
merged = tf.summary.merge_all() #合並變量,這一步往往寫在會話運行前
summary = sess.run(merged );每次運行的時候都需要運行
FileWrite.add_summary(summary,i);i表示第幾次的值
代碼如下:
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低 def myLineregression(): with tf.variable_scope("data"): #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行 x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data") y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了 with tf.variable_scope("model"): #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量 #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化 weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣 bias = tf.Variable(0.0,name='b') y_predict = tf.matmul(x,weigth) + bias; with tf.variable_scope("loss"): #3建立損失函數 loss = tf.reduce_mean(tf.square(y_true - y_predict)) with tf.variable_scope("Optimizer"): #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op init_op = tf.global_variables_initializer() #收集tensor,為了添加變量顯示 tf.summary.scalar("losser",loss) tf.summary.histogram("weighter",weigth) #合並tensor的op,為了添加變量顯示 merged = tf.summary.merge_all() with tf.Session() as sess: #在后台可視化觀察圖結構 fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph) #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可 #初始化變量 sess.run(init_op) #打印最先初始化的權重個偏置 print("最先初始化的權重:%f 和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077 和 偏置是:0.000000 # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607 和 偏置是:0.581311 # sess.run(train_op) #循環訓練,運行優化 for i in range(1000): sess.run(train_op) #運行合並的tensor,為了添加變量顯示 summary = sess.run(merged) #把合並的op添加到事件文件中 fileWrite.add_summary(summary,i) #打印優化后的權重和偏置 print("第%d次優化后的權重:%f 和 偏置是:%f" % (i,weigth.eval(), bias.eval())) return None if __name__ == "__main__": myLineregression()
有時候我們訓練的數據相當的多,就會出現down 機的現象,這會使得我們之前訓練很久的數據丟失,當你再次訓練的時候又要重新開始,這是很浪費時間的,這時候我們要是有down機前的數據就好了,tensorflow就提供了這種模型保存和加載的功能。讓我們看看怎么實現的吧。
函數:
1.Saver = tf.train.Saver(var_list,max_to_keep=5);var_list表示要保存和還原的變量,他可以作為一個列表或者字典來傳遞,max_to_keep要保留的最近檢查點文件的最大數量,創建新文件時會刪除舊文件,默認為5,如果是0則表示保留所有的檢查點文件
舉個栗子:
Saver.save(sess,"保存檢查點文件的路徑");
在上次訓練結束的位置開始訓練:Saver.restore(sess,"保存檢查點文件的路徑")
你會發現會把上次訓練結束的數據保存到一個叫checkpoint的文件中
import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低 def myLineregression(): with tf.variable_scope("data"): #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行 x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data") y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了 with tf.variable_scope("model"): #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量 #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化 weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣 bias = tf.Variable(0.0,name='b') y_predict = tf.matmul(x,weigth) + bias; with tf.variable_scope("loss"): #3建立損失函數 loss = tf.reduce_mean(tf.square(y_true - y_predict)) with tf.variable_scope("Optimizer"): #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op init_op = tf.global_variables_initializer() #收集tensor,為了添加變量顯示 tf.summary.scalar("losser",loss) tf.summary.histogram("weighter",weigth) #合並tensor的op,為了添加變量顯示 merged = tf.summary.merge_all() #定義一個保存模型的實例,只要是定義一個op就寫在會話前邊 Saver = tf.train.Saver() with tf.Session() as sess: #在后台可視化觀察圖結構 fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph) #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可 #初始化變量 sess.run(init_op) #打印最先初始化的權重個偏置 print("最先初始化的權重:%f 和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077 和 偏置是:0.000000 # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607 和 偏置是:0.581311 # sess.run(train_op) #循環訓練,運行優化 #加載模型,從上次訓練結束的位置開始 if os.path.exists("E:/python/day8/temp/ckpt/textmodel"): Saver.restore(sess,"E:/python/day8/temp/ckpt/textmodel") for i in range(1000): sess.run(train_op) #運行合並的tensor,為了添加變量顯示 summary = sess.run(merged) #把合並的op添加到事件文件中 fileWrite.add_summary(summary,i) #打印優化后的權重和偏置 print("第%d次優化后的權重:%f 和 偏置是:%f" % (i,weigth.eval(), bias.eval())) Saver.save(sess,"E:/python/day8/temp/ckpt/textmodel") return None if __name__ == "__main__": myLineregression()