12-深度学习-手写回归+模型的保存与加载02
线性回归原理回顾
- 找寻目标值和特征值之间存在的关系,求出w和b即可。
- y = (x1w1 + x2w2...+xn*wn)+b
- 损失函数(均方误差):表示真实值和预测值之间的误差
- 使用梯度下降将损失函数的误差值最小即可
实现流程
- 准备最简单的特征值和目标值
- y = 0.8*x+1.5,然后我们需要让手写的线性回归求出w(0.8)和b(1.5)
- 建立模型
- 随机初始化一个w和b
- 因为模型一开始也不知道w和b应该是什么,只能随机初始化一个,然后随着梯度下降逐步迭代更新w和b
- 然后求出预测值:y_pred = wx+b
- 随机初始化一个w和b
- 求出损失函数(误差)的结果
- 均方误差:y是真实值y'是预测值
- ((y1-y1')^2+(y2-y2')^2+...+(yn-yn')^2)/n
- 均方误差:y是真实值y'是预测值
- 使用梯度下降降低损失(梯度下降不需要手动实现,TensorFlow中有对应的API,只需要指定学习率即可)
- TensorFlow运算的API
- 矩阵运算:tf.matmul(a,b)
- 平方:tf.square(x)
- 均值:tf.reduce_mean()
- 梯度下降API
- 类:tf.train.GradientDescentOptimizer(learning_rate)
- learning_rate:需要手动指定学习率
- 类:tf.train.GradientDescentOptimizer(learning_rate)
注意:
- 线性回归是一个迭代算法,那么意味着在每次梯度下降的过程中y=wx+b中的w和b是在不停的变化的逐步在优化这两个值。因此记住,w和b是需要不断变化的在梯度下降的过程中!
- 结论:
- 在TensorFlow中随机初始化的w和b只可以用变量定义不可以用张量,因为,变量可以自身变化,而张量不行!
- 或者说模型的参数只可以用变量定义不可以用张量定义!!!
- tf.Variable(initial_value=None,trainable=True)
- trainable=True表示的含义就是在训练的过程中变量的值可以跟随训练而实时变化!!!
import tensorflow as tf # 第一步:准备数据 # tf.random_normal 返回一个指定形状的张量 x = tf.random_normal(shape=(100,1),mean=1.5,stddev=0.75) # 特征数据 y_true = tf.matmul(x,[[0.8]])+1.5 # 标签数据 w=0.8,b=1.5 # 第二步:建立模型,随机初始化一个w和b weight = tf.Variable(tf.random_normal(shape=(1,1),mean=1.2,stddev=0.5)) b = tf.Variable(2.5) # 预测结果 y_pred = tf.matmul(x,weight)+b # 第三步:损失函数就是均方误差 loss = tf.reduce_mean(tf.square(y_true - y_pred)) # 第四步.梯度下降优化损失 train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss) # 定义的变量进行显示初始化 init_op = tf.global_variables_initializer() with tf.Session() as s: s.run(init_op) # 先运行变量的初始化操作 print('随机初始化的w=%f,b=%f'%(weight.eval(),s.run(b))) for i in range(1,401):# 固定迭代的次数 s.run(train_op) if i%20 == 0: print('第%d次优化后的w=%f,b=%f'%(i,weight.eval(),b.eval())) 随机初始化的w=0.816529,b=2.500000 第20次优化后的w=0.572955,b=1.896295 第40次优化后的w=0.680251,b=1.720152 第60次优化后的w=0.734756,b=1.615458 第80次优化后的w=0.764612,b=1.561906 第100次优化后的w=0.780714,b=1.533197 第120次优化后的w=0.789753,b=1.517574 第140次优化后的w=0.794484,b=1.509686 第160次优化后的w=0.797118,b=1.505182 第180次优化后的w=0.798350,b=1.502849 第200次优化后的w=0.799147,b=1.501556 第220次优化后的w=0.799511,b=1.500829 第240次优化后的w=0.799743,b=1.500452 第260次优化后的w=0.799859,b=1.500251 第280次优化后的w=0.799925,b=1.500136 第300次优化后的w=0.799960,b=1.500069 第320次优化后的w=0.799978,b=1.500037 第340次优化后的w=0.799988,b=1.500021 第360次优化后的w=0.799994,b=1.500011 第380次优化后的w=0.799996,b=1.500006 第400次优化后的w=0.799998,b=1.500003
模型保存与加载
代码报错(NotFindError),问题在于模型加载的路径或者在代码头部加上tf.reset_default_graph()
- 保存的其实就是w和b
- 定义saver的op
- saver = tf.train.Saver()
- 在会话中运行保存函数:
- saver.save(session,'path')
- path:表示保存模型的路径,携带模型的名称(任意名称)
- saver.save(session,'path')
- 在会话运行时加载模型:
- if os.path.exists('./xxx/checkpoint'):
- saver.restore(session,'path')
- if os.path.exists('./xxx/checkpoint'):
- 模型的加载
import os tf.reset_default_graph() # 如果加载保存好的模型时出现notfinderror就加上该行代码 # 第一步:准备数据 x = tf.random_normal(shape=(100,1),mean=1.5,stddev=0.75) # 特征数据 y_true = tf.matmul(x,[[0.8]])+1.5 # 标签数据 w=0.8,b=1.5 # 第二步:建立模型,随机初始化一个w和b weight = tf.Variable(tf.random_normal(shape=(1,1),mean=1.2,stddev=0.5),name='w') b = tf.Variable(2.5,name='b') # 预测结果 y_pred = tf.matmul(x,weight)+b # 第三步:损失函数就出均方误差 loss = tf.reduce_mean(tf.square(y_true-y_pred)) # 第四步.梯度下降优化损失 train_op = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss) # 定义的变量进行初始化 init_op = tf.global_variables_initializer() # 保存模型的op saver = tf.train.Saver() with tf.Session() as s: s.run(init_op) # 先运行变量的初始化操作 if os.path.exists('./imgs/checkpoint'):# 加载模型 print('模型已经加载读取完毕') saver.restore(s,'./imgs/model') w = s.run('w:0') b = s.run('b:0') print(w,b) # 就是从保存好的模型文件中读取出来的两个值 else: # 保存模型 print('随机初始化的w=%f,b=%f'%(weight.eval(),s.run(b))) for i in range(1,401):# 固定迭代的次数 s.run(train_op) if i%20 == 0: print('第%d次优化后的w=%f,b=%f'%(i,weight.eval(),b.eval())) saver.save(s,'./imgs/model')