TensorFlow常用函数(三)

上一篇:TensorFlow常用函数(二)

1、tf.app.flags:命令行解析

2、tf.device():指定运行设备 

3、tf.get_connection():从一个结合中取出全部变量,返回一个列表

4、tf.GraphKeys : Graph collection中使用的标准命名定义在该类下

5、tf.identity(input,name=None):返回和input有相同形状和值的一个tensor。

6、tf.metrics.mean_iou() : 计算语义分割指标mIoU

7、tf.rank(input,name=None):返回张量的秩,即张量的维度

8、tf.Assert(condition,data,summarize=None,name=None):根据条件打印数据

9、tf.pad(tensor,paddings,mode='CONSTANT', name=None,constant_values=0):对图像进行填充

10、tf.shape(a) & a.get_shape()、set_shape() & reshape()、tf.size()

11、tf.reverse_v2(tensor,axis,name=None):反转张量的特定维度。

12、tf.cond(pred,true_fn = None,false_fn = None,strict = False,name = None,fn1 = None,fn2 = None):如果断言 pred 为 true 则返回 true_fn() ,否则返回 false_fn()。

13、tf.where(condition,x=None,y=None,name=None): 根据condition返回x或y中的元素。 

下一篇:TensorFlow常用函数(四)


1、tf.app.flags:命令行解析

  tf.app.flags用于定义全局变量,在命令行中运行比较方便,它是google特有的风格,更常见的解析方法是argparse。tf.app.flags可以认为是对模块argparse的简单封装,它实现了python-gflags的一个功能子集。  

import tensorflow as tf 

flags = tf.app.flags
FLAGS = flags.FLAGS

 #第一个是参数名称,第二个参数是默认值,第三个是参数描述

flags.DEFINE_enum('learning_policy', 'poly', ['poly', 'step'],'Learning rate policy for training.')
flags.DEFINE_float('base_learning_rate', .0001,'The base learning rate for model training.')
flags.DEFINE_integer('learning_rate_decay_step', 2000, 'Decay the base learning rate at a fixed step.')
flags.DEFINE_integer('train_batch_size', 12,'The number of images in each batch during training.')
flags.DEFINE_multi_integer('train_crop_size', [513, 513],'Image crop size [height, width] during training.')
flags.DEFINE_boolean('upsample_logits', True,'Upsample logits during training.')
flags.DEFINE_string('dataset', 'dataset_name','Name of the test dataset.')

def main(_):  
    print(FLAGS.learning_policy)
    print(FLAGS.base_learning_rate)
    print(FLAGS.learning_rate_decay_step)
    print(FLAGS.train_batch_size)
    print(FLAGS.train_crop_size)
    print(FLAGS.upsample_logits)
    print(FLAGS.dataset)

if __name__ == '__main__':
    tf.app.run()

 在命令行运行:python flags_test.py,输出为:

poly
0.0001
2000
12
[513, 513]
True
dataset_name

2、tf.device():指定运行设备 

    在TensorFlow中,模型可以在本地的GPU和CPU中运行,用户可以指定模型运行的设备。通常,如果你的TensorFlow版本是GPU版本的,而且你的电脑上配置有符合条件的显卡,那么在不做任何配置的情况下,模型是默认运行在显卡下的。如果需要切换成CPU运算,可以调用tf.device(device_name)函数,其中device_name格式如/cpu:0其中的0表示设备号,TF不区分CPU的设备号,设置为0即可。GPU区分设备号/gpu:0和/gpu:1表示两张不同的显卡。 
    在一些情况下,我们即使是在GPU下跑模型,也会将部分Tensor储存在内存里,因为这个Tensor可能太大了,显存不够放,相比于显存,内存一般大多了,于是这个时候就常常人为指定为CPU设备。这种形式我们在一些代码中能见到。如:

with tf.device('/cpu:0'):
    build_CNN() # 此时,这个CNN的Tensor是储存在内存里的,而非显存里。

需要注意的是,这个方法会减少显存的负担,但是从内存把数据传输到显存中是非常慢的,这样做常常会减慢速度。

3、tf.get_connection():从一个结合中取出全部变量,返回一个列表

  函数原型:get_collection(key,scope=None)
   参数:
    key:收集的关键。例如,tf.GraphKeys 类包含许多集合的标准名称。
    scope:(可选)如果提供,则筛选结果列表为仅包含name属性匹配 re.match 使用的项目。如果一个范围是提供的,并且选择或 re. match 意味着没有特殊的令牌过滤器的范围,则不会返回没有名称属性的项。
    返回值:
   集合中具有给定name的值的列表,或者如果没有值已添加到该集合中,则为空列表。该列表包含按其收集顺序排列的值。

