首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TensorFlow修炼之道(3)——计算图和会话(Graph&Session

计算图

在计算图中,节点表示计算单位,边表示计算用到和产生的数据。 例如,在TensorFlow图中,tf.matmul操作将对应于具有两个输入边(要乘以的矩阵)和一个输出边(乘法的结果)的单个节点。

在 TensorFlow 中,系统会自动维护一个默认的计算图,可以通过 方法来获取当前默认的计算图。

True

图的集合(collection)

函数能够将资源(张量、变量或者队列资源等)加入到一个或多个集合中, 可以查找一个集合中的所有资源。TensorFlow 也自动管理了一些常用的集合。

'moving_average_variables'

类似Tensor的对象

许多TensorFlow操作将一个或多个tf.Tensor对象作为参数。 例如,tf.matmul接收两个tf.Tensor对象,tf.add_n接收一个n个tf.Tensor对象的列表。 为了方便起见,这些函数将接受一个类似张量的对象以替代tf.Tensor,并使用方法将其隐式转换为tf.Tensor。 类似Tensor的对象包括以下类型的元素:

tf.Tensor

tf.Variable

numpy.ndarray

list(和类似张量的对象的列表)

标量Python类型:bool,float,int,str

注意:默认情况下,每次使用相同的类似张量的对象时,TensorFlow将创建一个新的tf.Tensor。 如果类似张量的对象较大(例如,包含一组训练样本的numpy.ndarray),并且你多次使用它,则可能会耗尽内存。 为了避免这种情况,请在类似张量的对象上手动调用一次,并使用返回的tf.Tensor。

会话创建会话

会话(Session)拥有并管理TensorFlow程序运行时的所有资源。当计算完成之后,需要关闭会话来帮助系统回收资源,否则可能出现资源泄露的情况。

如果使用低级TensorFlow API,则可以为当前默认图创建一个tf.Session,如下所示

[[ 37. -23.] [ 1. 4.]]

使用上面的这种模式,在计算完成后,需要明确调用 方法来关闭会话来释放资源。如果使用上下文管理器(语句)可以避免手动调用方法。

[[ 37. -23.] [ 1. 4.]]

创建Session时,可以执行以下几个参数:

target。 如果此参数为空(默认值),则会话将仅使用本地计算机中的设备。 但是,你也可以指定一个grpc://URL来指定TensorFlow服务器的地址,它将赋予会话访问该服务器所控制的计算机上的所有设备的权限。

graph。 默认情况下,新的tf.Session将被绑定到当前的默认图 — 且只能运行当前默认图中的操作。 如果在程序中使用多个图,你可以在构建会话时指定一个显式的tf.Graph。

config。 此参数允许你指定控制会话行为的tf.ConfigProto。 例如,一些配置选项包括:

allow_soft_placement。 将其设置为True以启用“软”设备布局算法,当运算无法在GPU(比如:没有GPU资源、运算输入包含了对CPU计算结果的引用等)时,程序不会报错,而是调整到CPU上。

cluster_def。 当使用分布式TensorFlow时,此选项允许您指定计算中要使用的计算机,并提供作业名称,任务索引和网络地址之间的映射。 有关详细信息,请参见tf.train.ClusterSpec.as_cluster_def。

graph_options.optimizer_options。 在执行之前,可以控制TensorFlow对图的优化。

gpu_options.allow_growth。 将其设置为True以更改GPU内存分配器,以便逐渐增加分配的内存量,而不是在启动时分配大部分内存。

使用Session运行操作

tf.Session.run要求你指定fetches的一个列表,该列表确定返回值,可以是tf.Operation、tf.Tensor或类似张量的类型例如tf.Variable。 这些fetches确定整个tf.Graph的哪些子图必须执行以产生结果。

tf.Session.run还接受一个可选的字典参数feeds,它是从tf.Tensor对象(通常是tf.placeholder张量)到值(通常是Python标量、列表或NumPy数组)的映射,将在执行中替换那些张量。 例如:

[1. 4. 9.][ 0. 0. 25.]

---------------------------------------------------------------------------

...InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [3] [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[3], _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]

具有多个图的编程

训练模型时,组织代码的常用方法是使用一个图来训练你的模型,另外一个图用于评估或用于对训练好的模型执行inference。

在许多情况下,推理图与训练图不同:例如,在不同情况下使用不同的操作如dropout和batch normalization。 此外,一些实用程序如tf.train.Saver默认情况下使用tf.Variable对象的名称(其名称基于底层的tf.Operation)来识别保存的检查点中的每个变量。 当这样编程时,你可以使用完全独立的Python进程来构建和执行图,或者你可以在同一个进程中使用多个图。

TrueTrueTrueTrue

脑洞科技栈一个有用的IT公众号

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224G11HT000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券