【機器學習】Tensorflow做線性擬合

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()

顯示可視化的結果,,

【損失函數變化曲線】


【畫預測直線,及其離散點分佈情況】



完整代碼碼雲超鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章