TensorFlow 學習(四) 線性迴歸模型
阿新 • • 發佈:2018-11-25
線性迴歸演算法的主要優點是它的簡單性,線性迴歸的損失函式是平方損失。一般處理連續性問題,比如預測房價等,在本文中,使用 TensorFlow 訓練一個簡單線性迴歸模型。
線性迴歸模型 y = wx + b:
-
準備好特徵和目標值資料集
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import os # 這裡自定義100個數據集 n = 100 data_x = np.arange(n) data_y = 2.0 * data_x + np.random.RandomState(0).randint(-20, 20, size=(n,)) data = np.stack([data_x, data_y], axis=1)
實際上,一般都是收集好資料集配置成表文件,然後處理,但是我這裡就隨機準備好100個數據集data_x, data_y 特徵
-
np.random.RandomState(0): 偽隨機數生成器
-
randint(-20,20,size=(n,): 生成 -20 到 20 之間,n 個數。
-
-
建立變數 w 和 b
# 建立變數w 和 b w = tf.Variable(0.0, name="weights") b = tf.Variable(0.0, name="bias")
這裡的w 、b 先建立張量變數為浮點數 0.0 ,但是並沒有初始化,後面的執行中,才初始化
-
X 和 Y 佔位符
def inputs(): X = tf.placeholder(tf.float32, name="X") Y = tf.placeholder(tf.float32, name="Y") return X,Y
注意:在這裡X、Y並沒有賦值, tf.placeholder : 為張量插入佔位符,這個張量總是被賦值的
-
推論,建立預測
def inference(X): return X * w + b
線性: y = wx + b
-
計算損失
def loss(X, Y): ''' 通過比較預測值和實際標籤來計算損失。 引數 X: 輸入值 引數 Y: 標籤 返回值 : 返回損失 ''' # 做出預測 Y_predicted = inference(X) return tf.reduce_sum(tf.squared_difference(Y, Y_predicted))/(2*data.shape[0])
其中,這裡的含義:
-
reduce_sum: 計算一個張量各維度元素的和
-
suqared_difference: 返回(Y - Y_predicted) * (Y - Y_predicted) 的平方差
-
data.shape[0] : 資料集張量的形狀,即多少個樣本。
-
-
梯度下降去優化損失過程,指定學習率
# 訓練 def train(loss): learning_rate = 0.0001 return tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
- learning_rate: 學習率
- minimize(loss): 最小優化損失。
- return : 最小梯度下降op
-
執行測試模型
with tf.Session() as sess: # 初始化變數w 和 b. sess.run(tf.global_variables_initializer()) # 得到 X,Y X, Y = inputs() # 返回訓練損失和訓練最小梯度下降op. train_loss = loss(X, Y) train_op = train(train_loss) # 打印出訓練步數和損失,100步 for epoch_num in range(100): loss_value, _ = sess.run([train_loss,train_op], feed_dict={X: data[:,0], Y: data[:,1]}) # 打印出訓練步數和損失 print('epoch %d, loss=%f' %(epoch_num+1, loss_value)) # 儲存 w 和 b 的值 wcoeff, bias = sess.run([w, b])
執行測試結果,可以從測試結果看出損失是越來越低的。 測試結果:
步數 1, 損失:6564.060059 步數 2, 損失:3004.490479 步數 3, 損失:1399.077148 步數 4, 損失:675.013550 步數 5, 損失:348.451233 步數 6, 損失:201.167343 步數 7, 損失:134.740158 步數 8, 損失:104.780640 步數 9, 損失:91.268486 步數 10, 損失:85.174332 步數 11, 損失:82.425758 步數 12, 損失:81.186127 步數 13, 損失:80.627007 步數 14, 損失:80.374840 步數 15, 損失:80.261086 步數 16, 損失:80.209785 步數 17, 損失:80.186630 步數 18, 損失:80.176178 步數 19, 損失:80.171463 步數 20, 損失:80.169312 步數 21, 損失:80.168335 步數 22, 損失:80.167892 步數 23, 損失:80.167671 步數 24, 損失:80.167580 步數 25, 損失:80.167511 步數 26, 損失:80.167473 步數 27, 損失:80.167450 步數 28, 損失:80.167442 步數 29, 損失:80.167412 步數 30, 損失:80.167397 步數 31, 損失:80.167374 步數 32, 損失:80.167366 步數 33, 損失:80.167336 步數 34, 損失:80.167336 步數 35, 損失:80.167313 步數 36, 損失:80.167290 步數 37, 損失:80.167274 步數 38, 損失:80.167252 步數 39, 損失:80.167236 步數 40, 損失:80.167221 步數 41, 損失:80.167198 步數 42, 損失:80.167183 步數 43, 損失:80.167175 步數 44, 損失:80.167152 步數 45, 損失:80.167130 步數 46, 損失:80.167130 步數 47, 損失:80.167107 步數 48, 損失:80.167084 步數 49, 損失:80.167061 步數 50, 損失:80.167046 步數 51, 損失:80.167030 步數 52, 損失:80.167007 步數 53, 損失:80.166985 步數 54, 損失:80.166977 步數 55, 損失:80.166962 步數 56, 損失:80.166939 步數 57, 損失:80.166916 步數 58, 損失:80.166916 步數 59, 損失:80.166893 步數 60, 損失:80.166870 步數 61, 損失:80.166847 步數 62, 損失:80.166832 步數 63, 損失:80.166817 步數 64, 損失:80.166801 步數 65, 損失:80.166779 步數 66, 損失:80.166763 步數 67, 損失:80.166748 步數 68, 損失:80.166725 步數 69, 損失:80.166710 步數 70, 損失:80.166687 步數 71, 損失:80.166672 步數 72, 損失:80.166649 步數 73, 損失:80.166641 步數 74, 損失:80.166618 步數 75, 損失:80.166611 步數 76, 損失:80.166573 步數 77, 損失:80.166573 步數 78, 損失:80.166550 步數 79, 損失:80.166534 步數 80, 損失:80.166512 步數 81, 損失:80.166512 步數 82, 損失:80.166489 步數 83, 損失:80.166473 步數 84, 損失:80.166451 步數 85, 損失:80.166435 步數 86, 損失:80.166412 步數 87, 損失:80.166405 步數 88, 損失:80.166374 步數 89, 損失:80.166374 步數 90, 損失:80.166344 步數 91, 損失:80.166328 步數 92, 損失:80.166313 步數 93, 損失:80.166298 步數 94, 損失:80.166290 步數 95, 損失:80.166260 步數 96, 損失:80.166237 步數 97, 損失:80.166229 步數 98, 損失:80.166206 步數 99, 損失:80.166191 步數 100, 損失:80.166176
-
最後可以畫出模型,形象地描述
Input_values = data[:,0] Labels = data[:,1] Prediction_values = data[:,0] * wcoeff + bias plt.plot(Input_values, Labels, 'ro', label='main') plt.plot(Input_values, Prediction_values, label='Predicted') plt.show()
如下圖: