记录一些Tensorflow小知识点

作者:xg123321123 - 时光杂货店

出处:http://blog.csdn.net/xg123321123/article/details/77882232

声明:版权所有,转载请联系作者并注明出处

1 Tensorflow 中feature map的计算

在Tensorflow中,padding的方式有2种:SAMEVALID

  • 首先是计算公式

    • 使用VALID时:

      output=ceil(float(inputkernel+1)/stride)

    • 使用SAME时:

      output=ceil(float(input)/stride)

  • 其次是讲解

    • 对于VALID来说,实质上是没有填充,多余的元素则被丢弃,比如下面的input_width=13,只允许滑动2次,多余的元素全部丢掉
      这里写图片描述
    • 对于SAME来说,实质上是补全元素,比如下面的情况,允许滑动3次,但是需要补3个元素,左奇右偶,在左边补一个0,右边补2个0这里写图片描述

    • 以上两者都是在input size为13,kernel size为6,stride为5的情况下进行

  • 以上信息是否正确,可自行实验

作为对比,将caffe的计算方式也给出来:

  • 定义
    输入: nc0w0h0
    输出: nc1w1h1
    其中 c1 是生成的feature map个数,即num_output;

  • 生成的feature map尺寸,计算如下:
    w_1 = (w_0 + 2*p-k)/s + 1
    h_1 = (h_0 + 2*p-k)/s + 1

  • 其中 p 是padding的尺寸, k 是卷积核的尺寸;
    由上式可知,如果 p=(k1)/2 ,则运算后,feature map的尺寸不变。


2 获取变量的shape

  • tf.shape(x) #其中x可以是tensor或其他类型,返回是一个tensor
  • x.get_shape() #只有tensor有这个方法, 返回是一个tuple

3 用reshape将数组平铺

  • 函数原型:tf.reshape(tensor, shape, name=None)
  • shape参数中的-1表示根据数组元素总数,自动计算出剩余的维度,shape参数只能有一个-1
  • 当shape参数为[-1]时,表示将该数组完全平铺开来

4 conv2d中参数的含义

  • 函数原型:tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

  • 除去name参数用以指定该操作的name,与方法有关的一共五个参数:

    • input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一
    • filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,filter的通道数要求与input的in_channels一致,有一个地方需要注意,第三维in_channels,就是参数input的第四维
    • strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4,只有strides1和strides2有实际意义,具体指定了filter的尺寸,strides0=strides3=1则只是将其包装成一个合格的tensor
    • padding:string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式
    • use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true
  • 结果返回一个Tensor,就是我们常说的feature map

  • 栗子如下:
    import tensorflow as tf  
    #case 2  
    input = tf.Variable(tf.random_normal([1,3,3,5]))  
    filter = tf.Variable(tf.random_normal([1,1,5,1]))  
    op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID')  

    with tf.Session() as sess:  
        sess.run(tf.initialize_all_variables())  
        res = (sess.run(op))  
        print (res.shape)  

5 使用指定的GPU及GPU显存

  • 终端执行程序时设置使用的GPU
    如果电脑有多个GPU,tensorflow默认全部使用。如果想只使用部分GPU,可以设置CUDA_VISIBLE_DEVICES。在调用python程序时,可以使用:

    CUDA_VISIBLE_DEVICES=1 python my_script.py 
  • python代码中设置使用的GPU
    如果要在python代码中设置使用的GPU(如使用pycharm进行调试时),可以使用下面的代码:

    import os
    os.environ["CUDA_VISIBLE_DEVICES"] = "2"
    
    #也可以用 with tf.device 创建一个设备环境, 这个环境下的 operation 都统一运行在环境指定的设备上,如:
    
        with tf.device('/gpu:2'):
          a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
          b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
          c = tf.matmul(a, b)
        sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
    
    #如果指定的设备不存在, 会收到 InvalidArgumentError 错误提示;下面的代码也是同样的指定效果
    
    init = tf.global_variables_initializer()
    config = tf.ConfigProto(device_count = {'GPU': 0})
    with tf.Session(config=config) as sess:
         sess.run(init)
    
    #而下面的代码可以让tensorFlow 自动选择一个存在并且支持的设备来运行
    
    sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True))
    
    
    #下面可以记录设备指派情况 
    
    sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
  • 设置tensorflow使用的显存大小

    • 定量设置显存
      默认tensorflow是使用GPU尽可能多的显存。可以通过下面的方式,来设置使用的GPU显存:

      gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
      sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))        

      可以按照需要,设置不同的值,来分配显存;上面分配给tensorflow的GPU显存大小为:GPU实际显存*0.7。

    • 按需设置显存
      上面的只能设置固定的大小。如果想按需分配,可以使用allow_growth参数

      gpu_options = tf.GPUOptions(allow_growth=True)
      sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))   

6 打印tensor的值

使用tensorflow时,如果直接print某个tensor,得到的是其shape信息。

如果想要打印tensor的值,需要借助class tf.Session或者class tf.InteractiveSession。

因为在建立graph的时候,只建立tensor的结构形状信息,并没有执行数据的操作。

  • 首先是class tf.Session
    运行tensorflow操作的类,其对象封装了执行操作对象和评估tensor数值的环境,在定义好所有的数据结构和操作后,其最后运行。
import tensorflow as tf  

# Build a graph.  
a = tf.constant(5.0)  
b = tf.constant(6.0)  
c = a * b  
# Launch the graph in a session.  
sess = tf.Session()  
# Evaluate the tensor `c`.  
print(sess.run(c))  
  • 其次是class tf.InteractiveSession
    用于交互上下文的session,便于输出tensor的数值。与上一个Session相比,其有默认的session执行相关操作,比如:Tensor.eval(), Operation.run()。
    Tensor.eval()是执行这个tensor之前的所有操作,Operation.run()也是。
import tensorflow as tf  
a = tf.constant(5.0)  
b = tf.constant(6.0)  
c = a * b  
with tf.Session():  
   print(c.eval())  

本篇博客参考自以下博客:
TensorFlow与caffe中卷积层feature map大小计算
tensorflow conv2d的padding解释以及参数解释
tensorflow使用指定的GPU及GPU显存
学习TensorFlow,打印输出tensor的值

你可能感兴趣的:(tensorflow)