在第一节中我们已经介绍了一些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使用(上)的更多相关文章

  1. 第六节,TensorFlow编程基础案例-保存和恢复模型(中)

    在我们使用TensorFlow的时候,有时候需要训练一个比较复杂的网络,比如后面的AlexNet,ResNet,GoogleNet等等,由于训练这些网络花费的时间比较长,因此我们需要保存模型的参数. ...

  2. 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)

    这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...

  3. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  4. linux高性能服务器编程 (五) --Linux网络编程基础api

    第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...

  5. Tensorflow编程基础之Mnist手写识别实验+关于cross_entropy的理解

    好久没有静下心来写点东西了,最近好像又回到了高中时候的状态,休息不好,无法全心学习,恶性循环,现在终于调整的好一点了,听着纯音乐突然非常伤感,那些曾经快乐的大学时光啊,突然又慢慢的一下子出现在了眼前, ...

  6. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  7. TensorFlow——tensorflow编程基础

    0.tensorflow中的模型运行基础 tensorflow的运行机制属于定义和运行相分离,在操作层面可以抽象成两种:模型构建和模型运行. 在模型构建中的常见概念: 张量(tensor):数据,即某 ...

  8. TensorFlow 编程基础

    1.TensorFlow 安装:https://www.cnblogs.com/pam-sh/p/12239387.html https://www.cnblogs.com/pam-sh/p/1224 ...

  9. Linux(五)shell编程基础

    一.Linux shell简介 1.shell概述 Shell 是用户与内核进行交互操作的一种接口,目前最流行的 Shell 称为 bash Shell          Shell 是一门编程语言& ...

随机推荐

  1. 在windows 7上安装TensorFlow

    TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习.目前被50个团队用于研究和生产许多Google商业产品,如语音识别.Gmail.Google 相册和搜索,其中许多产品曾使用 ...

  2. Lodop连续打印内容逐渐偏移怎么办

    Lodop打印控件中,可以使用打印机自带的纸张名称,也可以自定义纸张.(SET_PRINT_PAGESIZE语句).通常进行打印开发,为了避免浪费纸张,会用虚拟打印机效果作为依据,虚拟打印机连续打印多 ...

  3. How to goproxy

    brew install python python "/users/cuthead/desktop/phuslu-goproxy-9087f35/uploader.py" sel ...

  4. Condition线程通信(七)

    前言:对于线程通信,使用synchronized时使用wait.notify和notifyAll来实行线程通信.而使用Lock如何处理线程通信呢?答案就是本片的主角:Condition. 一.Cond ...

  5. 自定义 ASP.NET Identity Data Model with EF

    One of the first issues you will likely encounter when getting started with ASP.NET Identity centers ...

  6. codevs3044

    codevs3044 题面 大意:给出n个矩形求覆盖的总面积 看了hzwer的blog 似懂非懂 链接 可能还要多练点吧qaq #include <bits/stdc++.h> using ...

  7. bzoj1206-[HNOI2005]虚拟内存

    卡读的毒瘤题== 看懂之后用map模拟.或者线段树 #include<cstdio> #include<iostream> #include<cmath> #inc ...

  8. SQL 对等发布

    发布类型: 快照发布:发布服务器按预定的时间间隔向订阅服务器发送已发布数据的快照.事务发布:在订阅服务器收到已发布数据的初始快照后,发布服务器将事务流式传输到订阅服务器.对等发布:对等发布支持多主复制 ...

  9. 学习Android过程中遇到的未解决问题(个人笔记,细节补充,随时更新)

    201811/13 使用HttpURLConnection对象调用方法又出现IO异常,我又百度个博客搜寻答案,未果.下午试试真机,完美.自己建了服务器tomcat,编写android访问自己tomca ...

  10. Django+Vue打造购物网站(一)

    环境搭建 python == 3.6 Django == 2.0 创建工程 django-admin startproject MxShop 配置setting.py文件 # 数据库 DATABASE ...