4、tf.GraphKeys : Graph collection中使用的标准命名定义在该类下

    这个标准库使用各种大家所知的命名来collect和retrieve与graph关联的变量。 例如, the tf.Optimizer 这个子类默认优化的variables位于tf.GraphKeys.TRAINABLE_VARIABLES中。一些标准keys的定义如下:

    GLOBAL_VARIABLES: Variable对象的默认collection,在整个分布式环境中共享这个collection(model variables是这个collection的一个子集)。查看tf.global_variables()函数可以获取更多信息,我们熟悉的tf.global_variables_initializer()就是初始化这个集合内的Variables。通常情况下,所有的TRAINABLE_VARIABLES变量位于MODEL_VARIABLES中,所有的MODEL_VARIABLES变量位于GLOBAL_VARIABLES中。
    LOCAL_VARIABLES: Variable对象的子集,是每个计算机中的局部变量,通常是临时变量,比如计数器couner等。
注意: 使用tf.contrib.framework.local_variable函数会将变量添加到这个collection中.更多信息请查看tf.local_variables()。
    MODEL_VARIABLES: Variable对象的子集,在模型预测时会使用这些变量。注意:使用tf.contrib.framework.model_variable函数会将变量添加到这个collection中。更多信息请查看tf.model_variables()。
   TRAINABLE_VARIABLES: Variable对象的子集,这个集合中的变量会被optimizer优化. 更多信息请查看tf.trainable_variables()
    SUMMARIES: 在graph中被创建的summary Tensor对象,更多信息请查看tf.summary.merge_all()。调用tf.scalar_summary系列函数时,就会向默认的collection中添加一个Operation,tf.merge_all_summaries()可以获取所有summary的操作。
    QUEUE_RUNNERS: 在计算过程中,用于产生输入的QueueRunner 对象,更多信息请查看 tf.train.start_queue_runners()
    MOVING_AVERAGE_VARIABLES: Variable对象的子集,这些变量会一些保持滑动平均,更多信息请查看 tf.moving_average_variables()
    REGULARIZATION_LOSSES: 在计算图构建过程中的正则化损失的collection。

    注意:通过调用tf.get_collection(key,scope)和通过调用tf.global_variables()、tf.trainable_variables()...等函数获取集合中的variable是等效的。

    除了默认的集合,我们也可以自己创造collection组织对象。网络损失就是一类适宜对象:

创建损失不会自动添加到集合中,需要手工指定一个collection:

tf.add_to_collection("losses", l1)
tf.add_to_collection("losses", l2)

创建完成后,可以统一获取所有损失,losses是个Tensor类型的list:
losses = tf.get_collection('losses')

另一种常见操作把所有损失累加起来得到一个Tensor:
loss_total = tf.add_n(losses)

实际上,如果使用TF-Slim包的losses系列函数创建损失,会自动添加到名为”losses”的collection中。

5、tf.identity(input,name=None):返回和input有相同形状和值的一个tensor。

  Args:
    input: A Tensor.
    name: (可选)操作名.
  Returns:
    A Tensor,与input有相同的形状和值.

实例如下(参考Stack Overflow):

下面程序的功能是,做5次循环,每次循环给x加1,赋值给y,然后打印出来,所以我们预期达到的效果是输出2,3,4,5,6。

x = tf.Variable(1.0)
y = tf.Variable(0.0)

#返回一个op,表示给变量x加1的操作
x_plus_1 = tf.assign_add(x, 1)

#control_dependencies的意义是,在执行with包含的内容(在这里就是 y = x)前,
#先执行control_dependencies参数中的内容(在这里就是 x_plus_1),这里的解释不准确,先接着看。。。
with tf.control_dependencies([x_plus_1]):
    y = x
init = tf.initialize_all_variables()
with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())#相当于sess.run(y),按照我们的预期,由于control_dependencies的作用,所以应该执行print前都会先执行x_plus_1,但是这种情况会出问题

输出:1,1,1,1,1 

可以看到,没有达到我们预期的效果,y只被赋值了一次。如果改成这样:

x = tf.Variable(1.0)
y = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)

with tf.control_dependencies([x_plus_1]):
    y = tf.identity(x)#修改部分
init = tf.initialize_all_variables()

with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

