這是一次使用《TensorFlow筆記(1)——TensorFlow中的相關基本概念》中學習到的知識進行機器學習的實驗,一來是爲了理解機器學習大概是什麼樣的,另外一方面也算是將以前學習到的一些知識活學活用。 本次實現的環境爲:html
機器學習和人類學習的過程:python
若是以爲上圖很差理解的話就再舉一個栗子:dom
假設你有個女友,她特別愛漂亮。爲了互相瞭解,大家每週末都會一塊兒約會吃飯;已經約會有8周了,每週吃飯你女友都會比約定時間晚到10分鐘-30分鐘,因此你每次約會也會比約定時間晚10-30分鐘,而且你總結了一個規律(若是約會前打電話她說從家走了,那麼基本都是晚到30分鐘左右,若是她說就快到了,那麼基本會晚到10分鐘),不過你女友後來遲到的時間從十、30分鐘變成了1五、45分鐘,你也本身調整了約定時間後到達的時間。機器學習
根據上述栗子🌰咱們來類比下:函數
機器學習方法是計算機利用已有的數據(8次約會的經驗),得出了某種模型(遲到的規律),並利用此模型預測將來(是否遲到)的一種方法。學習
基礎知識在這裏我就很少說了,詳見《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𝑥+𝑏 ,
使得全部點的損失值 越小越好,由於𝑙𝑜𝑠𝑠越小就代表預測值與真實值的差距越小。
由於若是咱們找到了這麼一組 K 和 𝑏 ,咱們就能夠預測某一個 的
值。
這裏我想多說幾句,線性模型在實際應用中不必定能很好的預測 的值,這是由於實際的數據分佈也許不是線性的,多是二次、三次、圓形甚至無規則,因此判斷何時能用線性模型很重要。只是由於咱們在這裏知道了這是線性模型才這麼作的,真正構建模型的時候是須要相應的方法的。
話很少少,分段來看代碼:
# 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))
複製代碼
依次來解釋下每一個部分的含義:
y_data-y
:這個地方沒啥好解釋的,就是真實值和預測值之間的差tf.square
:這個函數的做用就是求平方tf.reduce_mean
: 函數用於計算張量tensor沿着指定的數軸(tensor的某一維度)上的的平均值,主要用做降維或者計算tensor(圖像)的平均值。因此上面這三個函數合在一塊兒就是計算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了,由此能夠看出,這個模型仍是較爲正確的。