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
  • 求出损失函数(误差)的结果
    • 均方误差:y是真实值y'是预测值
      • ((y1-y1')^2+(y2-y2')^2+...+(yn-yn')^2)/n
  • 使用梯度下降降低损失(梯度下降不需要手动实现,TensorFlow中有对应的API,只需要指定学习率即可)
  • TensorFlow运算的API
    • 矩阵运算:tf.matmul(a,b)
    • 平方:tf.square(x)
    • 均值:tf.reduce_mean()
  • 梯度下降API
    • 类:tf.train.GradientDescentOptimizer(learning_rate)
      • 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:表示保存模型的路径,携带模型的名称(任意名称)
  • 在会话运行时加载模型:
    • if os.path.exists('./xxx/checkpoint'):
      • saver.restore(session,'path')
  • 模型的加载
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')
原文地址:https://www.cnblogs.com/wgwg/p/13435186.html