• 线性回归原理复习

1)构建模型
               |_> y = w1x1 + w2x2 + …… + wnxn + b
        2)构造损失函数
               |_> 均方误差
        3)优化损失
               |_> 梯度下降

  • 实现线性回归的训练

准备真实数据
            100样本
            x 特征值 形状 (100, 1)  100行1列
            y_true 目标值 (100, 1)
            y_true = 0.8x + 0.7    假设特征值和目标值直接的线性关系
        假定x 和 y 之间的关系 满足
            y = kx + b
            k ≈ 0.8 b ≈ 0.7
            流程分析:
            (100, 1) * (1, 1) = (100, 1)
            y_predict = x * weights(1, 1) + bias(1, 1)
            1)构建模型: 矩阵:matmul
                y_predict = tf.matmul(x, weights) + bias
            2)构造损失函数: 平均:reduce_mean  平方: square
                error = tf.reduce_mean(tf.square(y_predict - y_true))
            3)优化损失:  梯度下降的评估器GradientDescentOptimizer
                optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
            5 学习率的设置、步数的设置与梯度爆炸

  • 案例确定

  • API

  • 步骤分析

demo:

import tensorflow as tf
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression():
"""
自实现一个线性回归
:return:
"""
# 1)准备数据
with tf.variable_scope(name_or_scope='prepare_data'):
X = tf.random_normal(shape=[100, 1], mean=2)
y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定义了一个一行一列 # 2)构造模型
# 定义模型参数 用 变量
with tf.variable_scope("create_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 随机产生一个一行一列
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 随机产生一个一行一列
y_predict = tf.matmul(X, weights) + bias # 3)构造损失函数: 均方误差
with tf.variable_scope("loss_function"):
error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)优化损失
with tf.variable_scope("optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 默认0.01 # 显式地初始化变量
init = tf.global_variables_initializer() with tf.Session() as sess: # 初始化变量
sess.run(init)
# 查看初始化模型参数之后的值
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
# 开始训练
for i in range(10):
sess.run(optimizer)
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval())) if __name__ == "__main__":
linear_regression()

经过上面的训练我们可以发现,在学习率不变的情况下,迭代的次数越多,则效果越好。同理在迭代次数一定的情况下,学习率越高效果越好,但也是有一定限制的。

  • 学习率的设置、步数的设置与梯度爆炸

  • 变量的trainable设置观察

增加TensorBoard显示

1)创建事件文件
            2)收集变量
            3)合并变量
            4)每次迭代运行一次合并变量
            5)每次迭代将summary对象写入事件文件

变量dashboard显示demo:

import tensorflow as tf
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression():
"""
自实现一个线性回归
:return:
"""
# 第一步:
# 1)准备数据
X = tf.random_normal(shape=[100, 1], mean=2)
y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定义了一个一行一列 # 2)构造模型
# 定义模型参数 用 变量
# trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True) # 随机产生一个一行一列
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1])) # 随机产生一个一行一列
y_predict = tf.matmul(X, weights) + bias # 3)构造损失函数: 均方误差
error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)优化损失
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 显式地初始化变量
init = tf.global_variables_initializer() # 第二步:收集变量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias) # 第三步:合并变量
merged = tf.summary.merge_all() with tf.Session() as sess: # 初始化变量
sess.run(init) # 1_创建事件文件
file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型参数之后的值
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
# 开始训练
for i in range(100):
sess.run(optimizer)
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval())) # 运行合并变量操作
summary = sess.run(merged)
# 将每次迭代后的变量写入事件文件
file_writer.add_summary(summary, i) # i是迭代次数 if __name__ == "__main__":
linear_regression()

Tensorboard的可视化:http://ftl2018:6006/#graphs&run=.(火狐浏览器)

  • 增加命名空间

增加命名空间demo

