1. 程式人生 > >手寫:邏輯迴歸擬合二維資料(tensorflow)

手寫:邏輯迴歸擬合二維資料(tensorflow)

tensorflow開發的基本步驟

1、定義tensorflow輸入節點【3種方法】

2、定義學習引數的變數【2種方法】

3、定義運算

4、選擇優化函式,優化目標

5、初始化所有變數

6、迭代更新引數到最優解

7、測試模型

8、使用模型

下面就挑前幾個比較重要的說一下

1、定義tensorflow輸入節點【3種】

      1.1使用  佔位符  定義:比較常用,使用   tf.placeholder  函式

              佔位符的意思就是先定義,之後再解釋,就相當於先定義了變數但是沒有初始化,定義方法如下:

X = tf.placeholder("float")   
Y = tf.placeholder("float")   

      1.2使用   字典型別  定義:用於輸入比較多的情況下

               將佔位符與字典型別相結合,實現方法如下:

  

inputdict = {
                 'x':tf.placeholder("float"),
                 'y':tf.placeholder("float")
             }

      1.3直接定義:一般很少用

              就是將輸入的資料直接當做模型的輸入變數

2、定義學習引數的變數【2種】

      2.1直接定義: 使用tf.Variable函式可以對引數直接定義

W = tf.Variable(tf.random_normal([1]),name = "weight")  
b = tf.Variable(tf.zeros([1]),name = "bias")

      2.2字典定義:在深層神經網路中,經常使用字典定義

             就是將直接定義的方法加到字典型別中,實現方法如下:

paradict = {
                 'w':tf.Variable(tf.random_normal([1]),name = "weight"),
                 'b':tf.Variable(tf.zeros([1]),name = "bias")
             }
#在前向計算的時候,使用方法
z = tf.multiply(X,paradict["w"]) + paradict["b"]

5、初始化所有變數

必須是要在所有的變數還有節點(OP)定義完成之後再進行全域性的變數初始化,不然,在初始化所有變數之後  定義的變數和OP都不能使用session中的run函式進行陣列計算了。

 

 

例項描述:

    假設有一組資料集,其x和y的對應關係為y≈2x

    需要讓神經網路學習這些樣本,並找到其中的規律。

實現深度學習的步驟

     #1、準備資料
     #2、搭建模型
     #3、迭代訓練
     #4、使用模型

 

下面的程式碼中實現了,訓練模型的儲存及過載、以及儲存檢查點


#深度學習
#1、準備資料
#2、搭建模型
#3、迭代訓練
#4、使用模型

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

#定義生成loss視覺化的函式
plotdata = {"batchrize":[],"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)]




#1、準備資料
train_X = np.linspace(-1,1,100) 
train_Y = 2 * train_X + np.random.rand(*train_X.shape)*0.3


#重置圖
tf.reset_default_graph()


#2、搭建模型
    # X  Y是佔位符,也就是說先定義了,之後再解釋,用placeholder函式進行定義
X = tf.placeholder("float")   #代表輸入x的值
Y = tf.placeholder("float")   #代表對應的真實值 y
    #模型引數--變數
W = tf.Variable(tf.random_normal([1]),name = "weight")    #tf.Variable 表示定義變數
b = tf.Variable(tf.zeros([1]),name = "bias")
    #前向結構
    #tf.multiply表示相乘的意思,也就是單個神經元的前向計算 權重x輸入+偏移
    #z就是前向的計算輸出
z = tf.multiply(X,W) + b    

    #反向優化
    #2.1、定義一個損失函式,此處使用的 生成值 與 真實值 之間的 平方差
cost = tf.reduce_mean(tf.square(Y-z))
    #2.2、定義一個學習速率,代表調整引數的速度
learning_rate = 0.01
    #2.3、使用梯度下降法進行 loss 函式的優化;  GradientDescentOptimizer就是一個已經封裝好的 梯度下降的演算法
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)




#3、迭代訓練
#3.1  訓練模型
    #初始化所有變數,必須在所有的變數和節點(OP)定義完成之後,再進行初始化
    #否則,在初始化之後定義的變數和OP都無法使用session中的run來計算值
