记录一些Tensorflow小知识点
Posted 时光杂货店
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一些Tensorflow小知识点相关的知识,希望对你有一定的参考价值。
作者:xg123321123 - 时光杂货店
出处:http://blog.csdn.net/xg123321123/article/details/77882232
声明:版权所有,转载请联系作者并注明出处
1 Tensorflow 中feature map的计算
在Tensorflow中,padding的方式有2种:SAME
和 VALID
首先是计算公式
使用VALID时:
output=ceil(float(input−kernel+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的计算方式也给出来:
定义
输入: n∗c0∗w0∗h0
输出: n∗c1∗w1∗h1
其中 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=(k−1)/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小知识点的主要内容,如果未能解决你的问题,请参考以下文章