输出:2,3,4,5,6

 解释:对于control_dependencies这个管理器,只有当里面的操作是一个op时,才会生效,也就是先执行传入的参数op,再执行里面的op。而y=x仅仅是tensor的一个简单赋值,不是定义的op,所以在图中不会形成一个节点,这样该管理器就失效了。tf.identity是返回一个一模一样新的tensor的op,这会增加一个新节点到gragh中,这时control_dependencies就会生效,所以第二种情况的输出符合预期。

    此外,当你想要在设备之间(比如从GPU到CPU)显式的传输tensor时,tf.identity是非常有用的。这个操作给计算图增加了发送/接收节点,当输入设备和输出设备不同时,这个操作进行了一次复制。默认情况下,当传输张量的操作发生在不同设备时,发送/接收的节点是被隐式添加到计算图中。但是在某些情况下(比如多线程或者分布式环境),使用一个单一的操作session.run()来多次获取变量值,这是非常高效和有用的。对于为变量值何时从源设备读取,tf.identity允许更多的控制。

6、tf.metrics.mean_iou() : 计算语义分割指标mIoU

   tf.meitrics下定义许多评价指标(包括准确率、召回率、AUC、mIoU等等),其中的mIoU是图像语义分割常用的指标,它首先计算每个类别的IoU,然后计算所有类别的IoU的平均值。IoU的定义如下:IoU = true_positive /(true_positive + false_positive + false_negative)。所有的预测值在一个混淆矩阵(confusion matrix)中累积,然后从这个矩阵中计算mIoU的值。为了在一个数据流上评估mIoU这个指标,这个函数返回一个用于更新变量的更新update_op操作和mIoU值,具体原理参考这里。函数原型如下:  

tf.metrics.mean_iou( labels, 
                    predictions, 
                    num_classes, 
                    weights=None, 
                    metrics_collections=None, 
                    updates_collections=None,
                    name=None)
Args:
  labels: 真实标签的的一个tensor,它的形状为[batch size],类型为int32或int64. 
  predictions: 预测结果的一个tensor,它的形状为[batch size],类型为int32或int64.
  num_classes: 类别总数
  weights: (可选)一个tensor,它的rank要么是0,要么和label的rank相同,它必须能被广播到label。
  metrics_collections: (可选)一个collection列表,mIoU将会被添加到这个列表中
  updates_collections: (可选)一个collection列表,update_op将会被添加到这个列表中。
  name: (可选) variable_scope名
Returns:
  mean_iou: 表示mIoU的一个tensor。
  update_op: 一个增加混淆矩阵的操作

7、tf.rank(input,name=None):返回张量的秩,即张量的维度

# shape of tensor 't' is [2, 2, 3]
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
tf.rank(t)  # 3

8、tf.Assert(condition,data,summarize=None,name=None):根据条件打印数据

import tensorflow as tf
x = [1, 2, 3]
y = 1
assert_op = tf.Assert(tf.less_equal(tf.reduce_max(x), 3), x)
sess = tf.Session()

