讀書筆記:TensorFlow機器學習實戰指南

Frank He 3/10/2018

約定數據源用橢圓形,數據池用方形,函數用同心圓,變量用圓形,loss用菱形,計算流用實線,控制流用虛線

一、一個簡單的例子:線性回歸

1.模型

Model

圖中淺綠色的部分就是要訓練的模型,這個例子中為y=Ax+b的線性模型

2.TensorFlow的Code模板

  • 加載庫和數據集
  import matplotlib.pyplot as plt
  import numpy as np
  import tensorflow as tf
  from tensorflow.python.framework import ops
  ops.reset_default_graph()
  sess=tf.Session()
  …………
  • 定義節點(數據源,數據池,變量)
    注意變量需要初始化,比如:
  width=np.array([x[3] for x in iris.data])
  length=np.array([x[0] for x in iris.data])
  x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一維列向量,此處不能定義為1*1矩陣
  y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
  A=tf.Variable(tf.random_normal(shape=[1,1]))#正態隨機數初始化A和b
  b=tf.Variable(tf.random_normal(shape=[1,1]))
  • 構建模型(線性、非線性)
  • 選取損失函數(L1,L2,Psuedo-Huber,Hinge,Cross-Entroy)
  • 初始化任務
    init=tf.global_variables_initializer()
    sess.run(init)
  • 定義訓練步驟
    rate=0.05 #rate可以選
    GDO=tf.train.GradientDescentOptimizer(rate) #也可以用其他優化器
    TrainStep=GDO.minimize(loss)
  • 開始訓練
    for i in range(100):
    num=np.random.choice(len(width),size=BatchSize)
    x0_rand=np.transpose([width[num]])
    y0_rand=np.transpose([length[num]])
    sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})

注意一下sess.run(),只有TrainStep和Loss的sess.run()需要feed

  • 取回訓練結果并評估
    完整代碼如下:
    import matplotlib.pyplot as plt
    import numpy as np
    import tensorflow as tf
    from sklearn import datasets
    from tensorflow.python.framework import ops
    ops.reset_default_graph()
    sess=tf.Session()
    iris=datasets.load_iris()

    width=np.array([x[3] for x in iris.data])
    length=np.array([x[0] for x in iris.data])
    x0=tf.placeholder(shape=[None,1],dtype=tf.float32)#x0和y0都是一維列向量,此處不能定義為1*1矩陣
    y0=tf.placeholder(shape=[None,1],dtype=tf.float32)
    A=tf.Variable(tf.random_normal(shape=[1,1]))#正態隨機數初始化A和b
    b=tf.Variable(tf.random_normal(shape=[1,1]))

    y=tf.add(tf.matmul(x0,A),b)#模型是y=Ax+b
    loss=tf.reduce_mean(tf.square(y-y0))#誤差用殘差平方和計量

    init=tf.global_variables_initializer()
    sess.run(init)


    rate=0.05
    GDO=tf.train.GradientDescentOptimizer(rate)
    TrainStep=GDO.minimize(loss)

    losslist=[]
    BatchSize=25
    for i in range(100):
    num=np.random.choice(len(width),size=BatchSize)#在0~len(width)之間隨機采樣BatchSize個數據
    x0_rand=np.transpose([width[num]])#標量經過轉置變為一維列向量
    y0_rand=np.transpose([length[num]])
    sess.run(TrainStep,feed_dict={x0:x0_rand,y0:y0_rand})#投喂訓練
    TempLoss=sess.run(loss,feed_dict={x0:x0_rand,y0:y0_rand})
    losslist.append(TempLoss)
    if((i+1)%25==0):
        print('Step #'+str(i+1)+'   '+str(TempLoss))


    [slope]=sess.run(A)
    [intercept]=sess.run(b)
    bestfit=[]
    for i in width:
    bestfit.append(slope*i+intercept)
    plt.plot(width,length,'o',label="OriginalData")
    plt.plot(width,bestfit,'r-',label="BestLine")
    plt.show()
    plt.plot(losslist,'k-')
    plt.show()

擬合效果如圖:


BestLine

偏差隨訓練次數增加而下降:


Loss

3.討論一下損失函數的選擇

  • 學習速率為0.05時,各損失函數下降曲線比較


    學習速率為0.05時,各損失函數下降曲線

    其中藍色為殘差平方和,綠色為絕對差和,橙色為垂直距離和,紅色為交叉熵

  • 學習速率為0.4時,各損失函數下降曲線比較


    學習速率為0.4時,各損失函數下降曲線

二、非線性回歸

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容