TensorFlow 1.x学习(系列二 :4):自实现线性回归

2023-11-03

线性回归基本介绍

线性回归: w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + . . . + w n ∗ x n + b i a s w_1 * x_1 + w_2 * x_2 + w_3 * x_3 + ...+ w_n * x_n + bias w1x1+w2x2+w3x3+...+wnxn+bias

1:准备好1特征1目标值(都为100行1列)

y = x ∗ 0.7 + 0.8 y = x * 0.7 + 0.8 y=x0.7+0.8

2: 建立模型 随机初始化准备一个权重w,一个向量b

y p r e d i c t = x ∗ w + b y_{predict} = x * w + b ypredict=xw+b

3:求损失函数,误差

loss 均方误差: ( y 1 − y 1 ′ ) 2 + ( y 2 − y 2 ′ ) 2 + ( y 3 − y 3 ′ ) 2 + . . . + ( y 100 − y 100 ′ ) 2 (y_1-y_1^{'})^2 + (y_2-y_2^{'})^2 + (y_3-y_3^{'})^2 + ... + (y_{100}-y_{100}^{'})^2 (y1y1)2+(y2y2)2+(y3y3)2+...+(y100y100)2

4:梯度下降优化

矩阵相乘:

(m行,n行) * (n行,1)(m行,1)

常用的op

矩阵运算:

tf.matmul(x,w)

平方:

tf.square(error)

均值:

tf.reduce_mean(error)

梯度下降优化:

tf.train.GradientDescentOptimizer(learning_rate)

- learning_rate:学习率

- method:

    minize(loss)

- return:梯度下降op

自实现线性回归预测

import tensorflow as tf
# 1.准备数据 x:特征值 [100,1] y 目标值[100]
x = tf.random_normal([100,1], mean = 1.75, stddev = 0.5,name = "x_data")

# 矩阵相乘必须是二维的
y_ture = tf.matmul(x,[[0.7]]) + 0.8

# 2.建立线性回归模型,1个特征,1个权重,一个偏置 y = xw + b
# 随机给一个权重和p偏置的值,计算损失,然后在当前状态下优化
# 用变量定义才能优化

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

# 3.建立损失函数,均方误差
loss = tf.reduce_mean(tf.square(y_ture - y_predict))

# 4.梯度下降优化损失 leaning_rate:0.01,0.03,0.1,0.3,......
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()

# 通过会话运行程序
with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 循环运行优化
    for i in range(200):
        sess.run(train_op)
    
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))

随机初始化的参数权重为:-1.260226, 偏置为:0.000000
第0次优化的参数权重为:0.349570, 偏置为:0.856385
第1次优化的参数权重为:0.554503, 偏置为:0.966013
第2次优化的参数权重为:0.590992, 偏置为:0.982879
第3次优化的参数权重为:0.600176, 偏置为:0.984269
第4次优化的参数权重为:0.602949, 偏置为:0.982530
第5次优化的参数权重为:0.603653, 偏置为:0.980223
第6次优化的参数权重为:0.602477, 偏置为:0.976848
第7次优化的参数权重为:0.604590, 偏置为:0.975368
......
第193次优化的参数权重为:0.689427, 偏置为:0.819917
第194次优化的参数权重为:0.689293, 偏置为:0.819553
第195次优化的参数权重为:0.689415, 偏置为:0.819265
第196次优化的参数权重为:0.689980, 偏置为:0.819289
第197次优化的参数权重为:0.690093, 偏置为:0.819089
第198次优化的参数权重为:0.689954, 偏置为:0.818728
第199次优化的参数权重为:0.689771, 偏置为:0.818355

tensorflow 变量作用域

tf.variable_scope(<scope_name>):创建指定名字的变量作用域

import tensorflow as tf
with tf.variable_scope("data"):
    x = tf.random_normal([100,1], mean = 1.75, stddev = 0.5,name = "x_data")
    # 矩阵相乘必须保持数据是二维的
    y_ture = tf.matmul(x,[[0.7]]) + 0.8

