1. 程式人生 > 其它 >windows10 tensorflow(二)原理實戰之迴歸分析,深度學習框架(梯度下降法求解迴歸引數)

windows10 tensorflow(二)原理實戰之迴歸分析,深度學習框架(梯度下降法求解迴歸引數)

windows10 tensorflow(二)原理實戰之迴歸分析,深度學習框架(梯度下降法求解迴歸引數) TF資料生成方式:參考TF資料生成12法 TF基本原理與概念理解: tensorflow(一)windows 10 64位安裝tensorflow1.4與基本概念解讀tf.global_variables_initializer

模型:

一個簡單的線性迴歸y = W * x + b,採用numpy構建完整迴歸資料,並增加干擾噪聲

import numpy as np
#建立一個一元線性迴歸方程y=0.1x1+0.3  ,同時一個正太分佈偏差np.random.normal(0.0,0.03)用於見證TF的演算法
num_points=1000
vectors_set=[]
for  i in  range(num_points):
    x1=np.random.normal(loc=0.0,scale=0.66)
    y1=x1*0.1+0.3+np.random.normal(0.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]

Graphic display出資料分佈結果

import matplotlib.pyplot as plt
#https://www.cnblogs.com/zqiguoshang/p/5744563.html
##line_styles=['ro-','b^-','gs-','ro--','b^--','gs--']  #set line style
plt.plot(x_data,y_data,'ro',marker='^',c='blue',label='original_data')
plt.legend()
plt.show()

通過TensorFlow程式碼找到最佳的引數W與b,使的輸入資料x_data,生成輸出資料y_data,本例中將會一條直線y_data=W*x_data+b。讀者知道W會接近0.1,b接近0.3,但是TensorFlow並不知道,它需要自己來計算得到該值。因此採用梯度下降法來迭代求解資料

import tensorflow as tf
import math
#一、建立graph資料
#隨便構建一個一元迴歸方程的引數W與b
W=tf.Variable(tf.random_uniform([1], minval=-1.0, maxval=1.0))
b=tf.Variable(tf.zeros([1]))
y=W*x_data+b

#定義下面的最小化方差
#1.定義最小化誤差平方根
loss=tf.reduce_mean(tf.square(y-y_data))
#2.learning_rate=0.5
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.5)
#3.最優化最小值
train=optimizer.minimize(loss)

#二、初始化變數
init=tf.global_variables_initializer()

#三、啟動graph
sess=tf.Session()
sess.run(init)

for step in range(8):
    sess.run(train)
    print("step={},sess.run=(W)={},sess.run(b)={}".format(step,sess.run(W),sess.run(b)))

以下是迭代8次的結果。梯度就像一個指南針,指引我們朝著最小的方向前進。為了計算梯度,TensorFlow會對錯誤函式求導,在我們的例子中就是,演算法需要對W和b計算部分導數,以在每次迭代中為前進指明方向。

下面是每次迭代的視覺化效果圖:

#Graphic display
    # print(sub_1+'41')
    #注意:各引數可以用逗號,分隔開。第一個引數代表子圖的行數;第二個引數代表該行影象的列數; 第三個引數代表每行的第幾個影象,從左致右,從上到下一次增加。
    plt.subplot(4,2,step+1)
    plt.plot(x_data,y_data,'ro')   
    plt.plot(x_data,sess.run(W)*x_data+
    sess.run(b),label=step)
    plt.legend()
plt.show()