第五节,TensorFlow编程基础案例-session使用(上)
在第一节中我们已经介绍了一些TensorFlow的编程技巧;第一节,TensorFlow基本用法,但是内容过于偏少,对于TensorFlow的讲解并不多,这一节对之前的内容进行补充,并更加深入了解讲解TensorFlow.
TesorFlow的命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。TensorFlow是张量从图像的一端流动到另一端的计算过程,这也是TensorFlow的编程模型。
TensorFlow编程基础上主要介绍session的创建,以及session与图的交互机制,最后讲解一下在session中指定GPU运算资源。
一 运行机制
TensorFlow的运行机制属于"定义"与”运行“相分离。从操作层面可以抽象成两种:构造模型和模型运行。
在讲解构建模型之前,需要讲解几个概念。在一个叫做"图"的容器中包括:
- 张量(tensor):TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是tensor,你可以把TensorFlow tensor看做一个n维的数组或者列表。
- 变量(Variable):常用于定义模型中的参数,是通过不断训练得到的值。比如权重和偏置。
- 占位符(placeholder):输入变量的载体。也可以理解成定义函数时的参数。
- 图中的节点操作(op):一个op获得0个或者多个Tensor,执行计算,产生0个或者多个Tensor。op是描述张量中的运算关系,是网络中真正结构。
一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话里启动,会话将图的op分发到诸如CPU或者GPU的设备上,同时提供执行op的方法,这些方法执行后,将产生的tensor返回,在python语言中,返回的tensor是numpy array对象,在C或者C++语言中,返回的tensor是tensorflow:Tensor实例。
session与图的交互过程中定义了以下两种数据的流向机制。
- 注入机制(feed):通过占位符向模式中传入数据。
- 取回机制(fetch):从模式中取得结果。
二 session的使用
1.session案例
第一个案例是通过session输出一段字符串信息,通过这个案例,让我们了解session如何创建。
import tensorflow as tf
'''
TensorFlow 编程基础
''' '''
1.编写hello world程序掩饰session的使用
建立一个session,在session中输出hello TensorFlow
''' #定义一个常量
hello = tf.constant('hello TensorFlow') #构造阶段完成后,才能启动图,启动图的第一步是创建一个Session对象,如果无任何创建函数,会话构造器将启动默认图
sess = tf.Session()
#通过session里面的run()函数来运行结果
print(sess.run(hello))
#或者
print(hello.eval(session=sess))
#任务完毕,关闭会话,Session对象在使用完毕后需要关闭以释放资源,除了显示调用close()外,也可以使用with代码块
sess.close() '''
2. with session的使用
'''
a = tf.constant(3)
b = tf.constant(4)
with tf.Session() as sess:
print(' a + b = {0}'.format(sess.run(a+b)))
print(' a * b = {0}'.format(sess.run(a*b))) '''
3.交互式session
'''
#进入一个交互式TensorFlow会话
sess = tf.InteractiveSession() x = tf.Variable([1.0,2.0])
a = tf.constant([3.0,3.0]) #使用初始化器 initinalizer op的run()初始化x
x.initializer.run() #增加一个减去sub op,从 x 减去 a,运行减去op,输出结果
sub = tf.subtract(x,a)
print(sub.eval()) #[-2. -1.]
上面使用了三种方法创建session,一个是是用了with代码块,一个是没有使用with代码块。还有几种交互式session方式。
为了方便使用诸如Jupter之类的Python交互环境,可以使用InteractiveSession替代Session类,使用Tensor.eval()和Operation.run()方法来代替Session.run(),这样可以避免使用一个变量来持有会话。
2.session的注入机制
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run()
调用的参数. feed 只在调用它的方法内有效, 方法结束,feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符。下面将演示如何使用feed机制将上一个案例程序中的数值通过占位符传入。
'''
4.注入机制
'''
a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
add = a + b
product = a*b
with tf.Session() as sess:
#启动图后,变量必须先经过'初始化' op
sess.run(tf.global_variables_initializer())
print(' a + b = {0}'.format(sess.run(add,feed_dict={a:3,b:4})))
print(' a * b = {0}'.format(sess.run(product,feed_dict={a:3,b:4})))
#一次取出两个节点值
print(' {0}'.format(sess.run([add,product],feed_dict={a:3,b:4})))
注意这个案例最后一个print一次取出来两个节点的值。
3.指定GPU运算
在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU).一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作:
'''
5.指定GPU运算
'''
with tf.Session() as sess:
with tf.device("/cpu:0"):
print(sess.run(product,feed_dict={a:3,b:4}))
设备用字符串进行标识. 目前支持的设备包括: "/cpu:0": 机器的 CPU. "/gpu:0": 机器的第一个 GPU, 如果有的话. "/gpu:1": 机器的第二个 GPU, 以此类推.
类似的还有通过tf.ConfigProto来构建一个config,在config中指定相关的GPU,并且在session中传入参数config='自己创建的config'来指定GPU操作
tf.ConfigProto参数如下:
- log_device_placement = True:是否打印设备分配日志
- allow_soft_placement = True:如果指定的设备不存在,允许TF自动分配设备
config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
session = tf.Session(config = config)
4.设置GPU使用资源
上面的tf.ConfigProto函数生成config之后,还可以设置其属性来分配GPU的运算资源。如下代码就是按需分配的意思。刚开始会分配少量的GPU容量,然后按需慢慢地增加,由于不会释放内存,所以会导致碎片。
'''
6 设置GPU使用资源
'''
#按需分配GPU使用的资源
config.gpu_options.allow_growth = True
同样,上述代码也可以放在config创建时指定,如下:
#或者
gpu_options = tf.GPUOptions(allow_growth = True)
config = tf.ConfigProto(gpu_options = gpu_options)
我们还可以给GPU分配固定大小得计算资源,如分配给tensorflow的GPU的显存的大小为:GPU显存x0.7
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.7)
完整代码:
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 17 19:47:48 2018 @author: zy
""" import tensorflow as tf
'''
TensorFlow 编程基础上
这一节主要介绍session的创建,以及session与图的交互机制,最后讲解一下在session中指定GPU运算资源。
''' '''
1.编写hello world程序掩饰session的使用
建立一个session,在session中输出hello TensorFlow
''' #定义一个常量
hello = tf.constant('hello TensorFlow') #构造阶段完成后,才能启动图,启动图的第一步是创建一个Session对象,如果无任何创建函数,会话构造器将启动默认图
sess = tf.Session()
#通过session里面的run()函数来运行结果
print(sess.run(hello))
#或者
print(hello.eval(session=sess))
#任务完毕,关闭会话,Session对象在使用完毕后需要关闭以释放资源,除了显示调用close()外,也可以使用with代码块
sess.close() '''
2. with session的使用
'''
a = tf.constant(3)
b = tf.constant(4)
with tf.Session() as sess:
print(' a + b = {0}'.format(sess.run(a+b)))
print(' a * b = {0}'.format(sess.run(a*b))) '''
3.交互式session
'''
#进入一个交互式TensorFlow会话
sess = tf.InteractiveSession() x = tf.Variable([1.0,2.0])
a = tf.constant([3.0,3.0]) #使用初始化器 initinalizer op的run()初始化x
x.initializer.run() #增加一个减去sub op,从 x 减去 a,运行减去op,输出结果
sub = tf.subtract(x,a)
print(sub.eval()) #[-2. -1.] '''
4.注入机制
'''
a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
add = a + b
product = a*b
with tf.Session() as sess:
#启动图后,变量必须先经过'初始化' op
sess.run(tf.global_variables_initializer())
print(' a + b = {0}'.format(sess.run(add,feed_dict={a:3,b:4})))
print(' a * b = {0}'.format(sess.run(product,feed_dict={a:3,b:4})))
#一次取出两个节点值
print(' {0}'.format(sess.run([add,product],feed_dict={a:3,b:4}))) '''
5.指定GPU运算
'''
'''
设备用字符串进行标识. 目前支持的设备包括:
"/cpu:0": 机器的 CPU.
"/gpu:0": 机器的第一个 GPU, 如果有的话.
"/gpu:1": 机器的第二个 GPU, 以此类推.
'''
with tf.Session() as sess:
with tf.device("/cpu:0"):
print(sess.run(product,feed_dict={a:3,b:4})) '''
通过tf.ConfigProto来构建一个config,在config中指定相关的GPU,并且在session中传入参数config='自己创建的config'来指定GPU操作
tf.ConfigProto参数如下
log_device_placement = True:是否打印设备分配日志
allow_soft_placement = True:如果指定的设备不存在,允许TF自动分配设备
'''
config = tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
session = tf.Session(config = config) '''
6 设置GPU使用资源
'''
#tf.ConfigProto生成之后,还可以按需分配GPU使用的资源
config.gpu_options.allow_growth = True
#或者
gpu_options = tf.GPUOptions(allow_growth = True)
config = tf.ConfigProto(gpu_options = gpu_options) #给GPU分配固定大小得计算资源,如分配给tensorflow的GPU的显存的大小为:GPU显存x0.7
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.7)
第五节,TensorFlow编程基础案例-session使用(上)的更多相关文章
- 第六节,TensorFlow编程基础案例-保存和恢复模型(中)
在我们使用TensorFlow的时候,有时候需要训练一个比较复杂的网络,比如后面的AlexNet,ResNet,GoogleNet等等,由于训练这些网络花费的时间比较长,因此我们需要保存模型的参数. ...
- 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)
这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...
- 第6节:Java基础 - 三大集合(上)
第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...
- linux高性能服务器编程 (五) --Linux网络编程基础api
第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...
- Tensorflow编程基础之Mnist手写识别实验+关于cross_entropy的理解
好久没有静下心来写点东西了,最近好像又回到了高中时候的状态,休息不好,无法全心学习,恶性循环,现在终于调整的好一点了,听着纯音乐突然非常伤感,那些曾经快乐的大学时光啊,突然又慢慢的一下子出现在了眼前, ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- TensorFlow——tensorflow编程基础
0.tensorflow中的模型运行基础 tensorflow的运行机制属于定义和运行相分离,在操作层面可以抽象成两种:模型构建和模型运行. 在模型构建中的常见概念: 张量(tensor):数据,即某 ...
- TensorFlow 编程基础
1.TensorFlow 安装:https://www.cnblogs.com/pam-sh/p/12239387.html https://www.cnblogs.com/pam-sh/p/1224 ...
- Linux(五)shell编程基础
一.Linux shell简介 1.shell概述 Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell Shell 是一门编程语言& ...
随机推荐
- DAY01、计算机组成及操作系统
一.编程与编程的目的: 1.什么是语言?什么是编程语言? 语言是一事物与另一事物之间沟通的介质 编程语言就是程序员与计算机之间沟通的介质 2.什么是编程? 程序员把自己想要让计算机做的事用编程语言表达 ...
- X5中CSS设置
颜色渐变 position:absolute;left:0;top:40%; 效果图 点击导航按钮变化颜色 1.设置按钮class为 btn-link(超链接) 2.为每一个导航按钮增加属性id 3. ...
- nginx 卸载后重新安装/etc/nginx配置文件没了,cannot open /etc/nginx/nginx.conf (No such file or directory)
sudo apt-get --purge remove nginx-common sudo apt-get --purge remove nginx* sudo apt-get autoremove ...
- java中的缓冲流!
package cn.zhozuohou; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor ...
- Git要点
前面的话 本文将总结Git要点 版本管理工具 [作用] 1.备份文件 2.记录历史 3.回到过去 4.对比差异 [分类] 1.手动版本控制(又叫人肉VCS) 2.LVCS 本地 3.CVCS 集中式( ...
- Let's Encrypt免费泛域名证书申请
一. 下载acme.sh,以下四条命令任选一条即可 curl https://get.acme.sh | shwget -O - https://get.acme.sh | sh curl https ...
- JVM深入理解<二>
以下内容来自: http://www.jianshu.com/p/ac7760655d9d JVM相关知识详解 一.Java虚拟机指令集 Java虚拟机指令由一个字节长度的.代表某种特定含义的操作码( ...
- Gym100496H-House of Representatives-树
树上每个元素有一个p,元素之间有距离d,计算一个元素u,使得sigma(d(i,u)*pi)最小. 两次dfs,第一次计算本节点以下的sigma(),第二次利用sump求解出ans. #include ...
- python调用opencv库教程
OpenCV安装pip install --upgrade setuptoolspip install numpy Matplotlibpip install opencv-python OpenCV ...
- P1495 曹冲养猪
原题链接 https://www.luogu.org/problemnew/show/P1495 这个题明显的中国剩余定理(孙子定理),如果有不懂孙子定理的点这个链接https://baike.bai ...