zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    面向对象三大特性?
    final finally finalize区别?
    LeetCode122-买卖股票的最佳时机2(贪心算法)
    LeetCode119-杨辉三角2(题目有Bug,动态规划)
    九度OJ 1051:数字阶梯求和 (大数运算)
    九度OJ 1050:完数 (数字特性)
    九度OJ 1049:字符串去特定字符 (基础题)
    九度OJ 1048:判断三角形类型 (基础题)
    九度OJ 1047:素数判定 (素数)
    九度OJ 1046:求最大值 (基础题)
  • 原文地址:https://www.cnblogs.com/wgwg/p/13435186.html
Copyright © 2011-2022 走看看