深度神经网络TensorFlow基础学习(3)——卷积神经网络的参数个数和张量大小

今天,我们来分享一篇博文,关于如何计算图像张量的大小以及确定卷积神经网络各层参数个数的公式。假设我们已经熟悉了卷积神经网络相关概念。在这里,我们把张量定义为有任意通道数的图像。

张量是在深度学习中表示数据的标准方式。
简单来说,张量是二维表(矩阵)到更高维的扩展。

有效AttributeError: module ‘tensorflow’ has no attribute "…"解决办法
一般,这是由于版本不兼容的问题,中间加上compat.v1

tf.compat.v1.placeholder

我们将用AlexNet作为例子,在这里我们把AlexNet的结构拿来参考。
深度神经网络TensorFlow基础学习(3)——卷积神经网络的参数个数和张量大小_第1张图片
在这里,我们先来了解AlexNet的结构

  1. 输入层:彩色图片的大小2272273
  2. 卷积层1:96 kernels 11*11 步长4 零边距填充
  3. 最大池化层1:3*3 步长2 避免平均池化的模糊化效果
  4. 卷积层2:256 kernels 5*5 步长1 填充2
  5. 最大池化层2:3*3 步长2 避免平均池化的模糊化效果
  6. 卷积层3:384 kernels 3*3 步长1 填充1
  7. 卷积层4:384 kernels 3*3 步长1 填充1
  8. 卷积层2:256 kernels 3*3 步长1 填充1
  9. 最大池化层3:3*3 步长2 避免平均池化的模糊化效果
  10. 全连接层1:4096神经元
  11. 全连接层2:4096神经元
  12. 全连接层3:1000神经元
    其中,最大池化是可重叠的,步长小于窗口宽度。分批(Batches) 和 周期(Epochs)在使用训练集训练神经网络的时候,相比于一次将所有的样本全部输入到网络中,一个更好的选择是:先将数据随机地分为几个大小一致的数据块,再分批次输入。跟一次性训练出来的模型相比,分批训练能够使模型的适用性更好。一个Epoch表示,对所有的Batch都进行了一次训练。

AlexNet 的特点如下:

更深的网络结构
使用层叠的卷积层,即卷积层+卷积层+池化层来提取图像的特征
使用Dropout抑制过拟合
使用数据增强Data Augmentation抑制过拟合
使用Relu替换之前的sigmoid的作为激活函数
多GPU训练

其中,数据增强部分,神经网络由于训练的参数多,表能能力强,所以需要比较多的数据量,不然很容易过拟合。当训练数据有限时,可以通过一些变换从已有的训练数据集中生成一些新的数据,以快速地扩充训练数据。对于图像数据集来说,可以对图像进行一些形变操作:翻转/随机裁剪/平移,颜色光照的变换

下面,重点来了:
卷积神经网络的参数个数和张量大小(翻译),每一层具体的练习结果参考上方链接。

确定张量大小

How to calculate the tensor size at each stage
How to calculate the total number of parameters in the network

我们先来明确各变量名称

变量 含义
O 输出图像的大小
I 输入图像的大小
K 卷积层所用卷积核大小
N 卷积核数量
S 步长
P 边界填补

卷积层输出张量大小

O = I − K + 2 P S + 1 O= \frac{I-K+2P}{S}+1 O=SIK+2P+1
输出图像的通道个数等于我们使用的卷积核的个数。
例如:在 AlexNet,输入图像大小为 227 ∗ 227 ∗ 3 227*227*3 2272273,第一个卷积层有96个 11 ∗ 11 ∗ 3 11*11*3 11113卷积核,步长为4,没有边界填充。第一个卷积层输出大小便是
O = 227 − 11 + 2 ∗ 0 4 + 1 = 55 O = \frac{227-11+2*0}{4}+1 = 55 O=422711+20+1=55
输出张量大小为555596
在 LeNet,输入图像大小为32321,第一个卷积层有6个551卷积核,步长为1,边界填充和输入相同。
第一个卷积层输出大小便是?
O = 32 − 5 + 2 ∗ 0 1 + 1 = 28 O = \frac{32-5+2*0}{1}+1 = 28 O=1325+20+1=28
输出张量大小为 28 ∗ 28 ∗ 6 28*28*6 28286

# Conv2D layer
  X = keras.layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), 
                          activation='tanh', 
                          padding='same', name="leNet5_conv1")(X_in)

