python深度學習-tensorflow實現一個線性回歸的案例


線性回歸:w1x1+w2x2+w3x3+......+wnxn+bias(這是一個偏移量),我們采用的算法是:線性回歸,策略是:均方誤差,優化是:梯度下降API,

1.轉准備好實驗的數據:100個數據,每一個有一個特征值,所以形成一個【100,1】的列表,在准備一個目標函數:y=0.8x+0.7那么怎么知道為什么是0.8和0.7呢,這是我們假設的

2.建立一個模型,需要我們隨機生成兩個參數,一個是權重w一個是偏置b , y_predict = x * w + b,需要注意的是這個模型的參數必須要用變量來定義

3.求損失誤差,我們求的是均方誤差,公式是:((y1-y1')^2+(y2-y2')^2+.......+(y100-y100')^2)/100

4.接下來就是利用梯度下降來優化誤差,這個梯度下降是tensorflow里邊自己實現的,我們只需要指定一個學習率就行了

Tensorflow運算的API

矩陣運算:tf.matmul(x,w)

平方運算:tf.square(參數1)

均值運算:tf.reduce_mean(參數1)

梯度下降API:  tf.train.GradientDescentOptimizer(learning_rate);這是一個梯度下降優化器,learn_rate一般是method:minimize(loss),返回一個梯度下降的op

 

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低

def myLineregression():
    #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行
    x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data")
    y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了

    #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量
    #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化
    weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣
    bias = tf.Variable(0.0,name='b')
    y_predict = tf.matmul(x,weigth) + bias;

    #3建立損失函數
    loss = tf.reduce_mean(tf.square(y_true - y_predict))

    #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op
    init_op = tf.global_variables_initializer()

    with tf.Session() as sess:
        #初始化變量
        sess.run(init_op)
        #打印最先初始化的權重個偏置
        print("最先初始化的權重:%f  和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077  和 偏置是:0.000000
        # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607  和 偏置是:0.581311
        # sess.run(train_op)
        #循環訓練,運行優化,優化1000次,越多越精確,越接近我們的假設值
        for i in range(1000):
            sess.run(train_op)
            #打印優化后的權重和偏置
            print("第%d次優化后的權重:%f  和 偏置是:%f" % (i,weigth.eval(), bias.eval()))

    return None

if __name__ == "__main__":
    myLineregression()

 

 

 .......

 

那么你可能有一個疑問,為什么weight和bias會一直變化呢,因為他兩是tf.Variable類型的,在Variable()最后一個參數是trainable默認是True,如果你指定他是False的話,weight和bias就不會隨着我們梯度變化來變化了

我們接下來用變量作用域來實現一下:這樣的作用有兩個:第一:使得我們的代碼更加爽目;第二:使得我們后台顯示很流暢,否則可能會有點凌亂

 

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低

def myLineregression():
    with tf.variable_scope("data"):
        #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行
        x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data")
        y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了
    with tf.variable_scope("model"):
        #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量
        #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化
        weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣
        bias = tf.Variable(0.0,name='b')
        y_predict = tf.matmul(x,weigth) + bias;
    with tf.variable_scope("loss"):
        #3建立損失函數
        loss = tf.reduce_mean(tf.square(y_true - y_predict))
    with tf.variable_scope("Optimizer"):
        #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
        #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op
    init_op = tf.global_variables_initializer()

    with tf.Session() as sess:
        #在后台可視化觀察圖結構
        fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph)
        #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可
        #初始化變量
        sess.run(init_op)
        #打印最先初始化的權重個偏置
        print("最先初始化的權重:%f  和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077  和 偏置是:0.000000
        # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607  和 偏置是:0.581311
        # sess.run(train_op)
        #循環訓練,運行優化
        for i in range(1000):
            sess.run(train_op)
            #打印優化后的權重和偏置
            print("第%d次優化后的權重:%f  和 偏置是:%f" % (i,weigth.eval(), bias.eval()))

    return None

if __name__ == "__main__":
    myLineregression()

 

后台樣式:

但是在大多數的時候我們需要觀察我們變量的變化圖示,這時候我們需要添加變量顯示 ,步驟如下:

添加變量顯示的目的:觀察模型的參數,損失值等變量值的變化

第一步驟:收集變量,有下列三種函數,任選一中

tf.summary.scalar(name="",tensor);name是你需要把他顯示成什么名字的別名,tensor就是你顯示的張量

tf.summary.histogram(name="",tensor);收集高緯度的變量參數

tf.summary.image(name="",tensor);收集輸入圖片張量能顯示圖片

第二步驟:合並變量並寫入到事件文件中,下列函數按步驟來,都要寫!

merged = tf.summary.merge_all()  #合並變量,這一步往往寫在會話運行前

summary = sess.run(merged );每次運行的時候都需要運行

FileWrite.add_summary(summary,i);i表示第幾次的值

代碼如下:

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低

def myLineregression():
    with tf.variable_scope("data"):
        #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行
        x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data")
        y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了
    with tf.variable_scope("model"):
        #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量
        #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化
        weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣
        bias = tf.Variable(0.0,name='b')
        y_predict = tf.matmul(x,weigth) + bias;
    with tf.variable_scope("loss"):
        #3建立損失函數
        loss = tf.reduce_mean(tf.square(y_true - y_predict))
    with tf.variable_scope("Optimizer"):
        #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
        #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op
    init_op = tf.global_variables_initializer()
    #收集tensor,為了添加變量顯示
    tf.summary.scalar("losser",loss)
    tf.summary.histogram("weighter",weigth)
    #合並tensor的op,為了添加變量顯示
    merged = tf.summary.merge_all()

    with tf.Session() as sess:
        #在后台可視化觀察圖結構
        fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph)
        #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可
        #初始化變量
        sess.run(init_op)
        #打印最先初始化的權重個偏置
        print("最先初始化的權重:%f  和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077  和 偏置是:0.000000
        # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607  和 偏置是:0.581311
        # sess.run(train_op)
        #循環訓練,運行優化
        for i in range(1000):
            sess.run(train_op)
            #運行合並的tensor,為了添加變量顯示
            summary = sess.run(merged)
            #把合並的op添加到事件文件中
            fileWrite.add_summary(summary,i)
            #打印優化后的權重和偏置
            print("第%d次優化后的權重:%f  和 偏置是:%f" % (i,weigth.eval(), bias.eval()))

    return None

if __name__ == "__main__":
    myLineregression()

 

 

 

 有時候我們訓練的數據相當的多,就會出現down 機的現象,這會使得我們之前訓練很久的數據丟失,當你再次訓練的時候又要重新開始,這是很浪費時間的,這時候我們要是有down機前的數據就好了,tensorflow就提供了這種模型保存和加載的功能。讓我們看看怎么實現的吧。

函數:

1.Saver = tf.train.Saver(var_list,max_to_keep=5);var_list表示要保存和還原的變量,他可以作為一個列表或者字典來傳遞,max_to_keep要保留的最近檢查點文件的最大數量,創建新文件時會刪除舊文件,默認為5,如果是0則表示保留所有的檢查點文件

舉個栗子:

Saver.save(sess,"保存檢查點文件的路徑");

在上次訓練結束的位置開始訓練:Saver.restore(sess,"保存檢查點文件的路徑")

你會發現會把上次訓練結束的數據保存到一個叫checkpoint的文件中

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'#把報錯的這個警告等級降低

def myLineregression():
    with tf.variable_scope("data"):
        #1.准備數據,x是100行1列的矩陣,y是一個目標值,100行
        x = tf.random_normal([100,1],mean = 1.75,stddev=0.5,name="x_data")
        y_true = tf.matmul(x,[[0.7]]) + 0.8 #其中這個0.7和0.8是不知道的,在這里我們假設我們知道了
    with tf.variable_scope("model"):
        #2.建立回歸模型,1個特征值x 1個權重weight,一個偏置bias,組成:y = x*weight + bias,這里一定是變量
        #隨機給一個權重和偏置,讓他接下來去計算誤差函數,然后再去優化,但是前提是必須是變量才能優化
        weigth = tf.Variable(tf.random_normal([1,1],mean=0.0,stddev=1.0),name='w')#即使是一個數也要表示成矩陣,一行一列表示一個矩陣
        bias = tf.Variable(0.0,name='b')
        y_predict = tf.matmul(x,weigth) + bias;
    with tf.variable_scope("loss"):
        #3建立損失函數
        loss = tf.reduce_mean(tf.square(y_true - y_predict))
    with tf.variable_scope("Optimizer"):
        #4.梯度下降優化損失,learning_rate一般是在0~10,越小越好通常是,最大不要超過10,然后通過minimize()來優化誤差函數loss
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
        #接下來就要通過會話來運行實現了,但在這之前需要初始化變量的op
    init_op = tf.global_variables_initializer()
    #收集tensor,為了添加變量顯示
    tf.summary.scalar("losser",loss)
    tf.summary.histogram("weighter",weigth)
    #合並tensor的op,為了添加變量顯示
    merged = tf.summary.merge_all()
    #定義一個保存模型的實例,只要是定義一個op就寫在會話前邊
    Saver = tf.train.Saver()

    with tf.Session() as sess:
        #在后台可視化觀察圖結構
        fileWrite = tf.summary.FileWriter("E:/python/day8/temp/summary/text/",graph=sess.graph)
        #接下來在終端運行tensorboard --logdir="E:/python/day8/temp/summary/text/",就會產生一個網址,在瀏覽器打開即可
        #初始化變量
        sess.run(init_op)
        #打印最先初始化的權重個偏置
        print("最先初始化的權重:%f  和 偏置是:%f" %(weigth.eval(),bias.eval()))#最先初始化的權重:-0.475077  和 偏置是:0.000000
        # #運行優化,這只是訓練一次的結果:優化后的權重:0.635607  和 偏置是:0.581311
        # sess.run(train_op)
        #循環訓練,運行優化
        #加載模型,從上次訓練結束的位置開始
        if os.path.exists("E:/python/day8/temp/ckpt/textmodel"):
            Saver.restore(sess,"E:/python/day8/temp/ckpt/textmodel")
        for i in range(1000):
            sess.run(train_op)
            #運行合並的tensor,為了添加變量顯示
            summary = sess.run(merged)
            #把合並的op添加到事件文件中
            fileWrite.add_summary(summary,i)
            #打印優化后的權重和偏置
            print("第%d次優化后的權重:%f  和 偏置是:%f" % (i,weigth.eval(), bias.eval()))
        Saver.save(sess,"E:/python/day8/temp/ckpt/textmodel")
    return None

if __name__ == "__main__":
    myLineregression()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM