今天,我们来分享一篇博文,关于如何计算图像张量的大小以及确定卷积神经网络各层参数个数的公式。假设我们已经熟悉了卷积神经网络相关概念。在这里,我们把张量定义为有任意通道数的图像。
张量是在深度学习中表示数据的标准方式。
简单来说,张量是二维表(矩阵)到更高维的扩展。
有效AttributeError: module ‘tensorflow’ has no attribute "…"解决办法
一般,这是由于版本不兼容的问题,中间加上compat.v1
,
tf.compat.v1.placeholder
我们将用AlexNet作为例子,在这里我们把AlexNet的结构拿来参考。
在这里,我们先来了解AlexNet的结构
- 输入层:彩色图片的大小2272273
- 卷积层1:96 kernels 11*11 步长4 零边距填充
- 最大池化层1:3*3 步长2 避免平均池化的模糊化效果
- 卷积层2:256 kernels 5*5 步长1 填充2
- 最大池化层2:3*3 步长2 避免平均池化的模糊化效果
- 卷积层3:384 kernels 3*3 步长1 填充1
- 卷积层4:384 kernels 3*3 步长1 填充1
- 卷积层2:256 kernels 3*3 步长1 填充1
- 最大池化层3:3*3 步长2 避免平均池化的模糊化效果
- 全连接层1:4096神经元
- 全连接层2:4096神经元
- 全连接层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=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=1