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中的所有神经元使用同一个权值。这与全连接相比,减少了大量参数。