卷积神经网络的时间、空间复杂度以及数据流的变化

0 前言

复杂度对模型的影响
时间复杂度决定了模型的训练/预测时间。如果复杂度过高,会导致模型训练和预测耗费大量时间,既无法快速的验证想法和改善模型,也无法做到快速的预测。
空间复杂度决定了模型的参数数量。由于维度灾难(curse of dimensionality)的限制,模型的参数越多,训练模型所需的数据量就越大,而现实生活中的数据集通常不会太大,这会导致模型的训练更容易过拟合。

1. 时间复杂度

时间复杂度即模型的运行次数

单个卷积层的时间复杂度:Time~O(M^2 * K^2 * Cin * Cout)

  • M:输出特征图(Feature Map)的尺寸。
  • K:卷积核(Kernel)的尺寸。
  • Cin:输入通道数。
  • Cout:输出通道数。

注1:为了简化表达式变量个数,统一假设输入和卷积核的形状是正方形,实际中如果不是,则将M ^2替换成特征图的长宽相乘即可;

注2:每一层卷积都包含一个偏置参数(bias),这里也给忽略了。加上的话时间复杂度则为:O(M^2 * K^2 * Cin * Cout+Cout)。

2.空间复杂度

空间复杂度即模型的参数数量

单个卷积的空间复杂度:Space~O(K^2 * Cin * Cout) 

空间复杂度只与卷积核的尺寸K、通道数C相关。而与输入图片尺寸无关。当我们需要裁剪模型时,由于卷积核的尺寸通常已经很小,而网络的深度又与模型的能力紧密相关,不宜过多削减,因此模型裁剪通常最先下手的地方就是通道数

3. 数据流的变化

设计好了网络结构之后,网络的卷积核大小,通道,步长,padding等都已经确定了,那么一个好的工程师应该非常清楚输入数据在每一层的流动情况。

计算公式:

W_{2}=\left (W_{1}-F+2P \right )/S+1

H_{2}=\left (H_{1}-F+2P \right )/S+1

  • W_{1} :卷积前图像的宽度;
  • W_{2} :卷积后Feature Map的宽度;
  • H_{_{1}} :卷积前图像的高度;
  • H_{_{2}}: 卷积后Feature Map的高度;
  • P :padding数量;
  • S:stride步长.
     

首先计算一下最简单的LeNet。网络结构如下:

下面是我自己论文中的一个架构图,之前一直是直接调用TensorFlow网络运行,没有关注过数据流的走向,通过今天的梳理发现全连接层确实是挺占内存的。另外计算时间复杂度的话,和输入输出feature map的大小有关,网上有人说为什么设计网络的通道数先小后大,是为了维护前面和后面的卷积计算量平衡,由此看也是有些道理的吧。[注:我的架构图在第3,7,9层卷积前面各有一个最大池化操作,在图中没有标出]

 改进Resnet架构:

 数据流变化:

网络层(操作)输入filterstridepadding输出计算公式参数量
Input57\times57\times1-----0
Conv157\times57\times11\times51157\times57\times161\times5\times1\times16+1696
Conv257\times57\times165\times11157\times57\times165\times1\times1\times16+1696
Max Pool157\times57\times16-2-29\times29\times16--
Conv329\times29\times163\times31129\times29\times163\times3\times16\times16+162320
Conv429\times29\times163\times31129\times29\times163\times3\times16\times16+162320
Conv529\times29\times163\times31129\times29\times163\times3\times16\times16+162320
Conv629\times29\times163\times31129\times29\times163\times3\times16\times16+162320
Max Pool229\times29\times16-2-15\times15\times16--
Conv715\times15\times163\times31115\times15\times323\times3\times16\times32+324640
Conv815\times15\times323\times31115\times15\times323\times3\times32\times​​​​​​​32+324640
Max Pool315\times15\times32-218\times8\times32--
Conv98\times8\times323\times3118\times8\times323\times3\times32\times​​​​​​​32+324640
Conv108\times8\times323\times3118\times8\times323\times3\times32\times​​​​​​​32+324640
Conv118\times8\times323\times3118\times8\times323\times3\times32\times​​​​​​​32+324640
Conv128\times8\times323\times3118\times8\times323\times3\times32\times​​​​​​​32+324640
Max Pool48\times8\times32-214\times4\times32--
FC14\times4\times32---5124\times4\times32\times​​​​​​​512+512262656
FC2512---4512*4+42052

 

 

参考网址:

CNN复杂度分析

 

 

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
卷积神经网络(Convolutional Neural Network, CNN)是一种常用的深度学习模型,主要用于图像处理和计算机视觉任务。下面是用公式表示卷积神经网络的算法复杂度的一种方法: 1. 前向传播的复杂度: - 假设输入特征图的尺寸为 W×H,卷积核的尺寸为 F×F,卷积层的深度为 D,卷积层的数量为 M。 - 假设每个卷积操作的计算复杂度为 O(F^2)。 - 在每个卷积层中,需要进行 W×H 个卷积操作。 - 因此,每个卷积层的计算复杂度为 O(W×H×F^2)。 - 考虑到有 M 个卷积层,整体的前向传播复杂度为 O(M×W×H×F^2)。 2. 反向传播的复杂度: - 反向传播过程中,需要计算梯度并更新网络参数。 - 假设每个参数更新操作的计算复杂度为 O(1)。 - 在每个卷积层中,需要进行 W×H 个参数更新操作。 - 因此,每个卷积层的参数更新复杂度为 O(W×H)。 - 考虑到有 M 个卷积层,整体的反向传播复杂度为 O(M×W×H)。 3. 整体复杂度: - 卷积神经网络的训练过程通常是前向传播和反向传播交替进行,直到达到收敛条件。 - 假设迭代次数为 T。 - 因此,整体的训练复杂度为 O(T×M×W×H×F^2)。 需要注意的是,以上分析是基于对卷积操作和参数更新操作的简化假设。实际情况可能因网络结构、数据集大小和训练参数等因素而有所不同。因此,上述分析只是对卷积神经网络算法复杂度的一种估计,实际评估时应结合具体问题和实验结果进行综合考虑。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Briwisdom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值