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()
相关文章
相关标签/搜索