AI學習---基於TensorFlow的案例[實現線性迴歸的訓練]

  • 線性迴歸原理複習

        1)構建模型
               |_> y = w1x1 + w2x2 + …… + wnxn + b
        2)構造損失函數
               |_> 均方偏差
        3)優化損失
               |_> 梯度降低html

image

  • 實現線性迴歸的訓練

        準備真實數據
            100樣本
            x 特徵值 形狀 (100, 1)  100行1列
            y_true 目標值 (100, 1)
            y_true = 0.8x + 0.7    假設特徵值和目標值直接的線性關係
        假定x 和 y 之間的關係 知足
            y = kx + b
            k ≈ 0.8 b ≈ 0.7
            流程分析:
            (100, 1) * (1, 1) = (100, 1)
            y_predict = x * weights(1, 1) + bias(1, 1)
            1)構建模型: 矩陣:matmul
                y_predict = tf.matmul(x, weights) + bias
            2)構造損失函數: 平均:reduce_mean  平方: square
                error = tf.reduce_mean(tf.square(y_predict - y_true))
            3)優化損失:  梯度降低的評估器GradientDescentOptimizer
                optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
            5 學習率的設置、步數的設置與梯度爆炸java

  • 案例肯定

image

  • API

image

  • 步驟分析

demo:瀏覽器

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自實現一個線性迴歸
    :return:
    """
    # 1)準備數據
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2)
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定義了一個一行一列

    # 2)構造模型
    # 定義模型參數 用 變量
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))  # 隨機產生一個一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))   # 隨機產生一個一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)構造損失函數: 均方偏差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)優化損失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 默認0.01

    # 顯式地初始化變量
    init = tf.global_variables_initializer()

    with tf.Session() as sess:

        # 初始化變量
        sess.run(init)
        # 查看初始化模型參數以後的值
        print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))
        # 開始訓練
        for i in range(10):
            sess.run(optimizer)
            print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))


if __name__ == "__main__":
    linear_regression()

image

通過上面的訓練咱們能夠發現,在學習率不變的狀況下,迭代的次數越多,則效果越好。同理在迭代次數必定的狀況下,學習率越高效果越好,但也是有必定限制的。app

  • 學習率的設置、步數的設置與梯度爆炸

image

  • 變量的trainable設置觀察

image

增長TensorBoard顯示dom

            1)建立事件文件
            2)收集變量
            3)合併變量
            4)每次迭代運行一次合併變量
            5)每次迭代將summary對象寫入事件文件函數

image

變量dashboard顯示demo:學習

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自實現一個線性迴歸
    :return:
    """
    # 第一步:
    # 1)準備數據
    X = tf.random_normal(shape=[100, 1], mean=2)
    y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定義了一個一行一列

    # 2)構造模型
    # 定義模型參數 用 變量
    # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True)  # 隨機產生一個一行一列
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]))   # 隨機產生一個一行一列
    y_predict = tf.matmul(X, weights) + bias

    # 3)構造損失函數: 均方偏差
    error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)優化損失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 顯式地初始化變量
    init = tf.global_variables_initializer()

    # 第二步:收集變量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合併變量
    merged = tf.summary.merge_all()

    with tf.Session() as sess:

        # 初始化變量
        sess.run(init)

        # 1_建立事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型參數以後的值
        print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))
        # 開始訓練
        for i in range(100):
            sess.run(optimizer)
            print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))

            # 運行合併變量操做
            summary = sess.run(merged)
            # 將每次迭代後的變量寫入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次數


if __name__ == "__main__":
    linear_regression()

Tensorboard的可視化:http://ftl2018:6006/#graphs&run=.(火狐瀏覽器)優化

image

image

imageimage

  • 增長命名空間

image

