TensorFlow筆記(2)——利用TensorFlow訓練一個最簡單的一元線性模型

前言

這是一次使用《TensorFlow筆記(1)——TensorFlow中的相關基本概念》中學習到的知識進行機器學習的實驗,一來是爲了理解機器學習大概是什麼樣的,另外一方面也算是將以前學習到的一些知識活學活用。 本次實現的環境爲:html

  • macOS Mojave 10.14.1
  • python 3.7.0(pyenv)
  • Tensorflow 1.12.0
  • numpy 1.15.4

簡單介紹下機器學習是什麼

機器學習和人類學習的過程:python

image

若是以爲上圖很差理解的話就再舉一個栗子:dom

假設你有個女友,她特別愛漂亮。爲了互相瞭解,大家每週末都會一塊兒約會吃飯;已經約會有8周了,每週吃飯你女友都會比約定時間晚到10分鐘-30分鐘,因此你每次約會也會比約定時間晚10-30分鐘,而且你總結了一個規律(若是約會前打電話她說從家走了,那麼基本都是晚到30分鐘左右,若是她說就快到了,那麼基本會晚到10分鐘),不過你女友後來遲到的時間從十、30分鐘變成了1五、45分鐘,你也本身調整了約定時間後到達的時間。機器學習

根據上述栗子🌰咱們來類比下:函數

機器學習方法是計算機利用已有的數據(8次約會的經驗),得出了某種模型(遲到的規律),並利用此模型預測將來(是否遲到)的一種方法。學習

Tensorflow的基礎知識

基礎知識在這裏我就很少說了,詳見《TensorFlow筆記(1)——TensorFlow中的相關基本概念》優化

構建一個線性模型

先來講明下咱們須要構建的這個簡單的線性模型是什麼東西:spa

假設咱們有個線性模型(一元一次函數):y=0.1x+0.2,咱們知道這個線性模型長啥樣,就是一條直線嘛,可是我如今想讓機器也知道這條直線,該怎麼作?還記得上面說的那個栗子嗎,咱們能夠提供一系列相似(x,y)的數據,而後帶入y=k*x_data+b,求出k和b的值以後,機器也就知道了這個線性模型長啥樣了。code

下面來更數學化一點的介紹:cdn

給定一個大小爲n的點集 𝑆={(𝑥1,𝑦1),(𝑥2,𝑦2),…(𝑥𝑛,𝑦𝑛)} ,

線性模型的目標就是尋找一組 K 和 𝑏 構成的直線 𝑦=K𝑥+𝑏 ,

使得全部點的損失值 loss=\sum_{i}^{n}(K𝑥_𝑖+𝑏−𝑦_𝑖)^2越小越好,由於𝑙𝑜𝑠𝑠越小就代表預測值與真實值的差距越小。

由於若是咱們找到了這麼一組 K 和 𝑏 ,咱們就能夠預測某一個 𝑥_𝑚𝑦_𝑚 值。

這裏我想多說幾句,線性模型在實際應用中不必定能很好的預測 𝑦_𝑚 的值,這是由於實際的數據分佈也許不是線性的,多是二次、三次、圓形甚至無規則,因此判斷何時能用線性模型很重要。只是由於咱們在這裏知道了這是線性模型才這麼作的,真正構建模型的時候是須要相應的方法的。

代碼解讀

話很少少,分段來看代碼:

  1. 導入相應的python包,這裏咱們使用了tensorflow和numpy
# tensorflow簡單示例
import tensorflow as tf
import numpy as np
複製代碼
  1. 使用numpy生成1000個隨機點,關於numpy的使用,能夠查看個人numpy系列筆記
# 使用numpy生成1000個隨機點
x_data = np.random.rand(1000)
y_data = x_data*0.1+0.2         # 真實值
複製代碼
  1. 構造一個線性模型
# 構造一個線性模型
b = tf.Variable(0.)
k = tf.Variable(0.)
y = k*x_data+b                  # 預測值
複製代碼
  1. 定義損失函數,用於判斷y 真實值和y 預測值之間的差距
# 二次代價函數(損失函數)
loss = tf.reduce_mean(tf.square(y_data-y))
複製代碼

依次來解釋下每一個部分的含義:

  • y_data-y:這個地方沒啥好解釋的,就是真實值和預測值之間的差
  • tf.square:這個函數的做用就是求平方
  • tf.reduce_mean: 函數用於計算張量tensor沿着指定的數軸(tensor的某一維度)上的的平均值,主要用做降維或者計算tensor(圖像)的平均值。

因此上面這三個函數合在一塊兒就是計算loss值。

  1. 使用GradientDescentOptimizer類建立一個優化器來優化模型,減小loss值,這個類的原理是梯度降低,至於什麼是梯度降低,能夠參考其餘教程,往後會介紹,目前只要知道這麼寫就行了。
# 定義一個梯度降低法來進行訓練的優化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
複製代碼
  1. 使用優化器來減小loss值,minimize是優化器的一個方法
# 定義一個最小化代價函數
train = optimizer.minimize(loss)
複製代碼
  1. 初始化上面的全部變量
# 初始化變量
init = tf.global_variables_initializer()
複製代碼
  1. 利用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]))
複製代碼

運行結果的部分截圖:

訓練0-240次的結果

訓練2700-2980次的結果

從上面兩張圖咱們能夠明顯的看出來,在訓練到第2980次的時候,k的結果已經很是很是接近0.1,b也很是很是接近0.2了,由此能夠看出,這個模型仍是較爲正確的。

相關文章
相關標籤/搜索