# 在x中的元素小于3时,比如x=[1,2,3],不报错并在下面输出1
# 在x大于3时,比如x=[1,2,4],抛出异常并打印x: assertion failed: [1] [2] [4]
with tf.control_dependencies([assert_op]):
    print(sess.run(tf.identity(1))

9、tf.pad(tensor,paddings,mode='CONSTANT', name=None,constant_values=0):对图像进行填充

参数介绍:

    tensor:被填充的张量
    paddings:填充的格式
    mode:填充模式:"CONSTANT"、"REFLECT"、"SYMMETRIC"
    name:该操作张量的名称
    constant_values:用于在"CONSTANT"模式下,设置的填充值

# 't' is [[1, 2, 3], [4, 5, 6]].
# 'paddings' is [[1, 1,], [2, 2]].
# 'constant_values' is 0.
# rank of 't' is 2.
tf.pad(t, paddings, "CONSTANT") 
==> 
    [[0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 1, 2, 3, 0, 0], 
     [0, 0, 4, 5, 6, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0]]

'''  
  tf.pad的使用,[[1,1],[2,2]]中[1,1]指的是对第0维进行填充,即向上扩充一行,向下扩充一行;[2,2]指的是对第一维进行缇娜冲,
即向左扩充2列,向右扩充2列。在CONSTANT模式,按上下左右填充几行或者几列的0。paddings=[[1,1],[2,2]]的意思是向上填充一行0,
向下填充一行0,向左填充二行0,向右填充两行0
'''

10、tf.shape(a) & a.get_shape()、set_shape() & reshape()、tf.size()

(1)tf.shape(a)&a.get_shape()

    相同点:都可以得到tensor a的尺寸
    不同点:tf.shape()中a 数据的类型可以是tensor, list, array。a.get_shape()中a的数据类型只能是tensor,且返回的是一个元组(tuple) 。

import tensorflow as tf
import numpy as np
 
x=tf.constant([[1,2,3],[4,5,6]]
y=[[1,2,3],[4,5,6]]
z=np.arange(24).reshape([2,3,4]))
 
sess=tf.Session()
# tf.shape()
x_shape=tf.shape(x)                  #  x_shape 是一个tensor
y_shape=tf.shape(y)                  #  <tf.Tensor 'Shape_2:0' shape=(2,) dtype=int32>
z_shape=tf.shape(z)                  #  <tf.Tensor 'Shape_5:0' shape=(3,) dtype=int32>
print sess.run(x_shape)              # 结果:[2 3]
print sess.run(y_shape)              # 结果:[2 3]
print sess.run(z_shape)              # 结果:[2 3 4]
  
# a.get_shape()
x_shape=x.get_shape()                # 返回的是TensorShape([Dimension(2), Dimension(3)]),不能使用 sess.run() ,
#因为返回的不是tensor 或string,而是元组
x_shape=x.get_shape().as_list()      # 可以使用 as_list()得到具体的尺寸,x_shape=[2 3]
y_shape=y.get_shape()                # AttributeError: 'list' object has no attribute 'get_shape'
z_shape=z.get_shape()                # AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'

(2) a.set_shape()和tf.reshape(a)

    1)set_shape的典型用法如下:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
x1.set_shape([2,2])
print(x1.get_shape())
 
sess = tf.Session()
#print(sess.run(tf.shape(x1), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x1), feed_dict={x1:[[0,1],[2,3]]}))

输出:
(2, 2)
[2 2]

    这代表了图中最开始没有shape的x1在使用了set_shape后,它的图中的信息已经改变了,如果取消掉注释就会报错,因为我们传入了和图不符合的参数。

  2)reshape的典型用法则是这样:

import tensorflow as tf
x1 = tf.placeholder(tf.int32)
x2 = tf.reshape(x1, [2,2])
print(x1.get_shape())
 
sess = tf.Session()
print(sess.run(tf.shape(x2), feed_dict={x1:[0,1,2,3]}))
print(sess.run(tf.shape(x2), feed_dict={x1:[[0,1],[2,3]]}))

输出:
(2,2) 
[2,2] 
[2,2]

    即它并不是想改变图,而只是想创造一个新的tensor以供我们使用。

  3)对比

import tensorflow as tf
x1 = tf.Variable([[0, 1], [2, 3]])
print(x1.get_shape())
 
x1 = tf.reshape(x1, [4, 1]) # if we use x1.set_shape([4, 1]),the program cannot run
print(x1.get_shape())

 (3)tf.size(a):

    作用:返回张量中元素的个数,比如:

t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]])
tf.size(t)  # 12

11、tf.reverse_v2(tensor,axis,name=None):反转张量的特定维度。

 参数:
    tensor:一个Tensor。必须是下列类型之一:uint8,int8,uint16,int16,int32,int64,bool,half,float32,float64,complex64,complex128,string。最多可以是8-D。
    axis:一个Tensor。必须是以下类型之一:int32,int64;它是1-d的。要反转的维度的指数。必须在范围[-rank(tensor), rank(tensor))内。
    name:操作的名称(可选)。

# tensor 't' is [[[[ 0,  1,  2,  3],
#                  [ 4,  5,  6,  7],
#                  [ 8,  9, 10, 11]],
#                 [[12, 13, 14, 15],
#                  [16, 17, 18, 19],
#                  [20, 21, 22, 23]]]]
# tensor 't' shape is [1, 2, 3, 4]

# 'dims' is [3] or 'dims' is -1
reverse(t, dims) ==> [[[[ 3,  2,  1,  0],
                        [ 7,  6,  5,  4],
                        [ 11, 10, 9, 8]],
                       [[15, 14, 13, 12],
                        [19, 18, 17, 16],
                        [23, 22, 21, 20]]]]