import tensorflow as tf
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression():
"""
自实现一个线性回归
:return:
"""
# 第一步:
# 1)准备数据
with tf.variable_scope(name_or_scope='prepare_data'):
X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定义了一个一行一列 # 2)构造模型
# 定义模型参数 用 变量
# trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
with tf.variable_scope("create_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights') # 随机产生一个一行一列
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias') # 随机产生一个一行一列
y_predict = tf.matmul(X, weights) + bias # 3)构造损失函数: 均方误差
with tf.variable_scope("loss_function"):
error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)优化损失
with tf.variable_scope("optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 显式地初始化变量
init = tf.global_variables_initializer() # 第二步:收集变量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias) # 第三步:合并变量
merged = tf.summary.merge_all() with tf.Session() as sess: # 初始化变量
sess.run(init) # 1_创建事件文件
file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型参数之后的值
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
# 开始训练
for i in range(100):
sess.run(optimizer)
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval())) # 运行合并变量操作
summary = sess.run(merged)
# 将每次迭代后的变量写入事件文件
file_writer.add_summary(summary, i) # i是迭代次数 if __name__ == "__main__":
linear_regression()
  • 模型保存于加载

saver = tf.train.Saver(var_list=None,max_to_keep=5)
            1)实例化Saver
            2)保存
                saver.save(sess, path)
            3)加载
                saver.restore(sess, path)

模型保存(需要提前准备好目录)与加载demo

import tensorflow as tf
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' def linear_regression():
"""
自实现一个线性回归
:return:
"""
# 第一步:
# 1)准备数据
with tf.variable_scope(name_or_scope='prepare_data'):
X = tf.random_normal(shape=[100, 1], mean=2, name='feature')
y_true = tf.matmul(X, [[0.8]]) + 0.7 # [[0.8]] 定义了一个一行一列 # 2)构造模型
# 定义模型参数 用 变量
# trainable=False,的时候则后面的权重会不变,导致损失也不会变化太久,默认True
with tf.variable_scope("create_model"):
weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), trainable=True, name='weights') # 随机产生一个一行一列
bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name='bias') # 随机产生一个一行一列
y_predict = tf.matmul(X, weights) + bias # 3)构造损失函数: 均方误差
with tf.variable_scope("loss_function"):
error = tf.reduce_mean(tf.square(y_predict - y_true)) # 4)优化损失
with tf.variable_scope("optimizer"):
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error) # 显式地初始化变量
init = tf.global_variables_initializer() # 第二步:收集变量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias) # 第三步:合并变量
merged = tf.summary.merge_all() # 保存模型:创建Saver对象
saver = tf.train.Saver(max_to_keep=5) with tf.Session() as sess: # 初始化变量
sess.run(init) # 1_创建事件文件
file_writer = tf.summary.FileWriter("./tmp/", graph=sess.graph) # 查看初始化模型参数之后的值
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))
# 开始训练
for i in range(100):
sess.run(optimizer)
print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval())) # 运行合并变量操作
summary = sess.run(merged)
# 将每次迭代后的变量写入事件文件
file_writer.add_summary(summary, i) # i是迭代次数 # 保存模型(保存模型参数,而参数在会话中)--》路径需要先创建好
if i % 10 == 0:
saver.save(sess, "./tmp/my_linear.ckpt")
# # 加载模型
# if os.path.exists("./tmp/model/checkpoint"):
# saver.restore(sess, "./tmp/model/my_linear.ckpt") if __name__ == "__main__":
linear_regression()

  • 命令行参数设置

命令行参数使用
            1)tf.app.flags
                    tf.app.flags.DEFINE_integer("max_step", 0, "训练模型的步数")
                    tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路径+模型名字")
            2)FLAGS = tf.app.flags.FLAGS
                    通过FLAGS.max_step调用命令行中传过来的参数
            3、通过tf.app.run()启动main(argv)函数

具体调用:

命令行demo

import tensorflow as tf
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 1)定义命令行参数
tf.app.flags.DEFINE_integer("max_step", 100, "训练模型的步数")
tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路径+模型名字") # 2)简化变量名
FLAGS = tf.app.flags.FLAGS def command_demo():
"""
命令行参数演示
:return:
"""
print("max_step:\n", FLAGS.max_step)
print("model_dir:\n", FLAGS.model_dir) return None def main(argv):
print("code start", argv)
return None if __name__ == "__main__":
# 命令行参数演示
# command_demo()
tf.app.run()

