今天,我们来分享一篇博文,关于如何计算图像张量的大小以及确定卷积神经网络各层参数个数的公式。假设我们已经熟悉了卷积神经网络相关概念。在这里,我们把张量定义为有任意通道数的图像。
张量是在深度学习中表示数据的标准方式。
简单来说,张量是二维表(矩阵)到更高维的扩展。
有效AttributeError: module ‘tensorflow’ has no attribute "…"解决办法
一般,这是由于版本不兼容的问题,中间加上compat.v1
,
tf.compat.v1.placeholder
我们将用AlexNet作为例子,在这里我们把AlexNet的结构拿来参考。
在这里,我们先来了解AlexNet的结构
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=SI−K+2P+1
输出图像的通道个数等于我们使用的卷积核的个数。
例如:在 AlexNet,输入图像大小为 227 ∗ 227 ∗ 3 227*227*3 227∗227∗3,第一个卷积层有96个 11 ∗ 11 ∗ 3 11*11*3 11∗11∗3卷积核,步长为4,没有边界填充。第一个卷积层输出大小便是
O = 227 − 11 + 2 ∗ 0 4 + 1 = 55 O = \frac{227-11+2*0}{4}+1 = 55 O=4227−11+2∗0+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=132−5+2∗0+1=28
输出张量大小为 28 ∗ 28 ∗ 6 28*28*6 28∗28∗6
# 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=SI−Ps+1
这个公式可以从卷积层公式推导出来,只需要把边界填充看作0,让池化大小等价于卷积核大小。需要注意的是,池化层并不改变输出通道的大小。假设本层输入张量大小为28286
O = 28 − 2 1 + 1 O=\frac{28-2}{1}+1 O=128−2+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=K2∗C∗N
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} F−1代表上一个全连接层含有的神经元个数$$
参考人工智能实验课——神经网络手写数字识别学习笔记(二)
W f f = F − 1 ∗ F W_{ff} = F_{-1}*F Wff=F−1∗F
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=O2∗N∗F
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
聆听这暗夜的乐音吧