Tensorflow做線性擬合,有點大炮打蒼蠅的趕腳。不過測試一下,熟悉熟悉Tensorflow也何嘗不可
Tensorflow構建模型一般分爲一下步驟
1. 設置權重(W)及偏執(b)
#創建變量
#tf.random_normal([1])返回一個符合正太分佈的隨機數
W=tf.Variable(tf.random_normal([1],name='weight')) # 權重,由於線性擬合是 一維且線性,在此權值設置一個即可
b=tf.Variable(tf.random_normal([1],name='bias')) # 偏執參數是必須的,作爲整體調整的參數
2. 設置佔位符(也可以當做是輸入輸出通道,主要是參數類型以及矩陣維度)
X = tf.placeholder(tf.float32,[None,1]) #指的是輸入
Y = tf.placeholder(tf.float32,[None,1]) #指的是輸出
[None,1]意思是:n行一列的矩陣,例如:[[1],[2],[3],[4]]
3. 定義損失函數(代價函數)
loss = tf.reduce_sum(tf.pow(tf.multiply(W,X) + b - Y,2.0))
損失函數主要爲優化目標服務,也就是【真實情況-輸出情況平方求和】,
4. 定義優化器
optimizer = tf.train.AdamOptimizer(1).minimize(loss)
優化器可以理解爲優化到目標的方式,優化器有很多種,目的都是一樣的,既【是的損失函數最小、或者可以說,輸出結果儘可能等於真實結果】
5. 開始訓練
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(200): #一千次迭代
sess.run(optimizer,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)})
創建session,初始化,迭代訓練,,其具體含義日後會有詳解,此處不做詳解
完整代碼如下:
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
#生成模擬數據,進行測試
x = np.array(np.arange(100) ,dtype=np.float32)
y = np.array(np.arange(100) ,dtype=np.float32)#此時X和Y其實是相等的,後面加入隨機值,儘可能真實模擬實際情況
y +=(np.random.random_sample(100) * 20)# *20指的是,上波動10
y -=20 #下降20,,,y = x+b --> y = x - 10
print(y[:20])#查看前20列
#設置權重 創建變量
#tf.random_normal([1])返回一個符合正太分佈的隨機數
W=tf.Variable(tf.random_normal([1],name='weight')) # 權重,由於線性擬合是 一維且線性,在此權值設置一個即可
b=tf.Variable(tf.random_normal([1],name='bias')) # 偏執參數是必須的,作爲整體調整的參數
#添加佔位符
X = tf.placeholder(tf.float32,[None,1]) #指的是輸入
Y = tf.placeholder(tf.float32,[None,1]) #指的是輸出
#構造損失函數
loss = tf.reduce_sum(tf.pow(tf.multiply(W,X) + b - Y,2.0)) #此處對所有的y-kx-b進行平方求和
#添加優化器
optimizer = tf.train.AdamOptimizer(1).minimize(loss)
#注:遞歸下降分析法,對於輸入參數需要歸一化,否則會出現訓練異常
# optimizer = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#開始訓練
save_step_loss = {"step":[],"loss":[]}# 保存step和loss用於可視化操作
line_k = 0 #保存k
line_b = 0 #保存b
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(200): #一千次迭代
sess.run(optimizer,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)})
print("step:",step,
"loss: ",sess.run(loss,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)}),
"W:",sess.run(W),
"b:",sess.run(b))
save_step_loss["step"].append(step)
save_step_loss["loss"].append(sess.run(loss,feed_dict={X:x.reshape(-1,1),Y:y.reshape(-1,1)}))
line_k = sess.run(W)
line_b = sess.run(b)
#畫圖損失函數變化曲線
plt.plot(save_step_loss["step"],save_step_loss["loss"])
plt.show()
#畫預測直線,及其離散點分佈情況
#plt.scatter(x,y,5,c="r")
#plt.plot([0,100],[0 * line_k + line_b , 100 * line_k + line_b])
#plt.show()
顯示可視化的結果,,
【損失函數變化曲線】
【畫預測直線,及其離散點分佈情況】