深度学习(三):线性回归模型的保存和加载

在本节,我们用tensorflow实现一个简单的线性回归
我们首先把这个过程分为三步:算法,线性回归 ;
策略 , 均方误差;
优化 , 梯度下降

1.准备好特征值和目标值(这里取一个特征值x,有100个样本)
2.建立模型(准备一个w和b) , y_predict = w x +b ,这里的w,b必须随机初始化
3.求损失函数,((y1-y1’)^2+…+ ( y100-y100’) ^2)/100
4.梯度下降,这是优化的方法(tennsorflowz中有,只需要自己指定学习率)

下面我们介绍下需要用到的api:
矩阵计算:tf.matmul(x,w)
平方:tf.square(error)
均值:tf.reduce_mean(error)
梯度下降:tf.train.GradientDecentOptimizer(learning_rate) 最小化损失,返回一个梯度下降的op

在上述第二步中,模型的参数,w,b必须用变量定义,不能用张量,因为变量是默认在训练过程中不断变化的
在编程的时候,尽量用矩阵相乘,别用遍历,这样速度太慢。

def my_regression():
#1.准备数据,特征值x, [100,1],目标值y,[100]
#这里x用张量定义,
x=tf.random_normal([100,1] , mean=1.75, stddev=0.5,name=“x_data”)
y_true=tf.matmul(x , [[0.7]])+0.8 #这里是矩阵相乘,必须是2维德,不能直接写0.7
#2.建立线性回归模型,1个w,1个bias,随机初始化,开始计算
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,weigh)+bias
#3.建立损失函数,均方误差
loss=tf.reduce_mean(tf.square(y_true-y_predict))
#4.优化,梯度下降
train_op=tf.train.GradientDescentOptimizer(0.12).minimize(loss)

#通过会话运行程序
with tf.Session() as sess:
	#初始化运行
	sess.run(init_op)
	#打印最初随机初始化的权重和偏置
	print(“随机初始化参数权重为: %f,偏置为: %f”   %(weeigh.eval() , bias.eval()))
	#运行优化
	sess.run(train_op)

	for i in range(500):
		sess.run(train_op)
		print("第"+i+"次参数权重为: %f , 偏置为:%f"    %(weigh.eval() , bias.eval()))
	
	#想要看这个程序的图,
	filewrite = tf.summary.FileWriter("./tmp....",graph=sess.graph)
return None

if name == “main”:
my_regression()

tf.Variable()中有个trainable参数,为True,保证变量在训练时是可变的

在tensorflow中还有作用域的概念: tf.variable_scope(" 在tensorboard显示的name ")
我们把上文中步骤1的代码放入,这样graph会用作用域封装,使得图的结构更加清晰,当我们要在tensorboard中添加权重和损失值以便观察其情况

我们要在会话启动前收集变量,合并变量写入事件文件中(这样才能在浏览器中看到)
eg: tf.summary.scalar(“loss”, loss) #前者是显示名字,后者是收集来的变量
merged = tf.summary.merge_all() #合并变量
在会话后的循环训练中加入
summary = sess.run(merged) #每次训练都运行变量的收集
filewriter.add_summary(summary, i )

当我们为了1防止模型文件在训练过程中被意外损坏,我们需要在训练的同时间隔性保存模型文件,模型文件叫checkpoint文件

文件的保存:
#在会话前先定义op,
saver=tf. train.Saver()

#在会话的循环训练中(或后,看你想保存几次),写入
saver.save(sess."./tmp…")

文件的加载:
在循环训练前写入加载模型,覆盖随机参数,这样就可以从上次结束的地方开始训练
if os.path.exis("./tmp…"): #先判断这个文件是否存在
saver.restore(sess,"./tmp…") #加载

最后是自定义命令行参数:1.首先定义有哪些参数需要在运行时后指定。2.在程序当中获取定义命令行参数

定义:tf.app.flags.DEFINE_integer(“max_step” , 100 , “模型训练的步数”) #参数依次是 名字,默认值,说明
tf.app.flags.DEFINE_string(“model_dir” , " " , “模型加载路径”) # " "表示暂时是空的,等待添加

FLAGS=tf.app.FLAGS #获取上面两个命令行参数的名字

这样在循环训练处写入:
for i in range(FLAGS , max_step):

在上文的加载路径处写入:
saver.restore(sess.FLAGS.model_dir)

通过tf.app.run() 启动main(argv) 函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43414976/article/details/88561972