AI学习---基于TensorFlow的案例[实现线性回归的训练]的更多相关文章

  1. AI学习---深度学习&TensorFlow安装

    深度学习   深度学习学习目标: 1. TensorFlow框架的使用 2. 数据读取(解决大数据下的IO操作) + 神经网络基础 3. 卷积神经网络的学习 + 验证码识别的案例   机器学习与深度学 ...

  2. 基于TensorFlow Serving的深度学习在线预估

    一.前言 随着深度学习在图像.语言.广告点击率预估等各个领域不断发展,很多团队开始探索深度学习技术在业务层面的实践与应用.而在广告CTR预估方面,新模型也是层出不穷: Wide and Deep[1] ...

  3. (第一章第六部分)TensorFlow框架之实现线性回归小案例

    系列博客链接: (一)TensorFlow框架介绍:https://www.cnblogs.com/kongweisi/p/11038395.html (二)TensorFlow框架之图与Tensor ...

  4. 基于TensorFlow的深度学习系列教程 2——常量Constant

    前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hell ...

  5. 基于TensorFlow的深度学习系列教程 1——Hello World!

    最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...

  6. 分享《机器学习实战基于Scikit-Learn和TensorFlow》中英文PDF源代码+《深度学习之TensorFlow入门原理与进阶实战》PDF+源代码

    下载:https://pan.baidu.com/s/1qKaDd9PSUUGbBQNB3tkDzw <机器学习实战:基于Scikit-Learn和TensorFlow>高清中文版PDF+ ...

  7. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...

  8. 数十种TensorFlow实现案例汇集:代码+笔记(转)

    转:https://www.jiqizhixin.com/articles/30dc6dd9-39cd-406b-9f9e-041f5cbf1d14 这是使用 TensorFlow 实现流行的机器学习 ...

  9. AI 学习路线

    [导读] 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献,内容涵盖AI入门基础知识.数据分析挖掘.机器学习.深度学习.强化学习.前 ...

随机推荐

  1. 【SQL跟踪工具】SQL Profiler 跟踪器

    什么是SQL Profiler SQL Server Profiler 是一个功能丰富的界面,用于创建和管理跟踪并分析和重播跟踪结果. 事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分 ...

  2. MySQL中间件之ProxySQL(5):线程、线程池、连接池

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL的线程 ProxySQL由多个模块组成,是一个多线 ...

  3. SpringBoot学习(六)-->SpringBoot的自动配置的原理

    Spring Boot的自动配置的原理 Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入 ...

  4. [转]C# serialPort 串口接收中this.Invoke的使用

    本文转自:https://blog.csdn.net/hjk216/article/details/72677596 转载地址:http://www.ciast.net/post/20160752.h ...

  5. 第一册:lesson fifty three。

    原文: An interesting climate. A:where do you come from? B:I come from England. A:What's the climate li ...

  6. WPF 故事版例子

    Storyboard std = new Storyboard(); DoubleAnimation a = new DoubleAnimation(); a.From =0; a.To =400; ...

  7. IIS中注册.net4.0

    1.开始-运行: 2.运行框中输入 cmd ; 3.输入命令 %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 4.回车 ...

  8. js异步编程终级解决方案 async/await

      在最新的ES7(ES2017)中提出的前端异步特性:async.await. async.await是什么 async顾名思义是“异步”的意思,async用于声明一个函数是异步的.而await从字 ...

  9. 讲讲网络模块中加解密那点儿事--AES+BASE64

    本篇文章已授权微信公众号 dasuAndroidTv(大苏)独家发布 这次想来讲讲网络安全通信这一块,也就是网络层封装的那一套加密.解密,编码.解码的规则,不会很深入,但会大概将这一整块的讲一讲. 之 ...

  10. 中文代码示例之Electron桌面应用开发初体验

    参考: 打造你的第一个 Electron 应用 首先运行下面在目录下创建package.json: $ npm init 去掉了一些无关项后内容如下: { "name": &quo ...