CNN和LSTM的计算复杂度分析

server/2025/3/31 2:14:26/

前言:今天做边缘计算的时候,在评估模型性能的时候发现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_ModelInput shapes: [torch.Size([32, 1, 1024])]Output shape: torch.Size([32, 10])
Layer: Conv1dInput shapes: [torch.Size([32, 1, 1024])]Output shape: torch.Size([32, 32, 1024])
Layer: ReLUInput shapes: [torch.Size([32, 32, 1024])]Output shape: torch.Size([32, 32, 1024])
Layer: Conv1dInput shapes: [torch.Size([32, 32, 1024])]Output shape: torch.Size([32, 32, 1024])
Layer: ReLUInput shapes: [torch.Size([32, 32, 1024])]Output shape: torch.Size([32, 32, 1024])
Layer: MaxPool1dInput shapes: [torch.Size([32, 32, 1024])]Output shape: torch.Size([32, 32, 512])
Layer: Conv1dInput shapes: [torch.Size([32, 32, 512])]Output shape: torch.Size([32, 64, 512])
Layer: ReLUInput shapes: [torch.Size([32, 64, 512])]Output shape: torch.Size([32, 64, 512])
Layer: MaxPool1dInput shapes: [torch.Size([32, 64, 512])]Output shape: torch.Size([32, 64, 256])
Layer: Conv1dInput shapes: [torch.Size([32, 64, 256])]Output shape: torch.Size([32, 128, 256])
Layer: ReLUInput shapes: [torch.Size([32, 128, 256])]Output shape: torch.Size([32, 128, 256])
Layer: MaxPool1dInput shapes: [torch.Size([32, 128, 256])]Output shape: torch.Size([32, 128, 128])
Layer: SequentialInput shapes: [torch.Size([32, 1, 1024])]Output shape: torch.Size([32, 128, 128])
Layer: LSTMInput shapes: [torch.Size([32, 128, 128]), <class 'tuple'>]Output shapes: [torch.Size([32, 128, 256]), <class 'tuple'>]
Layer: LinearInput shapes: [torch.Size([32, 128, 256])]Output shape: torch.Size([32, 128, 256])
Layer: AttentionInput shapes: [torch.Size([32, 128]), torch.Size([32, 128, 256])]Output shape: torch.Size([32, 1, 128])
Layer: LayerNormInput shapes: [torch.Size([32, 256])]Output shape: torch.Size([32, 256])
Layer: ResidualConnectionInput shapes: [torch.Size([32, 256]), <class 'function'>]Output shape: torch.Size([32, 256])
Layer: LinearInput shapes: [torch.Size([32, 256])]Output shape: torch.Size([32, 500])
Layer: ReLUInput shapes: [torch.Size([32, 500])]Output shape: torch.Size([32, 500])
Layer: DropoutInput shapes: [torch.Size([32, 500])]Output shape: torch.Size([32, 500])
Layer: LinearInput shapes: [torch.Size([32, 500])]Output shape: torch.Size([32, 10])
Layer: SequentialInput shapes: [torch.Size([32, 256])]Output shape: torch.Size([32, 10])


http://www.ppmy.cn/server/179825.html

相关文章

Pytorch--tensor.view()

在 PyTorch 中&#xff0c;tensor.view() 是一个常用的方法&#xff0c;用于改变张量&#xff08;Tensor&#xff09;的形状&#xff08;shape&#xff09;&#xff0c;但不会改变其数据本身。它类似于 NumPy 的 reshape()&#xff0c;但有一些关键区别。 1. 基本用法 import …

一文了解 MCP Server:AI 工具与外部世界的桥梁

引言 随着大语言模型&#xff08;LLM&#xff09;的普及与 AI Agent 的爆发&#xff0c;Anthropic 于 2024 年底提出并开源的 Model Context Protocol&#xff08;MCP&#xff0c;模型上下文协议&#xff09;成为构建智能体系统的关键基石之一。本文将结合最新的实战经验&#…

STM32滴答定时器(SysTick)原理及延时函数实现

一、滴答定时器(SysTick)简介 SysTick是ARM Cortex内核内置的一个24位向下递减计数器&#xff0c;通常用于操作系统的时基和任务调度。STM32中&#xff0c;这个定时器也经常用于实现精准的延时功能。 SysTick的寄存器包括&#xff1a; CTRL (控制和状态寄存器) LOAD (重装载…

Python 函数参数深度解析教程

目录 一、参数基础类型1. 位置参数&#xff08;Positional Arguments&#xff09;2. 默认参数&#xff08;Default Arguments&#xff09;3. 可变参数3.1 可变位置参数&#xff08;*args&#xff09;3.2 可变关键字参数&#xff08;**kwargs&#xff09; 二、高级参数组合1. 命…

【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在现代操作系统中&#xff0c;线程是程序执行流的最小单元。与进程相比&#xff0c;线程更加轻量级&#xff0c;创建和销毁的开销更小&…

三维动态规划-LeetCode3418. 机器人可以获得的最大金币数

太爽了&#xff01;做完这道题&#xff0c;让我感觉就像是斩杀了一条大龙&#xff01;历时72天&#xff0c;分3次花掉30小时。终获突破&#xff01; 零、题目 3418. 机器人可以获得的最大金币数 给你一个 m x n 的网格。一个机器人从网格的左上角 (0, 0) 出发&#xff0c;目…

Day16 -实例:Web利用邮箱被动绕过CDN拿真实ip

本想测试一下全局ping&#xff0c;刚好注册的时候收到了邮件&#xff0c;刚好去做一下复现。 原理&#xff1a;主动让对方站点给我们发邮件&#xff08;注册、修改密码、订阅推送等&#xff09;我们查看邮件原文&#xff0c;原文里存在真实的邮件站点ip 特点&#xff1a;邮件…

[python]基于yolov10实现热力图可视化支持图像视频和摄像头检测

YOLOv10 Grad-CAM 可视化工具 本工具基于YOLOv10模型&#xff0c;结合Grad-CAM技术实现目标检测的可视化分析&#xff0c;支持图像、视频和实时摄像头处理。 功能特性 支持多种Grad-CAM方法实时摄像头处理视频文件处理图像文件处理 环境要求 Python 3.8需要电脑带有nvidia…