tensorflow入门基础
tensorflow程序一般分为两个阶段,在第一个阶段需要定义图中所有的计算。在第二个阶段就是执行计算。
1. 计算图的使用
首先在tensorflow的程序中系统会维护一个默认的计算图,通过tf.get_default_graph()
可以获取当前默认的计算图。
- 下面展示了 如何获得一个运算所属的计算图以及默认的计算图:
import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b
print(result)
# 查看张量所属的计算图
print(a.graph)
print(tf.get_default_graph())
# 没有特别指定计算图,所以张量所属图应该是默认的计算图
print(a.graph is tf.get_default_graph())
运算结果:
Tensor("add_4:0", shape=(2,), dtype=float32)
<tensorflow.python.framework.ops.Graph object at 0x119d8c550>
<tensorflow.python.framework.ops.Graph object at 0x119d8c550>
True
- 除了使用默认的计算图,tensorflow还支持通过tf.Graph函数获得新的计算图,这样的话不同的计算图上的张量和运算都不会共享。
import tensorflow as tf# 产生第一个计算图g1
g1 = tf.Graph()
with g1.as_default():# 在g1计算图中定义变量v,并设置初始值为0v = tf.get_variable("v", [2], initializer = tf.zeros_initializer()) # 产生第二个计算图g2
g2 = tf.Graph()
with g2.as_default():# 在g2计算图中定义变量v,并设置初始值为1v = tf.get_variable("v", [1], initializer = tf.ones_initializer()) # # 在计算图g1中读取变量v的取值
with tf.Session(graph = g1) as sess:tf.global_variables_initializer().run()with tf.variable_scope("", reuse=True):print(sess.run(tf.get_variable("v")))# 在计算图g1中读取变量v的取值
with tf.Session(graph = g2) as sess:tf.global_variables_initializer().run()with tf.variable_scope("", reuse=True):print(sess.run(tf.get_variable("v")))
运算结果:
runfile('/Users/lilong/Desktop/tt.py', wdir='/Users/lilong/Desktop')
[0. 0.]
[1.]
由运行结果可以看出,每个计算图中定义了名称相同的“v“变量,但是定义了不同的初始值,运行结果也显示值不同,可以看出不同的计算图可以独立运行,变量不会冲突。tensorflow不仅可以隔离运算张量,还可以指定运算的设备(tf.Graph.device),也即是管理张量的计算机制,这也就为tensorflow使用gpu提供了机制。示例:
g=tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):result=a+b
2. 张量
在tensorflow中所有的数据都是通过张量的形式表示的,张量也可以被简单理解为多维数组。其中0阶张量就是标量,也就是一个数;一阶张量为向量,也就是一维数组;n阶张量可以理解为一个n维数组。但是张量的实现并不是直接采用数组的形式,他只是对tensorflow运算结果的一个引用,里面保存的并不是真正的数字结果,保存的而是这些数字的计算过程,这也是为什么tensorflow程序初始化后还要打开会话运行才能得到张量的运算结果。
import tensorflow as tf
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result=tf.add(a,b,name='add')
print('result:',result)
结果:
result: Tensor("add:0", shape=(2,), dtype=float32)
这里的显示表明得到的结果是一个张量的结构,并没有进行真正的计算。这里显示了张量的三个属性:名字、维度、类型。
张量的第一个属性名字是其唯一的标示符,同样也给出了该标量是如何计算出来的。其命名方式是:node:src_output
的形式。其中node是节点的名称,src_output表示当前张量来自节点的第几个输出。
张量的第二个属性是张量的维度。比如上述的shape(2,)就代表是个一维数组,长度为2。
张量的第三个属性是类型。这里要注意的是tensorflow会对运算的所有张量进行类型检查,当发现不匹配时会报错,即是运算的张量类型必须一致。
张量的两个用途:
- 第一个是对中间结果的引用。当一个计算模型很复杂时,会包含很多的中间计算结果,通过张量可以大大提高代码的可读性。
- 第二个用处是当计算图构造完成时,通过张量可以获得计算结果,也就是真实的数值。虽然张量本身没有存储具体的数字,但通过会话
tf.session().run(result)
就可以得到具体的数字。这里的意思也就是说,通过张量可以大大使代码明了清晰,会话计算结果时不用引用一大段定义和参数,直接应用一个定义好的张量就可以了。
3. 会话
在定义好所有的运算之后,会话拥有并管理tensorflow的程序运行时的所有资源,当所有的计算完成后需要关闭会话并帮助系统收回资源,否则会出现资源泄漏的问题。
3.1 tensorflow的会话有两种形式:
- 第一种是需要明确调用的会话生成函数和关闭会话函数。
# 创建一个会话。
sess = tf.Session()
# 使用会话得到之前计算的结果。
print(sess.run(result))
# 关闭会话使得本次运行中使用到的资源可以被释放。
sess.close()
使用第一种模式,在所有的计算完成后,需要明确调用session.close()
函数来关闭会话,并释放资源,但是由于一些原因,关闭会话可能不会被执行从而导致资源泄漏。所以不推荐这种方式来使用会话。
- 第二种是使用python的上下文管理器来使用会话。
# 不需要再调用session.close()来关闭会话,当上下文退出时会话关闭和资源释放也自动完成了
with tf.Session() as sess:print(sess.run(result))
这里是使用python的上下文管理器来的机制来管理这个会话,这样即解决了异常退出时资源释放的问题,同时也解决了忘记调用session.close函数而产生的资源泄漏。
3.2 指定默认会话
上面介绍过说tensorflow会自动生成一个默认的计算图,如果没有指定,运算会自动加入这个计算图中。tensorflow会话也有类似的机制,但其不会自动生成默认的会话,而需要手动指定默认会话,当默认的会话被指定后就可以通过tf.tensor.eval()
函数来计算一个张量的取值了。
sess = tf.Session()
with sess.as_default():print(result.eval())
而上述计算result的方法还可以通过以下方式实现:
sess = tf.Session()
# 下面的两个命令有相同的功能。
print(sess.run(result)) # 会话调用计算
print(result.eval(session=sess)) # 张量直接eval计算
- 这里还有一种:使用
tf.InteractiveSession
构建会话:
在交互式环境下(比如python),通过设置默认会话的方式来获取张量更加方便,所以tendorflow提供了一种交互式环境下直接构建默认会话的函数,那就是 tf.InteractiveSession
,这个函数会自动将生成的会话注册为默认会话:
sess = tf.InteractiveSession ()
# 默认会话下的直接张量调用计算
print(result.eval())
sess.close()
通过tf.InteractiveSession函数可以省去将产生的会话注册为默认会话的过程。
- 通过ConfigProto配置会话
config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
通过ConfigProto可以配置类似并行的线程数、gpu分配策略、运算超时时间等参数,在这些参数中,最常用的有两个。
第一个是allow_soft_placement:当为true时,在某些情况下(gpu无法直接计算)可以将gpu的计算放到cpu上进行。这个参数的默认值为false,但是一般情况下都设置为true,这个是为了使代码的可移植性更强。也即是在某些情况下gpu无法计算,在不报错的情况下可以移植到cpu上继续计算。
第二个参数是log_device_placement,当为true时日志中将会记录每个节点被安排在了哪个设备上方便调试。而在生产环境中将这个参数设为false可以减少日志量。
以上只是tensorflow的一些基础,但很有必要要掌握。
参考:《Tensorflow实战Google深度学习框架》
tensorflow入门基础相关推荐
- TensorFlow——入门基础
TensorFlow原理: TensorFlow使用Graph来描述计算任务,图中的节点被称之为op.一个op可以接受0或多个tensor作为输入,也可产生0或多个tensor作为输出.任何一个Gra ...
- TensorFlow入门教程(1)安装、基础、Tensorboard
TensorFlow入门教程 本教程适合人群: - 会些python但不是特别精通 - 机器学习的初学者 本教程预计耗时: - 2-3小时 本教程预计效果: - 掌握TensorFlow的基础操作 - ...
- LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用
LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...
- TensorFlow入门:第一个机器学习Demo
TensorFlow入门:第一个机器学习Demo 2017年12月13日 20:10:23 阅读数:8604 本文主要通过一个简单的 Demo 介绍 TensorFlow 初级 API 的使用方法,因 ...
- 从 TensorFlow 入门机器学习
写在前面:紧跟时代步伐,开始学习机器学习,抱着争取在毕业之前多看看各个方向是什么样子的心态,发现这是一个很有潜力也很有趣的领域(keng).// 然后就开始补数学了-- 0 TensorFlow 介绍 ...
- Tensorflow 入门教程
Tensorflow 入门教程 http://tensornews.cn/ 深度学习发展史 特征工程 深度学习之激活函数 损失函数 反向传播算法 [上] 反向传播算法 [下] Tensorflow ...
- 比官方更简洁的Tensorflow入门教程
声明: 参考自Python TensorFlow Tutorial – Build a Neural Network,本文简化了文字部分 文中有很多到官方文档的链接,毕竟有些官方文档是中文的,而且写的 ...
- (转)tensorflow入门教程(二十六)人脸识别(上)
https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...
- 吴恩达深度学习课程-Course 2 改善深层神经网络 第三周 TensorFlow入门编程作业
虽然申请书的ddl临近,但还是先写写编程作业- 编程作业的代码用的是tf1,而我的环境为tf2,所以 TensorFlow入门 TensorFlow教程 1 - 探索Tensorflow库 1.1 - ...
最新文章
- 如何使用WindowsLiveWriter发文章
- 【原创】CGAL中,2D Arrangements学习笔记
- cmd运行Java中文乱码,无法加载主类Error: Could not find or load main class
- vscode pylint报错的问题
- 尝鲜Ubuntu Server 12.04 LTS
- Yii的应用主体的配置
- 服务器系统装软路由,服务器系统设置软路由
- 超融合将成为数据中心技术应用主流
- 为什么说“不要教你的孩子学编程”?
- 《论语》《大学》《中庸》和孟子
- Win7双屏显示设置
- 基于ATmega128单片机的LCD12864显示密码锁
- android 7.0 root工具,KingRoot全球率先实现Android 7.0一键 Root
- 碳足迹PCF国内外标准和碳标签应用
- ISO/IEC 9126软件质量标准
- SM2269XT固态硬盘使用量产工具开卡成功
- 掌握好亚马逊品类销量排名规则助力备战旺季!
- html5无序列表,有序列表,定义列表,组合标签,div分区标签
- ABAP 中长文本处理(此例利用长文本特性开发简历模板)CL_GUI_TEXTEDIT
- PowerDesigner 批量添加字段
热门文章
- VTK:Disk用法实战
- C语言插入排序Insertion Sort算法(附完整源码)
- QT的QSGMaterialShader类的使用
- C++初始化和关闭roscpp节点
- linux新建备份数据库的脚本文件,Linux下shell脚本:自动每日备份网站文件和数据库上传FTP空间...
- linux dd devzero,makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令
- C语言文件操作函数的编写
- Oracl数据库管理方面的资料(查询sga,查看oracle数据库名称sid,查看oracle数据库名称,查看表空间,修改表空间名称,数据库管理,sqlPlus数据显示)
- Mysql索引基本概念及案例总结(含索引的使用注意事项)
- Python回归模型评估