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時,各損失函數下降曲線