# 'dims' is '[1]' (or 'dims' is '[-3]')
reverse(t, dims) ==> [[[[12, 13, 14, 15],
                        [16, 17, 18, 19],
                        [20, 21, 22, 23]
                       [[ 0,  1,  2,  3],
                        [ 4,  5,  6,  7],
                        [ 8,  9, 10, 11]]]]

# 'dims' is '[2]' (or 'dims' is '[-2]')
reverse(t, dims) ==> [[[[8, 9, 10, 11],
                        [4, 5, 6, 7],
                        [0, 1, 2, 3]]
                       [[20, 21, 22, 23],
                        [16, 17, 18, 19],
                        [12, 13, 14, 15]]]]

12、tf.cond(pred,true_fn = None,false_fn = None,strict = False,name = None,fn1 = None,fn2 = None):如果断言 pred 为 true 则返回 true_fn() ,否则返回 false_fn()。

  参数:

    pred:标量决定是否返回 true_fn 或 false_fn 结果。
    true_fn:如果 pred 为 true,则被调用。
    false_fn:如果 pred 为 false,则被调用。
    strict:启用/禁用 “严格”模式的布尔值。
    name:返回的张量的可选名称前缀。

x = tf.constant(2 )
y = tf.constant(5)
def  f1 (): 
	return tf .multiply(x,17 )
def  f2(): 
	return tf .add (y,23)
with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	r = tf.cond(tf.less(x,y ), f1 , f2 )
	b=tf.cond(x<y,lambda:x*x,lambda:y*y)
	print (b.eval())
	print (r.eval())
输出:
4
34

13、tf.where(condition,x=None,y=None,name=None): 根据condition返回x或y中的元素。 

    如果x和y都为None,则该操作将返回condition中true元素的坐标。坐标以二维张量返回,其中第一维(行)表示真实元素的数量,第二维(列)表示真实元素的坐标。请记住,输出张量的形状可以根据输入中的真实值的多少而变化。索引以行优先顺序输出。

    如果两者都不是None,则x和y必须具有相同的形状。如果x和y是标量,则condition张量必须是标量。如果x和y是更高级别的矢量,则condition必须是大小与x的第一维度相匹配的矢量,或者必须具有与x相同的形状。condition张量作为一个可以选择的掩码(mask),它根据每个元素的值来判断输出中的相应元素/行是否应从 x (如果为 true) 或 y (如果为 false)中选择。如果condition是向量,则x和y是更高级别的矩阵,那么它选择从x和y复制哪个行(外部维度)。如果condition与x和y具有相同的形状,那么它将选择从x和y复制哪个元素。

函数参数:
    condition:一个bool类型的张量(Tensor)。
    x:可能与condition具有相同形状的张量;如果condition的秩是1,则x可能有更高的排名,但其第一维度必须匹配condition的大小。
    y:与x具有相同的形状和类型的张量。
    name:操作的名称(可选)。

实例1:
import tensorflow as tf
x = [[1,2,3],[4,5,6]]
y = [[7,8,9],[10,11,12]]
condition3 = [[True,False,False],
             [False,True,True]]
condition4 = [[True,False,False],
             [True,True,False]]
with tf.Session() as sess:
    print(sess.run(tf.where(condition3,x,y)))
    print(sess.run(tf.where(condition4,x,y)))  
输出:
[[ 1  8  9]
 [10  5  6]]
[[ 1  8  9]
 [ 4  5 12]]

实例2:
a = tf.constant([False,False,True,False,True],dtype=tf.bool)
b = tf.where(tf.equal(a,True))
sess = tf.Session()
print(sess.run(b))
结果 
[[2] 
 [4]]

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TensorFlow常用函数包括基本函数和维度变换函数。 基本函数包括: 1. `tf.random_normal()` 用于生成符合正态分布的随机数。 2. `tf.Variable()` 用于定义可训练的变量。 3. `tf.convert_to_tensor()` 用于将Python对象转换为Tensor对象。 4. `tf.placeholder()` 用于定义占位符,可以在运行时传入具体的值。 5. `tf.nn.conv2d()` 用于进行二维卷积操作。 6. `tf.nn.relu()` 用于实现ReLU激活函数。 7. `tf.nn.maxpool()` 用于进行最大池化操作。 维度变换函数包括: 1. `Reshape` 用于改变Tensor的形状。 2. `tf.transpose()` 用于交换Tensor的维度顺序。 3. `tf.expand_dims()` 用于在指定位置增加维度。 4. `tf.squeeze()` 用于去除Tensor中维度为1的维度。 以上是TensorFlow常用的一些函数,可以帮助我们进行数据的处理和模型的构建。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [tensorflow 常用函数](https://blog.csdn.net/hanfei410/article/details/106140878)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [tensorflow 一些常用函数](https://blog.csdn.net/weixin_43915860/article/details/106288956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值