增長命名空間demo命令行

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自實現一個線性迴歸
    :return:
    """
    # 第一步:
    # 1)準備數據
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定義了一個一行一列

    # 2)構造模型
    # 定義模型參數 用 變量
    # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights')  # 隨機產生一個一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias')   # 隨機產生一個一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)構造損失函數: 均方偏差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)優化損失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 顯式地初始化變量
    init = tf.global_variables_initializer()

    # 第二步:收集變量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合併變量
    merged = tf.summary.merge_all()

    with tf.Session() as sess:

        # 初始化變量
        sess.run(init)

        # 1_建立事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型參數以後的值
        print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))
        # 開始訓練
        for i in range(100):
            sess.run(optimizer)
            print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))

            # 運行合併變量操做
            summary = sess.run(merged)
            # 將每次迭代後的變量寫入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次數


if __name__ == "__main__":
    linear_regression()
image
  • 模型保存於加載

             saver = tf.train.Saver(var_list=None,max_to_keep=5)
            1)實例化Saver
            2)保存
                saver.save(sess, path)
            3)加載
                saver.restore(sess, path)scala

image

模型保存(須要提早準備好目錄)與加載demo

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


def linear_regression():
    """
    自實現一個線性迴歸
    :return:
    """
    # 第一步:
    # 1)準備數據
    with tf.variable_scope(name_or_scope='prepare_data'):
        X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
        y_true = tf.matmul(X, [[0.8]]) + 0.7   # [[0.8]] 定義了一個一行一列

    # 2)構造模型
    # 定義模型參數 用 變量
    # trainable=False,的時候則後面的權重會不變,致使損失也不會變化過久,默認True
    with tf.variable_scope("create_model"):
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights')  # 隨機產生一個一行一列
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias')   # 隨機產生一個一行一列
        y_predict = tf.matmul(X, weights) + bias

    # 3)構造損失函數: 均方偏差
    with tf.variable_scope("loss_function"):
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    # 4)優化損失
    with tf.variable_scope("optimizer"):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 顯式地初始化變量
    init = tf.global_variables_initializer()

    # 第二步:收集變量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 第三步:合併變量
    merged = tf.summary.merge_all()

    # 保存模型:建立Saver對象
    saver = tf.train.Saver(max_to_keep=5)

    with tf.Session() as sess:

        # 初始化變量
        sess.run(init)

        # 1_建立事件文件
        file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph)

        # 查看初始化模型參數以後的值
        print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))
        # 開始訓練
        for i in range(100):
            sess.run(optimizer)
            print("訓練前模型參數爲:權重%f,偏置%f,損失爲%f" % (weights.eval(), bias.eval(), error.eval()))

            # 運行合併變量操做
            summary = sess.run(merged)
            # 將每次迭代後的變量寫入事件文件
            file_writer.add_summary(summary, i)  # i是迭代次數

            # 保存模型(保存模型參數,而參數在會話中)--》路徑須要先建立好
            if i % 10 == 0:
                saver.save(sess, "./tmp/my_linear.ckpt")
        # # 加載模型
        # if os.path.exists("./tmp/model/checkpoint"):
        #     saver.restore(sess, "./tmp/model/my_linear.ckpt")


if __name__ == "__main__":
    linear_regression()
image
  • 命令行參數設置

      命令行參數使用
            1)tf.app.flags
                    tf.app.flags.DEFINE_integer("max_step", 0, "訓練模型的步數")
                    tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路徑+模型名字")
            2)FLAGS = tf.app.flags.FLAGS
                    經過FLAGS.max_step調用命令行中傳過來的參數
            三、經過tf.app.run()啓動main(argv)函數

image

image

具體調用:

image

命令行demo

import tensorflow as tf
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 1)定義命令行參數
tf.app.flags.DEFINE_integer("max_step", 100, "訓練模型的步數")
tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路徑+模型名字")

# 2)簡化變量名
FLAGS = tf.app.flags.FLAGS

def command_demo():
    """
    命令行參數演示
    :return:
    """
    print("max_step:\n", FLAGS.max_step)
    print("model_dir:\n", FLAGS.model_dir)

    return None

def main(argv):
    print("code start", argv)
    return None

if __name__ == "__main__":
    # 命令行參數演示
    # command_demo()
    tf.app.run()
相關文章
相關標籤/搜索