with tf.variable_scope("model"):
    # 随机给一个权重和p偏置的值,计算损失,然后在当前状态下优化
    # 用变量定义才能优化
    # trainable参数:指定这个变量能顺着梯度下降一起优化
    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"):
    # 3.建立损失函数,均方误差
    loss = tf.reduce_mean(tf.square(y_ture - y_predict))

with tf.variable_scope("optimizer"):
    # 4.梯度下降优化损失 leaning_rate:0.01,0.03,0.1,0.3,......
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()

# 通过会话运行程序
with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 把图结构写入事件文件
    filewriter = tf.summary.FileWriter("./tmp/summary/test2",graph = sess.graph)

    # 循环运行优化
    for i in range(200):
        sess.run(train_op)
    
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))
随机初始化的参数权重为:-0.364948, 偏置为:0.000000
第0次优化的参数权重为:0.660532, 偏置为:0.544167
第1次优化的参数权重为:0.773921, 偏置为:0.608918
第2次优化的参数权重为:0.791829, 偏置为:0.620703
第3次优化的参数权重为:0.793604, 偏置为:0.624149
第4次优化的参数权重为:0.788609, 偏置为:0.624627
第5次优化的参数权重为:0.791536, 偏置为:0.627871
第6次优化的参数权重为:0.789608, 偏置为:0.629258
第7次优化的参数权重为:0.789247, 偏置为:0.631952
第8次优化的参数权重为:0.790944, 偏置为:0.635684
......
第194次优化的参数权重为:0.709682, 偏置为:0.782486
第195次优化的参数权重为:0.709192, 偏置为:0.782562
第196次优化的参数权重为:0.709601, 偏置为:0.783022
第197次优化的参数权重为:0.709102, 偏置为:0.782941
第198次优化的参数权重为:0.709275, 偏置为:0.783254
第199次优化的参数权重为:0.709096, 偏置为:0.783376

体现在tensorboard上:下图出现多个optimizer的原因可能是在notebook上运行时,如果重复执行原来的代码,变量名也会自动改变,默认了之前的模型是存在的。需要注意的是,在加载保存的模型时需要注意,重复运行包含op在内的代码会导致模型加载不出来,因为名称已变。

请添加图片描述

模型的保存和加载

  • tf.train.Saver(var_list = None,max_to_keep=5)

    • var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递

    • max_to_keep: 指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5,即保留最新的5个检查点文件。

  • 例如: saver.save(sess,‘/temp/ckpt/test/model’)
    saver.restore(sess,‘/temp/ckpt/test/model’)

  • 保存文件格式:checkpoint文件(检查点文件)

初次运行模型并保存

# 保存运行了500步的模型,下次直接从500步开始
import tensorflow as tf

with tf.variable_scope("data"):
    x = tf.random_normal([100,1], mean = 1.75, stddev = 0.5,name = "x_data")
    # 矩阵相乘必须保持数据是二维的
    y_ture = tf.matmul(x,[[0.7]]) + 0.8

with tf.variable_scope("model"):
    # 随机给一个权重和p偏置的值,计算损失,然后在当前状态下优化
    # 用变量定义才能优化
    # trainable参数:指定这个变量能顺着梯度下降一起优化
    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"):
    # 3.建立损失函数,均方误差
    loss = tf.reduce_mean(tf.square(y_ture - y_predict))

with tf.variable_scope("optimizer"):
    # 4.梯度下降优化损失 leaning_rate:0.01,0.03,0.1,0.3,......
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 收集tensor
tf.summary.scalar("losses",loss)
#tf.summary.scalar("weights1",weight) # weight一般是高维的要用histogram,但是由于这里是一维所以用scalar
tf.summary.histogram("weights2",weight) # 高维度的情况下一般用histogram

# 定义合并tensor的op
merged = tf.summary.merge_all()

# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()

# 定义一个保存模型的实例
saver = tf.train.Saver()

# 通过会话运行程序
with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 把图结构写入事件文件
    filewriter = tf.summary.FileWriter("tmp/summary/test",graph = sess.graph)

    # 循环运行优化
    for i in range(500):
        sess.run(train_op)
        
        # 运行合并的tensor
        summary = sess.run(merged)
        
        filewriter.add_summary(summary,i)
        
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))
    saver.save(sess,"tmp/ckpt/model")