init = tf.global_variables_initializer()
    #定義引數:迭代次數以及顯示步長
training_epochs = 30
display_step = 2

#生成saver
saver = tf.train.Saver()
savedir = "D:\work_work\spyder_working_space/"

    #建立並啟動session,  with語法可以在session結束後自行關閉,也是常用的session啟動方法
with tf.Session() as sess:
    sess.run(init)

    
    #向模型輸入資料,在單搭建模型的時候  使用X Y 兩個佔位符來表示的 模型中的 輸入  以及   輸出真實值
    #因此需要將第一步中的資料  與  模型中的佔位符連結起來
    #使用feed機制將真實資料灌到佔位符對應的位置
    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["batchrize"].append(epoch)
                plotdata["loss"].append(loss)
            
            #儲存訓練好的 模型變數,此操作只儲存 定義的變數
            #也就是  tf.Variable  定義了的變數
            saver.save(sess,savedir+"linermodel.cpkt",global_step=epoch)
    
    print("Fineshed!")
    
    print("cost=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"W=",sess.run(W),"b=",sess.run(b))
    #在顯示cost的時候可以使用下面的這種表示方法
    #print("cost:",cost.eval({X:train_X,Y:train_Y}))

#3.2 模型視覺化
    #為了更加直觀的表達,將生成的模型以及訓練的狀態值顯示出來
    #圖形顯示
    plt.plot(train_X,train_Y,'ro',label='Original data')
    plt.plot(train_X,sess.run(W)*train_X + sess.run(b),label='Fittedline')
    plt.legend()
    plt.show()
    
    plotdata["avgloss"] = moving_average(plotdata["loss"])
    plt.figure(1)
    plt.subplot(211)
    plt.plot(plotdata["batchrize"],plotdata["avgloss"],'b--')
    plt.xlabel("Minibatch number")
    plt.ylabel("Loss")
    plt.title("Minibatch run vs. Training loss")
    
    plt.show()
        
    
#4、使用模型,啟動的時候  也需要啟動session
    print("x=0.2,z=",sess.run(z,feed_dict={X:0.2}))


    
#重啟一個session,載入檢查點
load_epoch = 18
with tf.Session() as sess2:
    sess2.run(tf.global_variables_initializer())
    #載入之後就會覆蓋掉所有的引數
    #因此,如果要載入模型的時候,不需要進行初始化了,因為就算是初始化也會被過載的覆蓋掉
    saver.restore(sess2,savedir+"linermodel.cpkt-",str(load_epoch))
    print("x=0.2,z=",sess2.run(z,feed_dict={X:0.2}))
    

輸出結果如下:

Epoch: 1 cost= 0.055053063 W= [1.6758726] b= [0.24198401]
Epoch: 3 cost= 0.011287085 W= [1.9341978] b= [0.1905865]
Epoch: 5 cost= 0.0077018575 W= [2.0061853] b= [0.16376488]
Epoch: 7 cost= 0.007581351 W= [2.0248852] b= [0.15660226]
Epoch: 9 cost= 0.0076055895 W= [2.0297222] b= [0.1547464]
Epoch: 11 cost= 0.007615575 W= [2.0309737] b= [0.15426627]
Epoch: 13 cost= 0.0076183914 W= [2.0312958] b= [0.15414251]
Epoch: 15 cost= 0.0076191537 W= [2.031381] b= [0.15410994]
Epoch: 17 cost= 0.007619343 W= [2.031402] b= [0.15410173]
Epoch: 19 cost= 0.0076193972 W= [2.031408] b= [0.15409955]
Epoch: 21 cost= 0.0076194014 W= [2.0314085] b= [0.15409915]
Epoch: 23 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 25 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 27 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Epoch: 29 cost= 0.0076194014 W= [2.0314085] b= [0.15409914]
Fineshed!
cost= 0.0076194014 W= [2.0314085] b= [0.15409914]

x=0.2,z= [0.5603808]
INFO:tensorflow:Restoring parameters from D:\work_work\spyder_working_space/linermodel.cpkt
x=0.2,z= [0.5603808]