CNN和LSTM的计算复杂度分析

前言:今天做边缘计算的时候,在评估模型性能的时候发现NPU计算的大部分时间都花在了LSTM上,使用的是Bi-LSTM(耗时占比98%),CNN耗时很短,不禁会思考为什么LSTM会花费这么久时间。

 首先声明一下实验条件:这里使用的是振动信号,输入的数据,长度是1024,通道是1通道输入,batchsize也是1

一、CNN计算复杂度公式:

卷积核大小为 K x K,输入通道数为 C_in,输出通道数为 C_out,输入大小为 W x H

卷积操作的复杂度: O(K*K * C_in * C_out * W * H)

举个例子:我的第一个卷积层input:1channel,output:32channels,卷积核大小是1*3,为了保持输入数据长度和输出数据长度保持不变,padding=(k-1)/2=1

输入数据格式:1*1*1024(batchsize、channel、len)

输入数据格式: 1*32*1024

计算复杂度:1*32*3*1024

二、LSTM计算复杂度公式:

假设 LSTM 的隐藏层大小为 H,输入大小为 I,时间步数为 T

每个时间步的计算复杂度为 O(I * H + H^2)(包括矩阵乘法和激活函数)。

LSTM计算复杂度为 O(T * (I * H + H*H))

举个例子:输入大小是指上一层CNN输出的通道数128,隐藏层大小设置为128,时间步数就是数据长度:128

复杂度为:128*(128*128+128*128)=4194304

计算比例:4194304%(32*3*1024)=43%

因为这个是双层lstm:43*2=86符合预期,在实际计算中LSTM花费的时间更长,我估计是NPU对CNN结构的计算优化更好吧,下面是网络的完整结构

Layer: CNN_LSTM_Model
  Input shapes: [torch.Size([32, 1, 1024])]
  Output shape: torch.Size([32, 10])
Layer: Conv1d
  Input shapes: [torch.Size([32, 1, 1024])]
  Output shape: torch.Size([32, 32, 1024])
Layer: ReLU
  Input shapes: [torch.Size([32, 32, 1024])]
  Output shape: torch.Size([32, 32, 1024])
Layer: Conv1d
  Input shapes: [torch.Size([32, 32, 1024])]
  Output shape: torch.Size([32, 32, 1024])
Layer: ReLU
  Input shapes: [torch.Size([32, 32, 1024])]
  Output shape: torch.Size([32, 32, 1024])
Layer: MaxPool1d
  Input shapes: [torch.Size([32, 32, 1024])]
  Output shape: torch.Size([32, 32, 512])
Layer: Conv1d
  Input shapes: [torch.Size([32, 32, 512])]
  Output shape: torch.Size([32, 64, 512])
Layer: ReLU
  Input shapes: [torch.Size([32, 64, 512])]
  Output shape: torch.Size([32, 64, 512])
Layer: MaxPool1d
  Input shapes: [torch.Size([32, 64, 512])]
  Output shape: torch.Size([32, 64, 256])
Layer: Conv1d
  Input shapes: [torch.Size([32, 64, 256])]
  Output shape: torch.Size([32, 128, 256])
Layer: ReLU
  Input shapes: [torch.Size([32, 128, 256])]
  Output shape: torch.Size([32, 128, 256])
Layer: MaxPool1d
  Input shapes: [torch.Size([32, 128, 256])]
  Output shape: torch.Size([32, 128, 128])
Layer: Sequential
  Input shapes: [torch.Size([32, 1, 1024])]
  Output shape: torch.Size([32, 128, 128])
Layer: LSTM
  Input shapes: [torch.Size([32, 128, 128]), <class 'tuple'>]
  Output shapes: [torch.Size([32, 128, 256]), <class 'tuple'>]
Layer: Linear
  Input shapes: [torch.Size([32, 128, 256])]
  Output shape: torch.Size([32, 128, 256])
Layer: Attention
  Input shapes: [torch.Size([32, 128]), torch.Size([32, 128, 256])]
  Output shape: torch.Size([32, 1, 128])
Layer: LayerNorm
  Input shapes: [torch.Size([32, 256])]
  Output shape: torch.Size([32, 256])
Layer: ResidualConnection
  Input shapes: [torch.Size([32, 256]), <class 'function'>]
  Output shape: torch.Size([32, 256])
Layer: Linear
  Input shapes: [torch.Size([32, 256])]
  Output shape: torch.Size([32, 500])
Layer: ReLU
  Input shapes: [torch.Size([32, 500])]
  Output shape: torch.Size([32, 500])
Layer: Dropout
  Input shapes: [torch.Size([32, 500])]
  Output shape: torch.Size([32, 500])
Layer: Linear
  Input shapes: [torch.Size([32, 500])]
  Output shape: torch.Size([32, 10])
Layer: Sequential
  Input shapes: [torch.Size([32, 256])]
  Output shape: torch.Size([32, 10])

CNN-LSTM LSTM 都是深度学习模型,用于处理序列数据。它们的主要区别在于如何处理时间序列中的空间时间信息。 ### CNN-LSTM (卷积循环神经网络) **优势** - **局部连接**: CNN-LSTM 结合了卷积神经网络(CNN)的特点,通过局部连接对输入序列进行特征提取,这使得它能够捕捉到序列中的空间结构局部模式。 - **高效计算**: 利用共享权重局部感受野的优势,减少了训练时间计算资源的需求。 - **预训练**: 可以利用已经训练好的 CNN 模型进行初始化,加速后续任务的训练过程。 **局限** - 对于长序列的长期依赖性问题不如LSTM有效。 ### LSTM(长短期记忆) **优势** - **门控机制**: LSTM 引入了输入门、遗忘门输出门的机制,允许模型动态地控制信息的流入、更新流出,有效地解决了长序列中的长期依赖问题。 - **精确的记忆能力**: 能够长时间保持记忆关键信息而不受于遗忘曲线的影响,这对于语音识别、机器翻译等任务非常重要。 - **灵活性**: 根据需要可以设计多种变体,如GRU(简化版LSTM)、双向LSTM等,适用于不同的应用场景。 **局限** - 计算复杂度较高,对于大型序列数据训练速度较慢。 - 参数量大,容易过拟合并需要更多的计算资源。 ### 区别总结 - **应用领域**:通常,如果任务涉及到需要识别图像中的局部特征,并同时考虑其在时间序列中的上下文,那么CNN-LSTM可能是更好的选择。例如,在视频分析中,既需要检测物体的位置(空间特性),也需要追踪物体随时间的变化(时间特性)。 - **性能需求**:对于复杂的序列预测任务,特别是那些存在长期依赖性的场景下,LSTM或其变种如GRU往往能提供更优的表现。 - **计算效率**:从计算角度考虑,如果数据集较大并且内存资源有限,使用具有局部连接特性的CNN-LSTM可能会是一个更为经济的选择。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值