随机初始化的参数权重为:-0.265290, 偏置为:0.000000
第0次优化的参数权重为:0.668151, 偏置为:0.499340
第1次优化的参数权重为:0.796031, 偏置为:0.570753
第2次优化的参数权重为:0.813327, 偏置为:0.583293
第3次优化的参数权重为:0.811708, 偏置为:0.586319
第4次优化的参数权重为:0.809507, 偏置为:0.588334
第5次优化的参数权重为:0.811250, 偏置为:0.592284
第6次优化的参数权重为:0.813352, 偏置为:0.596134
。。。
第495次优化的参数权重为:0.700331, 偏置为:0.799402
第496次优化的参数权重为:0.700326, 偏置为:0.799410
第497次优化的参数权重为:0.700312, 偏置为:0.799412
第498次优化的参数权重为:0.700302, 偏置为:0.799414
第499次优化的参数权重为:0.700309, 偏置为:0.799429

直接加载模型再次运行,可以看到模型的权重和偏置是接着上次运行的结果进一步运行的

with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
    if os.path.exists("tmp/ckpt/checkpoint"):
        saver.restore(sess,"tmp/ckpt/model")
    
    # 循环运行优化
    for i in range(500):
        sess.run(train_op)
        
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))
随机初始化的参数权重为:-1.206198, 偏置为:0.000000
INFO:tensorflow:Restoring parameters from tmp/ckpt/model
第0次优化的参数权重为:0.700308, 偏置为:0.799436
第1次优化的参数权重为:0.700309, 偏置为:0.799444
第2次优化的参数权重为:0.700299, 偏置为:0.799446
第3次优化的参数权重为:0.700287, 偏置为:0.799447
第4次优化的参数权重为:0.700289, 偏置为:0.799456
第5次优化的参数权重为:0.700291, 偏置为:0.799465
第6次优化的参数权重为:0.700283, 偏置为:0.799469
第7次优化的参数权重为:0.700294, 偏置为:0.799482
第8次优化的参数权重为:0.700279, 偏置为:0.799485
。。。
第491次优化的参数权重为:0.700001, 偏置为:0.799998
第492次优化的参数权重为:0.700001, 偏置为:0.799998
第493次优化的参数权重为:0.700001, 偏置为:0.799998
第494次优化的参数权重为:0.700001, 偏置为:0.799998
第495次优化的参数权重为:0.700001, 偏置为:0.799998
第496次优化的参数权重为:0.700001, 偏置为:0.799998
第497次优化的参数权重为:0.700001, 偏置为:0.799998
第498次优化的参数权重为:0.700001, 偏置为:0.799998
第499次优化的参数权重为:0.700001, 偏置为:0.799998

自定义命令行参数

1.tf.app.flags,它支持应用从命令行接受参数,可以用来指定集群配置等。在tf.app.flags下面有各种定义参数的类型

  • DEFINE_string(flag_name,default_value,docstring)

  • DEFINE_integer(flag_name,default_value,docstring)

  • DEFINE_boolean(flag_name,default_value,docstring)

  • DEFINE_float(flag_name,default_value,docstring)

2.tf.app.flags,在flags中有一个FLAGS标志,它在程序中可以调用到我们前边具体定义的flag_name

3.通过tf.app.run()启动main(argv)函数

模型训练

import tensorflow as tf

# 定义命令行参数
# 1、首先定义有哪些参数需要在运行的时候指定
# 2、程序当中获取定义命令行参数

# 第一个参数:名字,默认值,说明
tf.app.flags.DEFINE_integer("max_step",100,"模型训练的步数")
tf.app.flags.DIFINE_integer("model_dir"," ","模型文件的加载路径")

# 定义获取命令行参数名字
FLAGS = tf.app.flags.FLAGS

with tf.variable_scope("data"):
    x = tf.random_normal([100,1], mean = 1.75, stddev = 0.5,name = "x_data")
    # 矩阵相乘必须保持数据是二维的
    y_ture = tf.matmul(x,[[0.7]]) + 0.8

with tf.variable_scope("model"):
    # 随机给一个权重和p偏置的值,计算损失,然后在当前状态下优化
    # 用变量定义才能优化
    # trainable参数:指定这个变量能顺着梯度下降一起优化
    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"):
    # 3.建立损失函数,均方误差
    loss = tf.reduce_mean(tf.square(y_ture - y_predict))

