tensorflow實現線性迴歸、以及模型保存與加載

內容:包含tensorflow變量做用域、tensorboard收集、模型保存與加載、自定義命令行參數python

一、知識點網絡

""" 一、訓練過程: 一、準備好特徵和目標值 二、創建模型,隨機初始化權重和偏置; 模型的參數必需要使用變量 三、求損失函數,偏差爲均方偏差 四、梯度降低去優化損失過程,指定學習率 二、Tensorflow運算API: 一、矩陣運算:tf.matmul(x,w) 二、平方:tf.square(error) 三、均值:tf.reduce_mean(error) 四、梯度降低API: tf.train.tf.train.GradientDescentOptimizer(learning_rate) learning_rate:學習率 minimize(lose):優化最小損失 return:梯度降低op 三、注意項: 一、tf.Variable()中的trainable表示爲變量在訓練過程可變 二、學習率設置很大時,可能會出現權重和偏置爲NAN,這種現象表現叫梯度爆炸 解決方法:一、從新設計網絡 二、調整學習率 三、使用梯度截斷 四、使用激活函數 四、變量做用域:主要用於tensorboard查看,同時使代碼更加清晰 with tf.variable_scope("data"): 五、添加權重、參數、損失值等在tensoroard觀察的狀況: 一、收集tensor變量 tf.summary.scalar('losses', loss)、tf.summary.histogram('weight',weight) 二、合併變量並寫入事件文件:merged = tf.summary.merge_all() 三、運行合併的tensor:summary = sess.run(merged)、fileWriter.add_summary(summary,i) 六、模型保存與加載: tf.train.Saver(var_list=None,max_to_keep=5) var_list:指定將要保存和還原的變量。它能夠做爲一個dict或一個列表傳遞. max_to_keep:指示要保留的最近檢查點文件的最大數量。 建立新文件時,會刪除較舊的文件。若是無或0,則保留全部 檢查點文件。默認爲5(即保留最新的5個檢查點文件。 a)例如:saver.save(sess, '/tmp/ckpt/test/model') saver.restore(sess, '/tmp/ckpt/test/model') 保存文件格式:checkpoint文件 b)模型加載: if os.path.exists('./ckpt/checkpoint'): saver.restore(sess,'./ckpt/model') 七、自定義命令行參數: 一、首先定義有哪些參數須要在運行時候指定 二、程序當中獲取定義命令行參數 三、運行 python *.py --max_step=500 --model_dir='./ckpt/model' 本例執行命令:python tensorflow實現線性迴歸.py --max_step=50 --model_dir="./ckpt/model" """

二、代碼app

# coding = utf-8
import tensorflow as tf import os #自定義命令行參數
tf.app.flags.DEFINE_integer("max_step",100,"模型訓練的步數") tf.app.flags.DEFINE_string("model_dir"," ","模型文件加載路徑") #定義獲取命令行參數名字
FLAGS = tf.app.flags.FLAGS def myLinear(): """ 自實現一個線性迴歸預測 :return: """
    #定義做用域
    with tf.variable_scope("data"): #一、準備數據,特徵值
        x = tf.random_normal([100,1],mean=1.75,stddev=0.5) #目標值。矩陣相乘,必須是二維的
        y_true = tf.matmul(x,[[0.7]])+0.8 with tf.variable_scope("model"): #二、創建線性模型 y = wx+b ,隨機給定w和b的值,必須定義成變量
        weight = 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,weight)+bias with tf.variable_scope("loss"): #三、創建損失函數,均方偏差
        loss = tf.reduce_mean(tf.square(y_true-y_predict)) with tf.variable_scope("optimizer"): #四、梯度降低優化損失
        train_op = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss) ##############模型保存################
    with tf.variable_scope("save_model"): saver = tf.train.Saver(); # 初始化變量
    init_op = tf.global_variables_initializer() ####################收集變量#########################
    # 收集tensor變量
    tf.summary.scalar('losses', loss) tf.summary.histogram('weight',weight) #合併變量並寫入事件文件
    merged = tf.summary.merge_all() #經過會話運行程序
 with tf.Session() as sess: #必需要運行初始化變量
 sess.run(init_op) #打印隨機最早初始化的權重和偏置
        print("隨機初始化的參數權重爲:%f,偏置爲:%f" % (weight.eval(),bias.eval())) # 創建事件文件
        fileWriter = tf.summary.FileWriter("./tmp", graph=sess.graph) ###########加載模型,覆蓋以前的參數##############
        if os.path.exists('./ckpt/checkpoint'): #saver.restore(sess,'./ckpt/model')
 saver.restore(sess, FLAGS.model_dir) #循環優化
        for i in range(FLAGS.max_step): #運行優化
 sess.run(train_op) #運行合併的tensor
            summary = sess.run(merged) fileWriter.add_summary(summary,i) print("第%d次優化參數權重爲:%f,偏置爲:%f" % (i,weight.eval(), bias.eval())) ################模型保存##############
            # if i%1000==0:
            # #saver.save(sess,'./ckpt/model')
            # saver.save(sess,FLAGS.model_dir)
 saver.save(sess, FLAGS.model_dir) return None if __name__ == '__main__': myLinear()
相關文章
相關標籤/搜索