tensorflow y = 2x大致擬合

深度學習大致步驟

1. 準備數據

2. 搭建模型

3. 迭代訓練模型

模型是如何訓練出來的

模型裏的內容和意義

模型結構: 輸入-中間節點-輸出

TensorFlow 將中間節點及節點間的運算關係(OPS)定義在自己內部的一個“圖”上,全通過一個“會話(session)”行圖中OPS具體運算。

可以這樣理解:

  • "圖"是靜態的,無論做任何加減乘除,他們只是將關係搭建在一起,不會有任何運算
  • "會話"是動態的,只有啓動會話後纔會將數據流向圖中,並按照圖中的關係運算,並將最終的結果從圖中流出
  • 任何一個結點可以通過會話的run函數進行計算,得到該節點的真實數值

tensorflow的這種方式分離了定義和執行。

模型內部的數據流向

1. 正向

正向,是數據從輸入開始,依次進行各節點定義的運算,一直運算到輸出,是模型基本數據流向。

2. 反向

反向,只有在訓練場景中才會使用到。
先從正向的最後一個節點開始,計算此時結果值與真實值的誤差,這樣會形成一個用計算學習參數表示誤差的方程,然後對方程中的每個參數求導,得到其梯度修正值,同時反推出上一層的誤差,類推直到傳到正向的第一個節點。

重點

  • 使用什麼方法來計算誤差
  • 使用哪些梯度下降的優化方法
  • 如何調節梯度下降中的參數(如學習率)

4. 使用模型

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

# 1.準備數據
train_X = np.linspace(-1, 1, 100) # -1到1的100個等距離數據(等差數列)
train_Y = 2 * train_X + np.random.randn(100) * 0.3  # 加入了噪聲的 y = 2x

# 爲數據圖形化做準備
plotdata = {"batchsize":[], "loss":[]}
def moving_average(a, w = 10):
    if len(a) < w:
        return a[:]
    return [val if idx < w else sum(a[(idx - w):idx])/w for idx, val in enumerate(a)]

# 顯示模擬數據點
plt.plot(train_X, train_Y, 'b.')
plt.legend()
plt.title("data")
plt.show()

# 2.搭建模型

# 佔位符
X = tf.placeholder ("float") 
Y = tf.placeholder ("float") 

# 模型參數
W = tf.Variable(tf.random_normal([1]), name = "weight") 
b = tf.Variable(tf.zeros([1]) , name = "bias") 

# 前向結構
z = tf.multiply (X , W) + b

# 反向優化
cost = tf.reduce_mean(tf.square(Y-z))
learning_rate = 0.01
optimizer = tf.train. GradientDescentOptimizer(learning_rate).minimize(cost)


# 3.迭代訓練模型

# 初始化所有變量
init = tf.global_variables_initializer()

# 定義參數
training_epochs = 20
display_step = 2

# 啓動session
with tf.Session() as sess:
    sess.run(init)
    plotdata = {"batchsize":[], "loss":[]}
    # 向模型輸入數據
    for epoch in range(training_epochs):
        for(x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict = {X:x, Y:y})
            
        # 顯示訓練中的詳細信息
        if epoch % display_step == 0:
            loss = sess.run(cost, feed_dict = {X:train_X, Y:train_Y})
            print ("Epoch:", epoch+1, "cost:", loss, "W=", sess.run(W), "b=", sess.run(b))
            if not (loss == "NA"):
                plotdata["batchsize"].append(epoch)
                plotdata["loss"].append(loss)
                
    # 圖形顯示
    fig = plt.figure(num = 1, figsize = (10, 6), dpi = 80)
    plt.plot(train_X, train_Y, 'b.', label = 'Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), 'r-', label = 'Fittedline')
    plt.legend()
    plt.show()

    plotdata["avgloss"] = moving_average(plotdata["loss"])
    plt.figure(1)
    plt.subplot(2, 1, 1)
    plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'y-')
    plt.xlabel('Minibatch number')
    plt.ylabel('Loss')
    plt.title('Minibatch run vs. Training loss')
    plt.show()
    
    # 4.使用模型
    print ("根據已有數據推算出 輸入值0.2 對應的 z值")
    print ("x = 0.2, z = ", sess.run(z, feed_dict = {X : 0.2}))

在這裏插入圖片描述

Epoch: 1 cost: 0.5817702 W= [0.9302488] b= [0.35420635]
Epoch: 3 cost: 0.12975623 W= [1.7124442] b= [0.14990632]
Epoch: 5 cost: 0.09125683 W= [1.9251237] b= [0.06990477]
Epoch: 7 cost: 0.088380344 W= [1.9802916] b= [0.04876148]
Epoch: 9 cost: 0.08811882 W= [1.9945589] b= [0.04328698]
Epoch: 11 cost: 0.088083476 W= [1.9982475] b= [0.04187138]
Epoch: 13 cost: 0.08807649 W= [1.9992021] b= [0.04150523]
Epoch: 15 cost: 0.088074826 W= [1.999449] b= [0.0414104]
Epoch: 17 cost: 0.08807441 W= [1.9995124] b= [0.04138604]
Epoch: 19 cost: 0.08807431 W= [1.9995282] b= [0.04137998]

在這裏插入圖片描述
在這裏插入圖片描述
根據已有數據推算出 輸入值0.2 對應的 z值
x = 0.2, z = [0.44128513]

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