with tf.variable_scope("optimizer"):
    # 4.梯度下降优化损失 leaning_rate:0.01,0.03,0.1,0.3,......
    train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 收集tensor
tf.summary.scalar("losses",loss)
#tf.summary.scalar("weights1",weight) # weight一般是高维的要用histogram,但是由于这里是一维所以用scalar
tf.summary.histogram("weights2",weight) # 高维度的情况下一般用histogram

# 定义合并tensor的op
merged = tf.summary.merge_all()

# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()

# 定义一个保存模型的实例
saver = tf.train.Saver()

# 通过会话运行程序
with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 把图结构写入事件文件
    filewriter = tf.summary.FileWriter("tmp/summary/test",graph = sess.graph)

    # 循环运行优化
    for i in range(500):
        sess.run(train_op)
        
        # 运行合并的tensor
        summary = sess.run(merged)
        
        filewriter.add_summary(summary,i)
        
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))
    saver.save(sess,"tmp/ckpt/model")

模型调用

with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    
    # 打印随机最先初始化的权重和偏置
    print("随机初始化的参数权重为:%f, 偏置为:%f" %(weight.eval(),bias.eval()))
    
    # 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
    if os.path.exists("tmp/ckpt/checkpoint"):
        saver.restore(sess,FLAGS.model_dir)
    
    # 循环运行优化
    for i in range(FLAGS.max_step):
        sess.run(train_op)
        
        print("第%d次优化的参数权重为:%f, 偏置为:%f" % (i,weight.eval(),bias.eval()))
    saver.save(sess,FLAGS.model_dir)

命令行代码:

python XXX.py --max_step=500 --model_dir="./tmp/ckpt/model"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow 1.x学习(系列二 :4):自实现线性回归 的相关文章