池化层输出张量大小

变量 含义
O 输出图像的大小
I 输入图像的大小
S 步长
P s P_s Ps 池化大小

O = I − P s S + 1 O=\frac{I-P_s}{S}+1 O=SIPs+1
这个公式可以从卷积层公式推导出来,只需要把边界填充看作0,让池化大小等价于卷积核大小。需要注意的是,池化层并不改变输出通道的大小。假设本层输入张量大小为28286
O = 28 − 2 1 + 1 O=\frac{28-2}{1}+1 O=1282+1
输出张量大小为27276

 # Pooling layer
  X = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(1, 1), padding='valid')(X)

全连接层的输出张量大小

等价于该层的神经元的个数

def leNet5(input_shape):
  """
  Define the LeNet-5
  Input:
    input_shape [tuple]: shape of input image (height, width, channel)
  Output:
    model (a tensorflow model instance)
  """
  
  # Input layer
  X_in = keras.layers.Input(shape=input_shape)
  
  
  # Conv2D layer
  X = keras.layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), 
                          activation='tanh', 
                          padding='same', name="leNet5_conv1")(X_in)
  
  # Pooling layer
  X = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(1, 1), padding='valid')(X)

  # Conv2D
  X = keras.layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), 
                          activation='tanh', 
                          padding='valid', name='leNet5_conv2')(X)

  # Pooling layer
  X = keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(X)

  # Conv2D
  X = keras.layers.Conv2D(filters=120, kernel_size=(5, 5), strides=(1, 1), 
                          activation='tanh', 
                          padding='valid', name='leNet5_conv3')(X)
  
  # Flatten CNN output so that it can be connected to dense layer
  X = keras.layers.Flatten()(X)

  # Dense
  X = keras.layers.Dense(84, activation='tanh')(X)

  # Output layer
  y = keras.layers.Dense(10, activation='softmax')(X)

  model = keras.Model(inputs=X_in, outputs=y, name='leNet5')
  return model

确定参数大小

变量 含义
W c W_c Wc 卷积权重
B c B_c Bc 卷积偏置
P 卷积层所用参数数量
N 卷积核数量
K 卷积核大小(宽度)
C 输入图像的通道

W c = K 2 ∗ C ∗ N W_c = K^2*C*N Wc=K2CN
B c = N B_c = N Bc=N
P c = W c + B c P_c = W_c + B_c Pc=Wc+Bc

卷积层的参数

CNN里面,有两种参数,权重和偏置

全连接层的参数

全连接层与全连接层相互连接的参数,感性认识,F 代表全连接层含有的神经元个数, F − 1 F_{-1} F1代表上一个全连接层含有的神经元个数$$
参考人工智能实验课——神经网络手写数字识别学习笔记(二)

W f f = F − 1 ∗ F W_{ff} = F_{-1}*F Wff=F1F
B f f = F B_{ff} = F Bff=F
P f f = W f f + B f f P_{ff} = W_{ff} + B_{ff} Pff=Wff+Bff
全连接层与卷积层相互连接的参数

变量 含义
W c f W_{cf} Wcf FC卷积权重
B c f B_{cf} Bcf FC卷积偏置
O 上一卷积层输出张量大小
N 上一卷积层的卷积核个数
F FC 神经元个数

W c f = O 2 ∗ N ∗ F W_{cf} = O^2 * N*F Wcf=O2NF
B c f = F B_{cf} = F Bcf=F
P c f = W c f + B c f P_{cf} = W_{cf}+B_{cf} Pcf=Wcf+Bcf

今日写CSDN的背景音乐是:)
The Music of the Night (From “The Phantom of the Opera”)

Night-time sharpens, heightens each sensation
夜色渐暗,激发灵感
Darkness stirs and wakes imagination
黑暗作祟,唤醒想像空间
Silently the senses abandon their defenses
潜移默化,感官放弃抵抗

Slowly, gently, night unfurls its splendor
缓缓的,轻柔的,夜色展现光彩
Grasp it,sense it, tremulous and tender
抓住它,感受它,颤栗而轻柔
Turn your face away form the garish light of day
别再回顾炫彩夺目的白天
Turn your thoughts away from cold unfeeling light
别再想那些冷酷无情的光线
And listen to the music of the night
聆听这暗夜的乐音吧

你可能感兴趣的:(计算机视觉,神经网络,深度学习,卷积神经网络,tensorflow,机器学习)