【学习笔记】tensorflow实现一个简单的线性回归
准备知识
Tensorflow运算API
矩阵运算:tf.matmul(x, w)
平方:tf.square(error)
均值:tf.reduce_mean(error)
梯度下降API
tf.train.GradientDescentOptimizer(learning_rate):梯度下降优化
- learning_rate:学习率
- return:梯度下降op
简单的线性回归的实现
# 准备数据
x = tf.random_normal([200, 1], mean=1.2, stddev=0.6, name="x")
y = tf.matmul(x, [[0.5]]) + 0.8
# 建立线性回归模型
weight = tf.Variable(tf.random_normal([1, 1], mean=0, stddev=1.0), name="weight")
bais = tf.Variable(0.0, name="bais")
# 预测值
y_predict = tf.matmul(x, weight) + bais
# 损失函数,均方误差
loss = tf.reduce_mean(tf.square(y - y_predict))
# 梯度下降优化损失
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)
for i in range(200):
sess.run(train_op)
print("第%d次优化的权重为%f,偏置为%f" % (i, weight.eval(), bais.eval()))
部分运行结果:
第0次优化的权重为1.317120,偏置为-0.072556
第1次优化的权重为1.240519,偏置为-0.088773
第2次优化的权重为1.199426,偏置为-0.078846
第3次优化的权重为1.152779,偏置为-0.071317
第4次优化的权重为1.125252,偏置为-0.052198
第5次优化的权重为1.097908,偏置为-0.033999
第6次优化的权重为1.081992,偏置为-0.010126
...
第194次优化的权重为0.503366,偏置为0.795440
第195次优化的权重为0.503219,偏置为0.795541
第196次优化的权重为0.503130,偏置为0.795662
第197次优化的权重为0.503025,偏置为0.795741
第198次优化的权重为0.502987,偏置为0.795893
第199次优化的权重为0.502896,偏置为0.796023
建立事件文件
tf.summary.FileWriter("./temp/tf/summary/test", graph=sess.graph)
打开TensorBoard:
$ tensorboard --logdir="./temp/tf/summary/test"
上图的图形比较乱,怎样才能更加的直观呢?
变量作用域
tensorflow提供了变量作用域和共享变量这样的概念,有几个重要的作用。
- 让模型代码更加清晰,作用分明
通过tf.variable_scope()创建指定名字的变量作用域
上例加上变量作用域
with tf.variable_scope("data"):
# 准备数据
x = tf.random_normal([200, 1], mean=1.2, stddev=0.6, name="x")
y = tf.matmul(x, [[0.5]]) + 0.8
with tf.variable_scope("model"):
# 建立线性回归模型
weight = tf.Variable(tf.random_normal([1, 1], mean=0, stddev=1.0), name="weight")
bais = tf.Variable(0.0, name="bais")
# 预测值
y_predict = tf.matmul(x, weight) + bais
with tf.variable_scope("loss"):
# 损失函数,均方误差
loss = tf.reduce_mean(tf.square(y - y_predict))
with tf.variable_scope("optimizer"):
# 梯度下降优化损失
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
再次观察图形:
增加变量显示
目的:观察模型的参数、损失值的变化情况
1、收集变量
tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值
tf.summary.histogram(name=‘’,tensor) 收集高维度的变量参数
tf.summary.image(name=‘’,tensor) 收集输入的图片张量能显示图片
2、合并变量写入事件文件
merged = tf.summary.merge_all()
运行合并:summary = sess.run(merged),每次迭代都需运行
添加:FileWriter.add_summary(summary,i),i表示第几次的值
收集上例中的损失、权重
# 收集tensor
tf.summary.scalar("losses", loss)
tf.summary.histogram("weights", weight)
# 定义合并tensor的op
merged = tf.summary.merge_all()
合并到事件流
# 运行合并的tensor
summary = sess.run(merged)
fw.add_summary(summary, i)
模型的保存与加载
在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用。模型的保存和恢复也是通过tf.train.Saver类去实现,它主要通过将Saver类添加OPS保存和恢复变量到checkpoint。它还提供了运行这些操作的便利方法。
tf.train.Saver(var_list=None,max_to_keep=5)
- var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递.
- max_to_keep:指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件。)
自定义命令行参数
tf.app.run(),默认调用main()函数,运行程序。main(argv)必须传一个参数。
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)
第一个也就是参数的名字,路径、大小等等。第二个参数提供具体的值。第三个参数是说明文档
tf.app.flags.FLAGS,在flags有一个FLAGS标志,它在程序中可以调用到我们前面具体定义的flag_name.
【学习笔记】tensorflow实现一个简单的线性回归的更多相关文章
- Linux系统学习笔记之 1 一个简单的shell程序
不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- Django 学习笔记之六 建立一个简单的博客应用程序
最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...
- [原创]java WEB学习笔记12:一个简单的serlet连接数据库实验
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
- Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境
Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...
- 【Python学习笔记三】一个简单的python爬虫
这里写爬虫用的requests插件 1.一般那3.x版本的python安装后都带有相应的安装文件,目录在python安装目录的Scripts中,如下: 2.将scripts的目录配置到环境变量pa ...
- DuiLib学习笔记2——写一个简单的程序
我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...
- avalonjs学习笔记之实现一个简单的查询页
官网地址:http://avalonjs.coding.me/ 因为是为了学习js,所以对样式没什么要求,先放效果图: 步骤为:初始页面-------条件查询-------编辑员工1-------保存 ...
随机推荐
- Spring Security 整合freemaker 实现简单登录和角色控制
Spring Security 整合freemaker 实现简单登录和角色控制 写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...
- linux mysql 安装
操作系统 Centos 7.2以上版本 操作系统 centos 7.2以上版本 mysql 版本 mysql-5.7.23-el7-x86_64.tar.gz 1.1 安装准备 1. 创建安装文件存 ...
- react 引用 layer (防忘记)
1.先到 百度静态资源公共库 (http://cdn.code.baidu.com/)找到jquery和layer地址 2.找到./public/index.html 引入jquery和layer 3 ...
- 琐事集 vol 2
vol 2-0 宝宝,你是不是该看书咯? 她正瘫在沙发上看剧 我刚提起看书,她惊恐地看了看我 然后眼白一翻,彻底地瘫平了 宝宝? “宝宝睡着了.” 你下周就要考护师了!很难得,她认真地睁开眼,信誓旦旦 ...
- Java面试中笔试题——Java代码真题,这些题会做,笔试完全可拿下!
大家好,我是上海尚学堂Java培训老师,以下这些Java笔试真题是上海尚学堂Java学员在找工作中笔试遇到的真题.现在分享出来,也写了参考答案,供大家学习借鉴.想要更多学习资料和视频请留言联系或者上海 ...
- [Swift]LeetCode543. 二叉树的直径 | Diameter of Binary Tree
Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...
- Pytorch入门实例:mnist分类训练
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'denny' __time__ = '2017-9-9 9:03' import ...
- 设计模式的征途—4.抽象工厂(Abstract Factory)模式
上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...
- redis 系列26 Cluster高可用 (1)
一.概述 Redis集群提供了分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能.在大数据量方面的高可用方案,cluster集群比Sentinel有优势.但Redis集群并不支持处 ...
- MacPro4,1升级到MacPro5,1
收了一台老MacPro,2009年版本,准确型号是"MacPro4,1".机器很好,美中不足的是,太老了.硬件还好说,很多部件都可以单独采购升级,特别是有了淘宝,几乎只要有的东西, ...