TensorFlow筆記(2)——利用TensorFlow訓練一個最簡單的一元線性模型
這是一次使用 ofollow,noindex">《TensorFlow筆記(1)——TensorFlow中的相關基本概念》 中學習到的知識進行機器學習的實驗,一來是為了理解機器學習大概是什麼樣的,另一方面也算是將之前學習到的一些知識活學活用。 本次實現的環境為:
- macOS Mojave 10.14.1
- python 3.7.0(pyenv)
- Tensorflow 1.12.0
- numpy 1.15.4
簡單介紹下機器學習是什麼
機器學習和人類學習的過程:

如果覺得上圖不好理解的話就再舉一個栗子:
假設你有個女朋友,她特別愛美。為了互相瞭解,你們每週末都會一起約會吃飯;已經約會有8周了,每週吃飯你女朋友都會比約定時間晚到10分鐘-30分鐘,所以你每次約會也會比約定時間晚10-30分鐘,並且你總結了一個規律(如果約會前打電話她說從家走了,那麼基本都是晚到30分鐘左右,如果她說就快到了,那麼基本會晚到10分鐘),不過你女朋友後來遲到的時間從10、30分鐘變成了15、45分鐘,你也自己調整了約定時間後到達的時間。
根據上述栗子:chestnut:我們來類比下:
機器學習方法是計算機利用已有的資料(8次約會的經驗),得出了某種模型(遲到的規律),並利用此模型預測未來(是否遲到)的一種方法。
Tensorflow的基礎知識
基礎知識在這裡我就不多說了,詳見 《TensorFlow筆記(1)——TensorFlow中的相關基本概念》
構建一個線性模型
先來說明下我們需要構建的這個簡單的線性模型是什麼東西:
假設我們有個線性模型(一元一次函式): y=0.1x+0.2
,我們知道這個線性模型長啥樣,就是一條直線嘛,但是我現在想讓機器也知道這條直線,該怎麼做?還記得上面說的那個栗子嗎,我們可以提供一系列類似 (x,y)
的資料,然後帶入 y=k*x_data+b
,求出k和b的值之後,機器也就知道了這個線性模型長啥樣了。
下面來更數學化一點的介紹:
給定一個大小為n的點集 ={( 1, 1),( 2, 2),…( , )} ,
線性模型的目標就是尋找一組 K 和 構成的直線 = K + ,
使得所有點的損失值 = 越小越好,因為 越小就表明預測值與真實值的差距越小。
因為如果我們找到了這麼一組 K 和 ,我們就可以預測某一個 的 值。
這裡我想多說幾句,線性模型在實際應用中不一定能很好的預測 的值,這是因為實際的資料分佈也許不是線性的,可能是二次、三次、圓形甚至無規則,所以判斷什麼時候能用線性模型很重要。只是因為我們在這裡知道了這是線性模型才這麼做的,真正構建模型的時候是需要相應的方法的。
程式碼解讀
話不多少,分段來看程式碼:
- 匯入相應的python包,這裡我們使用了tensorflow和numpy
# tensorflow簡單示例 import tensorflow as tf import numpy as np 複製程式碼
- 使用numpy生成1000個隨機點,關於numpy的使用,可以檢視我的numpy系列筆記
# 使用numpy生成1000個隨機點 x_data = np.random.rand(1000) y_data = x_data*0.1+0.2# 真實值 複製程式碼
- 構造一個線性模型
# 構造一個線性模型 b = tf.Variable(0.) k = tf.Variable(0.) y = k*x_data+b# 預測值 複製程式碼
- 定義損失函式,用於判斷y 真實值 和y 預測值 之間的差距
# 二次代價函式(損失函式) loss = tf.reduce_mean(tf.square(y_data-y)) 複製程式碼
依次來解釋下每個部分的含義:
y_data-y tf.square tf.reduce_mean
所以上面這三個函式合在一起就是計算loss值。
- 使用
GradientDescentOptimizer
類建立一個優化器來優化模型,減少loss
值,這個類的原理是梯度下降,至於什麼是梯度下降,可以參考其他教程,日後會介紹,目前只要知道這麼寫就好了。
# 定義一個梯度下降法來進行訓練的優化器 optimizer = tf.train.GradientDescentOptimizer(0.2) 複製程式碼
- 使用優化器來減少
loss
值,minimize
是優化器的一個方法
# 定義一個最小化代價函式 train = optimizer.minimize(loss) 複製程式碼
- 初始化上面的所有變數
# 初始化變數 init = tf.global_variables_initializer() 複製程式碼
- 利用
Session
訓練我們的模型
with tf.Session() as sess:# 定義會話上下文 sess.run(init)# 執行初始化操作 for step in range(3000):# 訓練3000次 sess.run(train)# 執行訓練操作 if step % 20 == 0:# 每隔20步 print(step, sess.run([k, b]))# 打印出k和b的值 複製程式碼
至此,一個最簡單的線性模型也就完成了。下面是所有程式碼:
# tensorflow簡單示例 import tensorflow as tf import numpy as np # 使用numpy生成1000個隨機點 x_data = np.random.rand(1000) y_data = x_data*0.1+0.2# 真實值 # 構造一個線性模型 b = tf.Variable(0.) k = tf.Variable(0.) y = k*x_data+b# 預測值 # 二次代價函式(損失函式) loss = tf.reduce_mean(tf.square(y_data-y)) # 定義一個梯度下降法來進行訓練的優化器 optimizer = tf.train.GradientDescentOptimizer(0.2) # 定義一個最小化代價函式 train = optimizer.minimize(loss) # 初始化變數 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for step in range(3000): sess.run(train) if step % 20 == 0: print(step, sess.run([k, b])) 複製程式碼
執行結果的部分截圖:


從上面兩張圖我們可以明顯的看出來,在訓練到第2980次的時候,k的結果已經非常非常接近0.1,b也非常非常接近0.2了,由此可以看出,這個模型還是較為正確的。