機器學習實戰:TensorFlow構建線性迴歸模型

在本章中,開始使用簡單模型:線性迴歸來探索 TensorFlow 編程。基於這個例子,我將介紹一些代碼基礎知識,以及,如何調用學習過程中的各種重要組件,如函數函數或算法梯度下降。
變量之間的關係模型

線性迴歸是一種用於衡量變量之間關係的統計技術。它的有趣之處在於實現它的算法在概念上不復雜,並且還可以適應各種各樣的情況。由於這些原因,我發現用線性迴歸的例子開始深入研究 TensorFlow 很有意思。

請記住,在兩個變量(簡單迴歸)和兩個以上變量(多元迴歸)的情況下,線性迴歸擬合因變量和自變量之間的關係xi和隨機項b。

在本節中,我將創建一個簡單的示例來解釋 TensorFlow 如何工作,假設我們的數據模型對應簡單的線性迴歸y = W * x + b。爲此,我使用一個簡單的 Python 程序在二維空間中創建數據,然後我會要求 TensorFlow 在這些點上尋找最適合的直線。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

#用TensorFlow構建線性迴歸模型
#隨機生成一千個數據點,數據點的分佈圍繞y=0.1x+0.3直線,然後用Tensorflow去建立一個迴歸模型,再找出什麼樣的w和b能夠擬合數據
num_points = 1000;
vectors_set = []
for i in range(num_points):
    x1 = np.random.normal(0.0,0.55)#高斯隨機,以0爲均值,0.55是標準差
    y1 = x1 * 0.1 + 0.3 +np.random.normal(0.0,0.03)#高斯隨機,以0爲均值,0.03爲標準差
    vectors_set.append([x1,y1])

#數據集
x_data = [v[0] for v in vectors_set]
y_data = [v[1] for v in vectors_set]

plt.scatter(x_data,y_data,c='r')
plt.show()

#有了數據集後開始建立模型
W = tf.Variable(tf.random_uniform([1],-1.0,1.0),name='W')#隨機初始化w,生成一維的矩陣,取值[-11]之間的隨機數,產生的值是均勻分佈的
b = tf.Variable(tf.zeros([1]),name='b')#初始化一個一維的b爲0的矩陣
y = W *x_data + b

#損失
loss = tf.reduce_mean(tf.square(y-y_data),name='loss')
'''
tensorflow中有一類在tensor的某一維度上求值的函數。如:
求最大值tf.reduce_max(input_tensor, reduction_indices=None, keep_dims=False, name=None)
求平均值tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
參數1--input_tensor:待求值的tensor。
參數2--reduction_indices:在哪一維上求解
'''

#適用梯度下降來優化參數,裏面的參數是步長(學習率)
optimizer = tf.train.GradientDescentOptimizer(0.5)
#tensorflow提供了多種optimizer,典型梯度下降GradientDescent和Adagrad、Momentum、Nestrov、Adam等變種
#tf.train.GradientDescentOptimizer()使用隨機梯度下降算法,使參數沿着 梯度的反方向,即總損失減小的方向移動,實現更新參數.裏面的參數是步長(學習率)

#訓練的過程就是最小化這個誤差值
train = optimizer.minimize(loss,name='train')

see = tf.Session()
#程序通過使用Session()創建會話來與 Tensorflow 庫交互;只有在我們調用run()方法時纔會創建這個會話,這就是它真正開始運行指定代碼的時候。

init = tf.global_variables_initializer()#變量必須先初始化後纔可使用
# 要在訓練開始前一次性初始化所有可訓練變量,請調用 tf.global_variables_initializer()。此函數會返回一個操作,負責初始化 tf.GraphKeys.GLOBAL_VARIABLES 集合中的所有變量
see.run(init)

#看一下初始化時候的W和b分別是多少
print("初始化:","W = ", see.run(W),"b = ", see.run(b),"loss = ", see.run(loss))

#執行三十次的訓練,並且顯示每次訓練後的w,b和loss值
#並且展示初始時的網絡模型以及每訓練一次更新後的模型
for step in range(30):
    see.run(train)
    print("第",step,"次訓練:" ,"W = ", see.run(W), "b = ", see.run(b), "loss = ", see.run(loss))
    plt.plot(x_data, y_data, 'ro')
    plt.plot(x_data, see.run(W) * x_data + see.run(b))
    plt.xlabel('x')
    plt.xlim(-2, 2)
    plt.ylim(0.1, 0.6)
    plt.ylabel('y')
    plt.legend()
    plt.show()

print("最終訓練出的模型w和b:" , see.run(W),see.run(b))
plt.scatter(x_data,y_data,c='r')
plt.plot(x_data,see.run(W)*x_data+see.run(b))
plt.show()



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