12-深度學習-手寫回歸+模型的保存於載入02
阿新 • • 發佈:2020-08-04
線性迴歸原理回顧
- 找尋目標值和特徵值之間存在的關係,求出w和b即可。
- y = (x1w1 + x2w2...+xn*wn)+b
- 損失函式(均方誤差):表示真實值和預測值之間的誤差
- 使用梯度下降將損失函式的誤差值最小即可
實現流程
- 準備最簡單的特徵值和目標值
- y = 0.8*x+1.5,然後我們需要讓手寫的線性迴歸求出w(0.8)和b(1.5)
- 建立模型
- 隨機初始化一個w和b
- 因為模型一開始也不知道w和b應該是什麼,只能隨機初始化一個,然後隨著梯度下降逐步迭代更新w和b
- 然後求出預測值:y_pred = wx+b
- 隨機初始化一個w和b
- 求出損失函式(誤差)的結果
- 均方誤差:y是真實值y'是預測值
- ((y1-y1')^2+(y2-y2')^2+...+(yn-yn')^2)/n
- 均方誤差:y是真實值y'是預測值
- 使用梯度下降降低損失(梯度下降不需要手動實現,TensorFlow中有對應的API,只需要指定學習率即可)
- TensorFlow運算的API
- 矩陣運算:tf.matmul(a,b)
- 平方:tf.square(x)
- 均值:tf.reduce_mean()
- 梯度下降API
- 類:tf.train.GradientDescentOptimizer(learning_rate)
- learning_rate:需要手動指定學習率
- 類:tf.train.GradientDescentOptimizer(learning_rate)
注意:
- 線性迴歸是一個迭代演算法,那麼意味著在每次梯度下降的過程中y=wx+b中的w和b是在不停的變化的逐步在優化這兩個值。因此記住,w和b是需要不斷變化的在梯度下降的過程中!
- 結論:
- 在TensorFlow中隨機初始化的w和b只可以用變數定義不可以用張量,因為,變數可以自身變化,而張量不行!
- 或者說模型的引數只可以用變數定義不可以用張量定義!!!
- tf.Variable(initial_value=None,trainable=True)
- trainable=True表示的含義就是在訓練的過程中變數的值可以跟隨訓練而實時變化!!!
import tensorflow as tf # 第一步:準備資料 # tf.random_normal 返回一個指定形狀的張量 x = tf.random_normal(shape=(100,1),mean=1.5,stddev=0.75) #特徵資料 y_true = tf.matmul(x,[[0.8]])+1.5 # 標籤資料 w=0.8,b=1.5 # 第二步:建立模型,隨機初始化一個w和b weight = tf.Variable(tf.random_normal(shape=(1,1),mean=1.2,stddev=0.5)) b = tf.Variable(2.5) # 預測結果 y_pred = tf.matmul(x,weight)+b # 第三步:損失函式就是均方誤差 loss = tf.reduce_mean(tf.square(y_true - y_pred)) # 第四步.梯度下降優化損失 train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss) # 定義的變數進行顯示初始化 init_op = tf.global_variables_initializer() with tf.Session() as s: s.run(init_op) # 先執行變數的初始化操作 print('隨機初始化的w=%f,b=%f'%(weight.eval(),s.run(b))) for i in range(1,401):# 固定迭代的次數 s.run(train_op) if i%20 == 0: print('第%d次優化後的w=%f,b=%f'%(i,weight.eval(),b.eval())) 隨機初始化的w=0.816529,b=2.500000 第20次優化後的w=0.572955,b=1.896295 第40次優化後的w=0.680251,b=1.720152 第60次優化後的w=0.734756,b=1.615458 第80次優化後的w=0.764612,b=1.561906 第100次優化後的w=0.780714,b=1.533197 第120次優化後的w=0.789753,b=1.517574 第140次優化後的w=0.794484,b=1.509686 第160次優化後的w=0.797118,b=1.505182 第180次優化後的w=0.798350,b=1.502849 第200次優化後的w=0.799147,b=1.501556 第220次優化後的w=0.799511,b=1.500829 第240次優化後的w=0.799743,b=1.500452 第260次優化後的w=0.799859,b=1.500251 第280次優化後的w=0.799925,b=1.500136 第300次優化後的w=0.799960,b=1.500069 第320次優化後的w=0.799978,b=1.500037 第340次優化後的w=0.799988,b=1.500021 第360次優化後的w=0.799994,b=1.500011 第380次優化後的w=0.799996,b=1.500006 第400次優化後的w=0.799998,b=1.500003
模型儲存與載入
程式碼報錯(NotFindError),問題在於模型載入的路徑或者在程式碼頭部加上tf.reset_default_graph()
- 儲存的其實就是w和b
- 定義saver的op
- saver = tf.train.Saver()
- 在會話中執行儲存函式:
- saver.save(session,'path')
- path:表示儲存模型的路徑,攜帶模型的名稱(任意名稱)
- saver.save(session,'path')
- 在會話執行時載入模型:
- if os.path.exists('./xxx/checkpoint'):
- saver.restore(session,'path')
- if os.path.exists('./xxx/checkpoint'):
- 模型的載入
import os tf.reset_default_graph() # 如果載入儲存好的模型時出現notfinderror就加上該行程式碼 # 第一步:準備資料 x = tf.random_normal(shape=(100,1),mean=1.5,stddev=0.75) # 特徵資料 y_true = tf.matmul(x,[[0.8]])+1.5 # 標籤資料 w=0.8,b=1.5 # 第二步:建立模型,隨機初始化一個w和b weight = tf.Variable(tf.random_normal(shape=(1,1),mean=1.2,stddev=0.5),name='w') b = tf.Variable(2.5,name='b') # 預測結果 y_pred = tf.matmul(x,weight)+b # 第三步:損失函式就出均方誤差 loss = tf.reduce_mean(tf.square(y_true-y_pred)) # 第四步.梯度下降優化損失 train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss) # 定義的變數進行初始化 init_op = tf.global_variables_initializer() # 儲存模型的op saver = tf.train.Saver() with tf.Session() as s: s.run(init_op) # 先執行變數的初始化操作 if os.path.exists('./imgs/checkpoint'):# 載入模型 print('模型已經載入讀取完畢') saver.restore(s,'./imgs/model') w = s.run('w:0') b = s.run('b:0') print(w,b) # 就是從儲存好的模型檔案中讀取出來的兩個值 else: # 儲存模型 print('隨機初始化的w=%f,b=%f'%(weight.eval(),s.run(b))) for i in range(1,401):# 固定迭代的次數 s.run(train_op) if i%20 == 0: print('第%d次優化後的w=%f,b=%f'%(i,weight.eval(),b.eval())) saver.save(s,'./imgs/model')