TensorFlow函数中的shape参数介绍、feature map大小的计算方法

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/82966370

TensorFlow函数中的shape参数介绍:

TensorFlow用张量这种数据结构来表示所有的数据。你可以把一个张量想象成一个n维的数组或列表。一个张量有一个静态类型和动态类型的维数,张量可以在图中的节点之间流通。

tensorflow中张量(tensor)的属性有维数(阶)、形状和数据类型。用shape表示生成张量的维度。

张量的维数又叫张量的阶,是张量维数的一个数量描述。但是张量的阶和矩阵的阶并不是同一个概念。

如下分别表示0维、1维、2维和3维的张量:

1    #维度为0的标量
[1,2,3]   #维度为1,一维向量
[[1,2],[3,4]]   #维度为2, 二维矩阵
[[[1,2],[3,4]],[[1,2],[3,4]]]   #维度为3,3维空间矩阵

简单来说有几层方括号就是几维张量。

张量的形状(shape)以 [D0, D1, … Dn-1]  的形式表示,D0 到Dn 是任意的正整数。

如:

shape [2,3] 表示为数组的意思是第一维有两个元素,第二维有三个元素,[2,3]表示一个2行3列的矩阵,如: [[1,2,3],[4,5,6]]

在shape的方括号中有多少个数字,就代表这个张量是多少维的张量

shape的第一个元素要看张量最外层方括号中有几个元素(被最外边的中括号里边的内中括号括起来的所有数据算作一个元素)被逗号隔开,有n1个则这个张量就是n1维的,形状的第一个元素就是n1。shape的第2、3、4...n个元素依次类推,分别看第n个方括号中有几个元素即可。

如:

1    # 形状为[]
[1,2,3]   # 形状为[3]
[[1,2],[3,4]]   # 形状为[2,2]
[[[1,2],[3,4]],[[1,2],[3,4]]]   # 形状为[2,2,2]

除了维度shape,张量还有一个数据类型属性。

你可以为一个张量指定下列数据类型中的任意一个类型:

数据类型 Python 类型 描述
DT_FLOAT tf.float32 32 位浮点数.
DT_DOUBLE tf.float64 64 位浮点数.
DT_INT64 tf.int64 64 位有符号整型.
DT_INT32 tf.int32 32 位有符号整型.
DT_INT16 tf.int16 16 位有符号整型.
DT_INT8 tf.int8 8 位有符号整型.
DT_UINT8 tf.uint8 8 位无符号整型.
DT_STRING tf.string 可变长度的字节数组.每一个张量元素都是一个字节数组.
DT_BOOL tf.bool 布尔型.
DT_COMPLEX64 tf.complex64 由两个32位浮点数组成的复数:实数和虚数.
DT_QINT32 tf.qint32 用于量化Ops的32位有符号整型.
DT_QINT8 tf.qint8 用于量化Ops的8位有符号整型.
DT_QUINT8 tf.quint8 用于量化Ops的8位无符号整型.

feature map大小的计算方法:

在每个卷积层中,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map。在输入层,如果是灰度图片,那就只有一个feature map;如果是彩色图片,一般就是3个feature map(红绿蓝)。层与层之间会有若干个卷积核(kernel),上一层和每个feature map跟每个卷积核做卷积,都会产生下一层的一个feature map。

feature map大小的计算举例:

假设INPUT为32*32,使用6个kernel size为5*5的filter,stride = 1,pading=0。

卷积后得到feature maps边长的计算公式为: 

output_h =(originalSize_h+padding*2-kernelSize_h)/stride +1 

即卷积层的feature map的边长为:conv1_h=(32-5)/1 + 1 = 28,卷积层的feature maps尺寸为28*28。

神经元个数为:(32-5+1) * (32 -5 +1) = 28 * 28 个。

32-5是卷积核可以滑过并得到一次计算结果的次数(因为步幅是1),+1是卷积核放在最开始的位置上还没开始滑动时的一次计算结果。

卷积层之后是pooling层,也叫下采样层或子采样层(subsampling)。它是利用图像局部相关性的原理,对图像进行子抽样,这样在保留有用信息的同时可以减少数据处理量。pooling层不会减少feature maps的数量,只会缩减其尺寸。常用的pooling方法有两种,一种是取最大值,一种是取平均值。 

pooling过程的计算公式:

假如pooling的步长是2,filter大小是2X2,pooling方法为取最大值,conv1_h为卷积层的feature maps边长。

pooling后feature maps边长的计算公式为:

pool1_h = (conv1_h - kernelSize_h)/stride +1

即pooling层后的feature map的边长为(28-2)/2+1=14,pooling后的feature map尺寸为14*14。

feature map和神经元的关系:

单个卷积核情况下:

神经元是前一层的wx+b到下一层的计算过程,这一层的连接数也就是有多少个 wx+b的连接(一个卷积核有多个w只有一个bias),一个feature map 是多个(比如M个)神经元计算的结果汇总。

多个卷积核情况下:

同一层可以有多个(比如N个)卷积核,每个卷积核对应(卷积的结果是)一个feature map ,也就是这一层有N个feature map, 那这一层共有 N*M个神经元。(如果每个fm的神经元个数不一样,则累加每个fm的神经元个数)

可训练参数个数与神经元的个数无关,只与卷积核的大小及卷积核的个数相关,还有通道数(即高度)。

神经元个数除了与卷积核大小和个数有关,还与步长相关。步长越大,神经元个数越小。

feature map的每个点都是一个神经元的输出,所以神经元个数 = 特征图大小。

CNN中的权值共享就是同一个Feature Map中的神经元权值共享,该Feature Map中的所有神经元使用同一个权值。这与全连接相比,减少了大量参数。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82966370