1. 程式人生 > 實用技巧 >12-深度學習-手寫回歸+模型的保存於載入02

12-深度學習-手寫回歸+模型的保存於載入02

線性迴歸原理回顧

  • 找尋目標值和特徵值之間存在的關係,求出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
  • 求出損失函式(誤差)的結果
    • 均方誤差:y是真實值y'是預測值
      • ((y1-y1')^2+(y2-y2')^2+...+(yn-yn')^2)/n
  • 使用梯度下降降低損失(梯度下降不需要手動實現,TensorFlow中有對應的API,只需要指定學習率即可)
  • TensorFlow運算的API
    • 矩陣運算:tf.matmul(a,b)
    • 平方:tf.square(x)
    • 均值:tf.reduce_mean()
  • 梯度下降API
    • 類:tf.train.GradientDescentOptimizer(learning_rate)
      • 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:表示儲存模型的路徑,攜帶模型的名稱(任意名稱)
  • 在會話執行時載入模型:
    • if os.path.exists('./xxx/checkpoint'):
      • saver.restore(session,'path')
  • 模型的載入
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')