随机推荐

  • 运算放大电路的基础(秒懂)

    运算放大器 下文简称运放 理想的运放 它的输入阻抗无穷大 输出阻抗为零 理想的运放电路分析有两大重要原则贯穿始终 即 虚短 与 虚断 虚短 的意思是正端和负端接近短路 即V V 看起来像 短路 虚断 的意思是流入正端及负端的电流接近于零 即
  • 【C语言】输入一个N阶矩阵,将其转置后输出。利用指针

    解题思路 将接收到的矩阵存入一个3 3的数组 编写一个函数 从主函数传来一个指向该数组的指针 利用多维数组指针运用规律 实现数组的转置 最后输出转置后的数组 矩阵转置上一篇有讲 C语言 N 阶矩阵的转置 魚肉的博客 CSDN博客 c语言n阶
  • word分页保存_Word邮件合并功能详解:合并后生成多个word文档,删除空白页

    最近在实习 干了很多打杂的工作 所以office软件用的很多很多 瞬间觉得自己可以去裸考计算机二级了哈哈哈哈哈哈 今天因为工作用到了邮件合并这个功能 但又比我之前所学的更深一些 所以我来写下这一篇详解 一 预期达到效果 这是一个信函模板 我
  • MQ是什么

    目录 MQ是什么 MQ是什么 MQ全称为Message Queue 也就是消息队列 是应用程序和应用程序之间的通信方法 在微服务盛行的当下 MQ被使用的也是越来越多 一般常用来进行 业务异步解耦 解耦微服务 流量削峰填谷 消息分发 分布式事
  • 【Shell牛客刷题系列】SHELL1 统计文件的行数:学习wc命令和文本三剑客awk、grep、sed命令

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Linux 欢迎关注专栏 本文知识预告 首先学习用于统计文件的字节数 单词数 行数等信息的
  • openwrt网络配置

    openwrt网络配置 1 OpenWrt命令行配置固定IP地址 1 OpenWrt命令行配置固定IP地址 输入命令查看现有的网络接口配置信息 uci show network 接口名称通常为lan 使用以下命令配置网络 uci set n
  • springboot如何去集成腾讯云的短信服务

    1 先去申请一个微信公众号 通过微信公众号 以个人的名义去申请腾讯短信服务 2 填写你注册公众号要注册成啥类型的 如果是自己玩或者自己测试的话我推荐大家呢去注册这个订阅号他这个呢比较好注册 然后去填写自己的相关的信息 3注册成功了 就会生成
  • node.js开源文件服务器,本地node.js服务器搭建

    本地node js服务器搭建并通过浏览器访问服务器 1 2 3 github下载express https github com expressjs express 1 首先 检查是否安装了node和npm 要检查是否安装了Node js
  • ES去重查询

    ES去重查询 查询语句 查询语句 collapse field 过滤的字段 query bool 我想 查询es的某索引下某个字段有多少种类值 比如我想知道用户表里面一共有多少个不同的名字 也就是查询名字时候将重复的名字去掉 使用上面的语句
  • 11C++11多线程编程之async、future、packaged_task、promise、std::shared_future

    1 async与future开启一个后台任务 1 1 概念 1 async 函数模板 称为异步机制 参数为可调用对象 返回值为一个future类型的值 2 future 类模板 future对象里会存放一个值 在将来的某个时刻能够拿到 实际
  • promise(3)如何修改promise的状态

    文章目录 如何修改promise的状态 一个promise指定多个成功 失败的回调函数 都会调用吗 如何修改promise的状态 1 修改promise状态的几种方式 1 resolve value 如果当前状态是pending就会变为re
  • 安装好环境但用户使用不了conda命令,“conda: command not found”

    首先明确自己的conda环境装在哪里 我这里以conda环境装在 d miniconda3这个目录为例 然后vim bashrc在其中加上如下代码 其中 d miniconda3换为你自己环境中的conda环境位置 conda setup
  • [C#] 计算字符串在控制台上显示的宽度, 包含所有Char能表示的字符!

    通过运算 获取字符串在控制台上现实的宽度 单位为一个英文字母的宽度 高度为控制台中一行的高度 在网上找了半天 唯一一个正儿八经的 就是通过GBK编码的字节数来推测所占宽度 但我认为这个有点不大妥当 例如某些特殊字符 可能就不被GBK编码包含
  • 锚点定位内容被遮挡,css解决方案

    问题 头部header使用position fixed 下方内容用锚点定位跳转 内容部分被header遮挡 解决 1 在跳转的内容上方加个空div 2 锚点id加到空div上 空div写css并设置样式
  • java 20个IDEA最常用的快捷键 介绍及演示

    目录 一 前言 二 20个常用快捷键的演示 1 撤销和反撤销 Ctrl z 和 Ctrl y 注意Ctrl y 2 复制当前行 可多选 Ctrl d 3 删除当前行 可多选 Ctrl e 非默认 4 移动当前行 可多选 Alt Shift
  • 数据结构视频教程 -《零基础学算法》

    打包下载请访问 史上最全的数据结构视频教程系列分享之 零基础学算法 转载请保留出处和链接 更多优秀资源请访问 我是码农 本教程主要分为上 下两部分 共10章 上篇用5章的篇幅介绍了算法和数据结构的基础知识 包括基础算法思想 简单数据结构 复
  • [QT编程系列-5]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:事件(用于与系统的交互)、信号(对象与对象之间的通信)

    目录 2 QT程序的运行框架 2 5 事件的捕获与处理 2 5 1 QT 事件与信号的区别 2 5 2 QT程序架构 2 5 3 QT的事件机制 2 QT程序的运行框架 2 5 事件的捕获与处理 2 5 1 QT 事件与信号的区别 在Qt中
  • 《原力计划文章》专栏目录

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 专栏简介 原力计划文章 专栏收集的是老猿2021年参与CSDN原力计划的所有文章 二 文章目录 用Python通过摄像头进行视频录制 Pyth
  • 中国天气网全城市代码weather_cityId

    Ctrl F 查询 城市名字 http mobile weather com cn data forecast 101010100 html 1381891660081 北京 gt 101010100 海淀 gt 101010200 朝阳
  • TensorFlow 1.x学习(系列二 :4):自实现线性回归

    目录 线性回归基本介绍 常用的op 自实现线性回归预测 tensorflow 变量作用域 模型的保存和加载 自定义命令行参数 线性回归基本介绍 线性回归 w 1 x 1