1.【Python时序预测系列】基于CNN+LSTM+Attention实现单变量时间序列预测(案例+源码)
2.(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的网网络DEAP脑电情绪识别
3.ncnn和pnnx和onnx
4.ncnn的使用2:onnx转ncnn模型跑resnet18
5.教程三分钟学习NCNN算法移植
6.å·ç§¯ç¥ç»ç½ç»
【Python时序预测系列】基于CNN+LSTM+Attention实现单变量时间序列预测(案例+源码)
本文将介绍如何结合CNN、LSTM和Attention机制实现单变量时间序列预测。络源这种方法能够有效处理序列数据中的代码时空特征,结合了CNN在局部特征捕捉方面的网网络优势和LSTM在时间依赖性处理上的能力。此外,络源引入注意力机制能够选择性关注序列中的代码3389易语言源码关键信息,增强模型对细微和语境相关细节的网网络捕捉能力。
具体实现步骤如下:
首先,络源读取数据集。代码数据集包含条记录,网网络按照8:2的络源比例划分为训练集和测试集。训练集包含条数据,代码用于模型训练;测试集包含条数据,网网络用于评估模型预测效果。络源
接着,代码对数据进行归一化处理,确保输入模型的数据在一定范围内,有利于模型训练和预测。
构造数据集时,构建输入序列(时间窗口)和输出标签。这些序列将被输入到模型中,以预测未来的时间点。
构建模拟合模型进行预测,通过训练得到的模型参数,将输入序列作为输入,预测下一个时间点的tailwindcss源码下载值。
展示预测效果,包括测试集的真实值与预测值的对比,以及原始数据、训练集预测结果和测试集预测结果的可视化。
总结,本文基于CNN、LSTM和Attention机制实现的单变量时间序列预测方法,能够有效处理序列数据中的复杂特征。实践过程中,通过合理的数据划分、归一化处理和模型结构设计,实现了对时间序列数据的准确预测。希望本文的分享能为读者提供宝贵的参考,促进在时间序列预测领域的深入研究和应用。
(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的DEAP脑电情绪识别
在本文中,我们采用连续卷积神经网络(CNN)对DEAP数据集进行脑电情绪识别。主要内容是将脑电信号在频域分段后提取其微分熵特征,构建三维脑电特征输入到CNN中。实验结果表明,该方法在情感识别任务上取得了.%的准确率。
首先,我们采用5种频率带对脑电信号进行特化处理,然后将其转换为**的格式。接着,我们提取了每个脑电分段的treeset排序源码微分熵特征,并对其进行了归一化处理,将数据转换为*N*4*的格式。在这一过程中,我们利用了国际-系统,将一维的DE特征变换为二维平面,再将其堆叠成三维特征输入。
在构建连续卷积神经网络(CNN)模型时,我们使用了一个包含四个卷积层的网络,每个卷积层后面都添加了一个具有退出操作的全连接层用于特征融合,并在最后使用了softmax层进行分类预测。模型设计时考虑了零填充以防止立方体边缘信息丢失。实验结果表明,这种方法在情感识别任务上表现良好,准确率为.%。
为了对比,我们还编写了支持向量机(SVM)和多层感知器(MLP)的代码,结果分别为.%和.%的准确率。实验结果表明,连续卷积神经网络模型在DEAP数据集上表现最好。
总的来说,通过结合不同频率带的信号特征,同时保持通道间的空间信息,我们的三维脑电特征提取方法在连续卷积神经网络模型上的实验结果显示出高效性。与其他相关方法相比,该方法在唤醒和价分类任务上的psd源码空间平均准确率分别达到了.%和.%,取得了最佳效果。
完整代码和论文资源可以在此获取。
ncnn和pnnx和onnx
Pnnx作为ncnn的中间件,允许ncnn支持torchscript,简化了转换过程。它不直接是一个推理库,而是提供了一种将计算图导出为其他推理库所需文件格式的方法。
NCNN提供多种功能,包括手动修改参数、动态操作和加速技巧。这些修改通常针对与ONNX和ATEN的兼容性。通过理解和运用这些技巧,可以更好地利用NCNN的性能。
在转换过程中,涉及到一个概念叫“lower”,即使用支持的算子来模拟模型中不支持的算子。例如,如果模型包含一个带有padding的卷积,而推理库不支持padding,那么lower过程会将该卷积分解为垫阵和无padding的卷积。同样,sigmoid操作可能会被分解为多个基本操作以模拟其功能。
在将模型转换为ONNX时,lower操作会重复进行两次。从python代码到torchscript再到ONNX,前端源码集这会导致计算图变得庞大且细碎,不利于推理优化和模型理解。此外,这种转换可能会引入额外的算子,如Gather、Unsqueeze,这些在NCNN中可能不被支持。
Pnnx位于torchscript之下,提供了一种从torchscript导出ncnn模型的新途径,从而实现模型部署。Pnnx的算子定义与python代码的接口保持一致,支持类似于python的API。通过保留原始模型的算子定义和参数,Pnnx模型可以被轻松转换回原始python代码或导出为Pnnx。
在NCNN源码中,magic值记录了推理框架的版本号,表示模型文件的特定信息。Pnnx参考了NCNN的模型写法,支持更灵活的参数键,如字符串,以与python API保持一致。此外,Pnnx支持保留算术表达式的整体性,优化GPU和可编程硬件的性能,并提供自定义算子的导出和优化功能。
在将模型转换为Pnnx时,可以指定模块操作,如Focus,以合并多个小操作为一个大操作,提高效率。Pnnx还支持量化感知训练的算子导出,并在转换过程中记录量化参数,解决了量化模型导出的问题。此外,Pnnx允许在模型中指定输入形状,有助于优化表达式和常量折叠过程,同时支持静态和动态形状。
在Pnnx的内部图优化过程中,使用模板匹配技术从torchscript ir中找到对应的封闭子图,并将其替换为目标操作,从而优化模型结构。Pnnx提供了一个完整的框架,包括加载torchscript、转换为Pnnx ir、进行图优化和转换为python代码的过程。
当前Pnnx项目兼容PyTorch 1.8、1.9和1.版本,支持种PyTorch上层操作中种转换为NCNN对应的操作。Pnnx已经实现了自动单元测试和代码覆盖率,对于常用CNN模型如ResNet和ShuffleNet,转换和推理结果与原始python版本一致。未来计划增加更多PyTorch算子支持、增强单元测试、测试端到端RNN和Transformer模型,并编写使用教程和开发文档。
ncnn的使用2:onnx转ncnn模型跑resnet
NCNN的使用教程:将ONNX模型转换为运行ResNet
NCNN提供了强大的模型转换工具,便于将Caffe、ONNX等模型转换为ncnn格式。在编译后的ncnn build/tools目录下,我们找到了onnx2ncnn工具。本文将展示如何使用它将PyTorch导出的ResNet的ONNX模型转换为ncnn适用的模型。
项目的结构如下:src存放源代码,python包含脚本,model_param存放模型文件,image存放推理,bin存放可执行文件。在bin目录下,我们拷贝了来自ncnn/build/tools/onnx的onnx2ncnn工具。
在python脚本export_res.py中,通过给定示例输入,我们导出resnet的ONNX模型至model_param目录。然后,我们使用ncnn官方提供的工具onnx2ncnn进行转换,生成resnet.param和resnet.bin文件,分别存储模型结构和参数。
resnet.param文件包含(magic number)和层与blob的数量,其中blob用于存储中间数据。Blob的数量通常比层多,因为每个层可能有多个输入和输出。例如,Convolution层有输入和输出blob,而Split算子则有多个输入和输出。
在推理代码中,我们参考ncnn/examples/squeezenet.cpp编写,首先创建Net实例,加载模型参数(resnet.param和resnet.bin),并确保输入转换为RGB格式,因为OpenCV默认为BGR。此外,还需对进行归一化处理,以适应模型的输入要求。
CMakeLists.txt文件中,我们设置了ncnn库的搜索路径,并将可执行文件输出到bin目录下,同时链接ncnn和OpenCV库。
通过以上步骤,你已经学会了如何使用ncnn将ONNX格式的ResNet模型转换并进行推理。
教程三分钟学习NCNN算法移植
本文介绍如何基于EASY EAI Nano移植NCNN部署库,以及如何成功运行yolov4的Demo。NCNN是由腾讯优图实验室开发的高性能神经网络前向计算框架,专为手机端优化,支持多输入、多分支结构的卷积神经网络计算,并且无第三方库依赖,支持跨平台操作。NCNN基于C++实现,支持ARM NEON汇编级优化,内存管理精细,支持多核并行计算,以及基于Vulkan API的GPU加速。支持8bit量化和半精度浮点存储,可导入多种框架的模型。
NCNN广泛应用于图像分类、风格迁移、目标检测、人脸检测等领域,并已被多款APP使用。接下来,我们通过以下步骤完成NCNN算法的移植学习。
1. 下载与编译NCNN源码
从百度网盘获取NCNN源码包,使用解压命令展开NCNN库。
执行编译指令,生成NCNN库文件。
2. 运行yolov4的Demo
下载包含yolov4基于NCNN运行的Demo,解压并执行编译指令。
将编译后的可执行程序文件通过Ubuntu推送至EASY EAI Nano板卡的指定目录。
在EASY EAI Nano板卡执行程序,观察执行结果。
在Ubuntu端获取识别成功的,并查看实际效果。
至此,NCNN算法移植学习完成。更多教程请持续关注我们。欲了解更多关于EASY EAI Nano的信息,请访问官方页面。
å·ç§¯ç¥ç»ç½ç»
1ãäºç»´äºç¸å ³è¿ç®
äºç»´äºç¸å ³ï¼cross-correlationï¼è¿ç®çè¾å ¥æ¯ä¸ä¸ªäºç»´è¾å ¥æ°ç»åä¸ä¸ªäºç»´æ ¸ï¼kernelï¼æ°ç»ï¼è¾åºä¹æ¯ä¸ä¸ªäºç»´æ°ç»ï¼å ¶ä¸æ ¸æ°ç»é常称为å·ç§¯æ ¸æè¿æ»¤å¨ï¼filterï¼ãå·ç§¯æ ¸ç尺寸é常å°äºè¾å ¥æ°ç»ï¼å·ç§¯æ ¸å¨è¾å ¥æ°ç»ä¸æ»å¨ï¼å¨æ¯ä¸ªä½ç½®ä¸ï¼å·ç§¯æ ¸ä¸è¯¥ä½ç½®å¤çè¾å ¥åæ°ç»æå ç´ ç¸ä¹å¹¶æ±åï¼å¾å°è¾åºæ°ç»ä¸ç¸åºä½ç½®çå ç´ ãå¾1å±ç¤ºäºä¸ä¸ªäºç¸å ³è¿ç®çä¾åï¼é´å½±é¨ååå«æ¯è¾å ¥ç第ä¸ä¸ªè®¡ç®åºåãæ ¸æ°ç»ä»¥å对åºçè¾åºã
2ãäºç»´å·ç§¯å±
å·ç§¯å±å¾åäºå·ç§¯è¿ç®ï¼ä½å·ç§¯å±ä¸ç¨å°ç并éå·ç§¯è¿ç®èæ¯äºç¸å ³è¿ç®ãæ们å°æ ¸æ°ç»ä¸ä¸ç¿»è½¬ãå·¦å³ç¿»è½¬ï¼åä¸è¾å ¥æ°ç»åäºç¸å ³è¿ç®ï¼è¿ä¸è¿ç¨å°±æ¯å·ç§¯è¿ç®ãç±äºå·ç§¯å±çæ ¸æ°ç»æ¯å¯å¦ä¹ çï¼æ以使ç¨äºç¸å ³è¿ç®ä¸ä½¿ç¨å·ç§¯è¿ç®å¹¶æ æ¬è´¨åºå«ã
äºç»´å·ç§¯å±å°è¾å ¥åå·ç§¯æ ¸åäºç¸å ³è¿ç®ï¼å¹¶å ä¸ä¸ä¸ªæ éåç½®æ¥å¾å°è¾åºãå·ç§¯å±ç模ååæ°å æ¬å·ç§¯æ ¸åæ éåç½®ã
3ãç¹å¾å¾ä¸æåé
äºç»´å·ç§¯å±è¾åºçäºç»´æ°ç»å¯ä»¥çä½æ¯è¾å ¥å¨ç©ºé´ç»´åº¦ï¼å®½åé«ï¼ä¸æä¸çº§ç表å¾ï¼ä¹å«ç¹å¾å¾ï¼feature mapï¼ãå½±åå ç´ xçåå计ç®çææå¯è½è¾å ¥åºåï¼å¯è½å¤§äºè¾å ¥çå®é 尺寸ï¼å«åxçæåéï¼receptive fieldï¼ã
以å¾1为ä¾ï¼è¾å ¥ä¸é´å½±é¨åçå个å ç´ æ¯è¾åºä¸é´å½±é¨åå ç´ çæåéãæ们å°å¾ä¸å½¢ç¶ä¸º2Ã2çè¾åºè®°ä¸ºYï¼å°Yä¸å¦ä¸ä¸ªå½¢ç¶ä¸º2Ã2çæ ¸æ°ç»åäºç¸å ³è¿ç®ï¼è¾åºå个å ç´ zãé£ä¹ï¼zå¨Yä¸çæåéå æ¬Yçå ¨é¨å个å ç´ ï¼å¨è¾å ¥ä¸çæåéå æ¬å ¶ä¸å ¨é¨9个å ç´ ãå¯è§ï¼æ们å¯ä»¥éè¿æ´æ·±çå·ç§¯ç¥ç»ç½ç»ä½¿ç¹å¾å¾ä¸å个å ç´ çæåéåå¾æ´å 广éï¼ä»èææè¾å ¥ä¸æ´å¤§å°ºå¯¸çç¹å¾ã
4ãå¡«å åæ¥å¹
æ们ä»ç»å·ç§¯å±çä¸¤ä¸ªè¶ åæ°ï¼å³å¡«å åæ¥å¹ ï¼å®ä»¬å¯ä»¥å¯¹ç»å®å½¢ç¶çè¾å ¥åå·ç§¯æ ¸æ¹åè¾åºå½¢ç¶ã
4.1 å¡«å ï¼paddingï¼
æ¯æå¨è¾å ¥é«å宽ç两侧填å å ç´ ï¼é常æ¯0å ç´ ï¼ï¼å¾2éæ们å¨åè¾å ¥é«å宽ç两侧åå«æ·»å äºå¼ä¸º0çå ç´ ã
å¦æåè¾å ¥çé«åå®½æ¯ å ï¼å·ç§¯æ ¸çé«åå®½æ¯ å ï¼å¨é«ç两侧ä¸å ±å¡«å è¡ï¼å¨å®½ç两侧ä¸å ±å¡«å åï¼åè¾åºå½¢ç¶ä¸ºï¼
)
æ们å¨å·ç§¯ç¥ç»ç½ç»ä¸ä½¿ç¨å¥æ°é«å®½çæ ¸ï¼æ¯å¦3Ã3ï¼5Ã5çå·ç§¯æ ¸ï¼å¯¹äºé«åº¦ï¼æ宽度ï¼ä¸ºå¤§å°ä¸º2k+1çæ ¸ï¼ä»¤æ¥å¹ 为1ï¼å¨é«ï¼æ宽ï¼ä¸¤ä¾§éæ©å¤§å°ä¸ºkçå¡«å ï¼ä¾¿å¯ä¿æè¾å ¥ä¸è¾åºå°ºå¯¸ç¸åã
4.2 æ¥å¹ ï¼strideï¼
å¨äºç¸å ³è¿ç®ä¸ï¼å·ç§¯æ ¸å¨è¾å ¥æ°ç»ä¸æ»å¨ï¼æ¯æ¬¡æ»å¨çè¡æ°ä¸åæ°å³æ¯æ¥å¹ ï¼strideï¼ãæ¤åæ们使ç¨çæ¥å¹ é½æ¯1ï¼å¾3å±ç¤ºäºå¨é«ä¸æ¥å¹ 为3ãå¨å®½ä¸æ¥å¹ 为2çäºç»´äºç¸å ³è¿ç®ã
ä¸è¬æ¥è¯´ï¼å½é«ä¸æ¥å¹ 为 ï¼å®½ä¸æ¥å¹ 为 æ¶ï¼è¾åºå½¢ç¶ä¸ºï¼
å¦æ ,é£ä¹è¾åºå½¢ç¶å°ç®å为ï¼
æ´è¿ä¸æ¥ï¼å¦æè¾å ¥çé«å宽è½åå«è¢«é«å宽ä¸çæ¥å¹ æ´é¤ï¼é£ä¹è¾åºå½¢ç¶å°æ¯:(nh/sh)Ã(nw/sw)
å½ æ¶ï¼æ们称填å 为pï¼å½ æ¶ï¼æ们称æ¥å¹ 为sã
5ãå¤è¾å ¥ééåå¤è¾åºéé
ä¹åçè¾å ¥åè¾åºé½æ¯äºç»´æ°ç»ï¼ä½çå®æ°æ®ç维度ç»å¸¸æ´é«ãä¾å¦ï¼å½©è²å¾åå¨é«å宽2个维度å¤è¿æRGBï¼çº¢ã绿ãèï¼3个é¢è²ééãå设彩è²å¾åçé«å宽åå«æ¯håwï¼åç´ ï¼ï¼é£ä¹å®å¯ä»¥è¡¨ç¤ºä¸ºä¸ä¸ª3ÃhÃwçå¤ç»´æ°ç»ï¼æ们å°å¤§å°ä¸º3çè¿ä¸ç»´ç§°ä¸ºééï¼channelï¼ç»´ã
5.1 å¤è¾å ¥éé
å·ç§¯å±çè¾å ¥å¯ä»¥å å«å¤ä¸ªééï¼å¾4å±ç¤ºäºä¸ä¸ªå«2个è¾å ¥ééçäºç»´äºç¸å ³è®¡ç®çä¾åã
5.2 å¤è¾åºéé
å·ç§¯å±çè¾åºä¹å¯ä»¥å å«å¤ä¸ªééï¼è®¾å·ç§¯æ ¸è¾å ¥ééæ°åè¾åºééæ°åå«ä¸ºciåcoï¼é«å宽åå«ä¸ºkhåkwãå¦æå¸æå¾å°å«å¤ä¸ªééçè¾åºï¼æ们å¯ä»¥ä¸ºæ¯ä¸ªè¾åºééåå«å建形ç¶ä¸ºciÃkhÃkwçæ ¸æ°ç»ï¼å°å®ä»¬å¨è¾åºééç»´ä¸è¿ç»ï¼å·ç§¯æ ¸çå½¢ç¶å³coÃciÃkhÃkwã
对äºè¾åºééçå·ç§¯æ ¸ï¼æ们æä¾è¿æ ·ä¸ç§ç解ï¼ä¸ä¸ªciÃkhÃkwçæ ¸æ°ç»å¯ä»¥æåæç§å±é¨ç¹å¾ï¼ä½æ¯è¾å ¥å¯è½å ·æç¸å½ä¸°å¯çç¹å¾ï¼æ们éè¦æå¤ä¸ªè¿æ ·çciÃkhÃkwçæ ¸æ°ç»ï¼ä¸åçæ ¸æ°ç»æåçæ¯ä¸åçç¹å¾ã
5.3 1x1å·ç§¯å±
æå讨论形ç¶ä¸º1Ã1çå·ç§¯æ ¸ï¼æ们é常称è¿æ ·çå·ç§¯è¿ç®ä¸º1Ã1å·ç§¯ï¼ç§°å å«è¿ç§å·ç§¯æ ¸çå·ç§¯å±ä¸º1Ã1å·ç§¯å±ãå¾5å±ç¤ºäºä½¿ç¨è¾å ¥ééæ°ä¸º3ãè¾åºééæ°ä¸º2ç1Ã1å·ç§¯æ ¸çäºç¸å ³è®¡ç®ã
1Ã1å·ç§¯æ ¸å¯å¨ä¸æ¹åé«å®½çæ åµä¸ï¼è°æ´ééæ°ã1Ã1å·ç§¯æ ¸ä¸è¯å«é«å宽维度ä¸ç¸é»å ç´ ææç模å¼ï¼å ¶ä¸»è¦è®¡ç®åçå¨ééç»´ä¸ãå设æ们å°ééç»´å½ä½ç¹å¾ç»´ï¼å°é«å宽维度ä¸çå ç´ å½ææ°æ®æ ·æ¬ï¼é£ä¹1Ã1å·ç§¯å±çä½ç¨ä¸å ¨è¿æ¥å±çä»·ã
6ãå·ç§¯å±ä¸å ¨è¿æ¥å±ç对æ¯
äºç»´å·ç§¯å±ç»å¸¸ç¨äºå¤çå¾åï¼ä¸æ¤åçå ¨è¿æ¥å±ç¸æ¯ï¼å®ä¸»è¦æ两个ä¼å¿ï¼
ä¸æ¯å ¨è¿æ¥å±æå¾åå±å¹³æä¸ä¸ªåéï¼å¨è¾å ¥å¾åä¸ç¸é»çå ç´ å¯è½å 为å±å¹³æä½ä¸åç¸é»ï¼ç½ç»é¾ä»¥ææå±é¨ä¿¡æ¯ãèå·ç§¯å±ç设计ï¼å¤©ç¶å°å ·ææåå±é¨ä¿¡æ¯çè½åã
äºæ¯å·ç§¯å±çåæ°éæ´å°ãä¸èèåç½®çæ åµä¸ï¼ä¸ä¸ªå½¢ç¶ä¸º(ci,co,h,w)çå·ç§¯æ ¸çåæ°éæ¯ciÃcoÃhÃwï¼ä¸è¾å ¥å¾åç宽é«æ å ³ãåå¦ä¸ä¸ªå·ç§¯å±çè¾å ¥åè¾åºå½¢ç¶åå«æ¯(c1,h1,w1)å(c2,h2,w2)ï¼å¦æè¦ç¨å ¨è¿æ¥å±è¿è¡è¿æ¥ï¼åæ°æ°éå°±æ¯c1Ãc2Ãh1Ãw1Ãh2Ãw2ã使ç¨å·ç§¯å±å¯ä»¥ä»¥è¾å°çåæ°æ°éæ¥å¤çæ´å¤§çå¾åã
X=torch.rand(4,2,3,5)
print(X.shape)
conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))
Y=conv2d(X)
print('Y.shape: ',Y.shape)
print('weight.shape: ',conv2d.weight.shape)
print('bias.shape: ',conv2d.bias.shape)
è¾åºï¼
torch.Size([4, 2, 3, 5])
Y.shape: torch.Size([4, 3, 3, 5])
weight.shape: torch.Size([3, 2, 3, 5])
bias.shape: torch.Size([3])
7ãæ± å
7.1 äºç»´æ± åå±
æ± åå±ä¸»è¦ç¨äºç¼è§£å·ç§¯å±å¯¹ä½ç½®çè¿åº¦æææ§ãåå·ç§¯å±ä¸æ ·ï¼æ± åå±æ¯æ¬¡å¯¹è¾å ¥æ°æ®çä¸ä¸ªåºå®å½¢ç¶çªå£ï¼åç§°æ± åçªå£ï¼ä¸çå ç´ è®¡ç®è¾åºï¼æ± åå±ç´æ¥è®¡ç®æ± åçªå£å å ç´ çæ大å¼æè å¹³åå¼ï¼è¯¥è¿ç®ä¹åå«å«åæå¤§æ± åæå¹³åæ± åãå¾6å±ç¤ºäºæ± åçªå£å½¢ç¶ä¸º2Ã2çæå¤§æ± åã
äºç»´å¹³åæ± åçå·¥ä½åçä¸äºç»´æå¤§æ± å类似ï¼ä½å°æ大è¿ç®ç¬¦æ¿æ¢æå¹³åè¿ç®ç¬¦ãæ± åçªå£å½¢ç¶ä¸ºpÃqçæ± åå±ç§°ä¸ºpÃqæ± åå±ï¼å ¶ä¸çæ± åè¿ç®å«ä½pÃqæ± åã
æ± åå±ä¹å¯ä»¥å¨è¾å ¥çé«å宽两侧填å 并è°æ´çªå£ç移å¨æ¥å¹ æ¥æ¹åè¾åºå½¢ç¶ãæ± åå±å¡«å åæ¥å¹ ä¸å·ç§¯å±å¡«å åæ¥å¹ çå·¥ä½æºå¶ä¸æ ·ã
å¨å¤çå¤ééè¾å ¥æ°æ®æ¶ï¼æ± åå±å¯¹æ¯ä¸ªè¾å ¥ééåå«æ± åï¼ä½ä¸ä¼åå·ç§¯å±é£æ ·å°åééçç»ææééç¸å ãè¿æå³çæ± åå±çè¾åºééæ°ä¸è¾å ¥ééæ°ç¸çã
CNNç½ç»ä¸å¦å¤ä¸ä¸ªä¸å¯å¯¼çç¯èå°±æ¯Poolingæ± åæä½ï¼å 为Poolingæä½ä½¿å¾feature mapç尺寸ååï¼åå¦å2Ã2çæ± åï¼å设é£ä¹ç¬¬l+1å±çfeature mapæ个梯度ï¼é£ä¹ç¬¬lå±å°±ä¼æ个梯度ï¼è¿ä½¿å¾æ¢¯åº¦æ æ³å¯¹ä½çè¿è¡ä¼ æä¸å»ãå ¶å®è§£å³è¿ä¸ªé®é¢çææ³ä¹å¾ç®åï¼å°±æ¯æ1个åç´ çæ¢¯åº¦ä¼ éç»4个åç´ ï¼ä½æ¯éè¦ä¿è¯ä¼ éçlossï¼æè 梯度ï¼æ»åä¸åãæ ¹æ®è¿æ¡ååï¼mean poolingåmax poolingçååä¼ æä¹æ¯ä¸åçã
7.2 mean pooling
mean poolingçååä¼ æå°±æ¯æä¸ä¸ªpatchä¸çå¼æ±åå¹³åæ¥åpoolingï¼é£ä¹ååä¼ æçè¿ç¨ä¹å°±æ¯ææ个å ç´ ç梯度çå为n份åé ç»åä¸å±ï¼è¿æ ·å°±ä¿è¯æ± åååç梯度ï¼æ®å·®ï¼ä¹åä¿æä¸åï¼è¿æ¯æ¯è¾ç解çï¼å¾ç¤ºå¦ä¸ï¼
mean poolingæ¯è¾å®¹æ让人ç解éçå°æ¹å°±æ¯ä¼ç®åç认为ç´æ¥æ梯度å¤å¶Néä¹åç´æ¥ååä¼ æåå»ï¼ä½æ¯è¿æ ·ä¼é ælossä¹åå为åæ¥çNåï¼ç½ç»æ¯ä¼äº§ç梯度çç¸çã
7.3 max pooling
max poolingä¹è¦æ»¡è¶³æ¢¯åº¦ä¹åä¸åçååï¼max poolingçååä¼ ææ¯æpatchä¸æ大çå¼ä¼ éç»åä¸å±ï¼èå ¶ä»åç´ çå¼ç´æ¥è¢«èå¼æãé£ä¹ååä¼ æä¹å°±æ¯æ梯度ç´æ¥ä¼ ç»åä¸å±æä¸ä¸ªåç´ ï¼èå ¶ä»åç´ ä¸æ¥å梯度ï¼ä¹å°±æ¯ä¸º0ãæ以max poolingæä½åmean poolingæä½ä¸åç¹å¨äºéè¦è®°å½ä¸æ± åæä½æ¶å°åºåªä¸ªåç´ çå¼æ¯æ大ï¼ä¹å°±æ¯max idã
æºç ä¸æä¸ä¸ªmax_idx_çåéï¼è¿ä¸ªåéå°±æ¯è®°å½æ大å¼æå¨ä½ç½®çï¼å 为å¨ååä¼ æä¸è¦ç¨å°ï¼é£ä¹å设ååä¼ æåååä¼ æçè¿ç¨å°±å¦ä¸å¾æ示ã
7.4 Pytorch å®ç°æ± åå±
æ们使ç¨Pytorchä¸çnn.MaxPool2då®ç°æå¤§æ± åå±ï¼å ³æ³¨ä»¥ä¸æé å½æ°åæ°ï¼
kernel_size â the size of the window to take a max over
stride â the stride of the window. Default value is kernel_size
padding â implicit zero padding to be added on both sides
forwardå½æ°çåæ°ä¸ºä¸ä¸ªåç»´å¼ éï¼å½¢ç¶ä¸º ï¼è¿åå¼ä¹æ¯ä¸ä¸ªåç»´å¼ éï¼å½¢ç¶ä¸º ï¼å ¶ä¸Næ¯æ¹é大å°ï¼C,H,Wåå«è¡¨ç¤ºééæ°ãé«åº¦ã宽度ã
X=torch.arange(,dtype=torch.float).view(1,2,4,4)
pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))
Y=pool2d(X)
print(X)
print(Y)
ç»ä¹
1ãåå¦ä½ ç¨å ¨è¿æ¥å±å¤çä¸å¼ \times Ãç彩è²ï¼RGBï¼å¾åï¼è¾åºå å«ä¸ªç¥ç»å ï¼å¨ä½¿ç¨åç½®çæ åµä¸ï¼åæ°æ°éæ¯ï¼
çï¼å¾åå±å¹³åé¿åº¦ä¸º3ÃÃï¼æéåæ°ååç½®åæ°çæ°éæ¯3à à à + =ã
2ãåå¦ä½ ç¨å ¨è¿æ¥å±å¤çä¸å¼ Ãç彩è²ï¼RGBï¼å¾åï¼å·ç§¯æ ¸çé«å®½æ¯3Ã3ï¼è¾åºå å«ä¸ªééï¼å¨ä½¿ç¨åç½®çæ åµä¸ï¼è¿ä¸ªå·ç§¯å±å ±æå¤å°ä¸ªåæ°ï¼
çï¼è¾å ¥ééæ°æ¯3ï¼è¾åºééæ°æ¯ï¼æ以åæ°æ°éæ¯Ã3Ã3Ã3+=ã
3ãconv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2)ï¼è¾å ¥ä¸å¼ å½¢ç¶ä¸º3ÃÃçå¾åï¼è¾åºçå½¢ç¶ä¸ºï¼
çï¼è¾åºééæ°æ¯4ï¼ä¸ä¸ä¸¤ä¾§æ»å ±å¡«å 4è¡ï¼å·ç§¯æ ¸é«åº¦æ¯3ï¼æ以è¾åºçé«åº¦æ¯ - 3 + 1=−3+1=ï¼å®½åº¦åçå¯å¾ã
4ãå ³äºå·ç§¯å±ï¼ä»¥ä¸åªç§è¯´æ³æ¯é误çï¼
A.1Ã1å·ç§¯å¯ä»¥çä½æ¯ééç»´ä¸çå ¨è¿æ¥
B.æ个äºç»´å·ç§¯å±ç¨äºå¤çå½¢ç¶ä¸º3ÃÃçè¾å ¥ï¼å该å·ç§¯å±æ æ³å¤çå½¢ç¶ä¸º3ÃÃçè¾å ¥
C.å·ç§¯å±éè¿å¡«å ãæ¥å¹ ãè¾å ¥ééæ°ãè¾åºééæ°çè°èè¾åºçå½¢ç¶
D .两个è¿ç»ç3Ã3å·ç§¯æ ¸çæåéä¸ä¸ä¸ª5Ã5å·ç§¯æ ¸çæåéç¸å
çï¼éBï¼å¯¹äºé«å®½ç»´åº¦ï¼åªè¦è¾å ¥çé«å®½ï¼å¡«å åçï¼å¤§äºæçäºå·ç§¯æ ¸çé«å®½å³å¯è¿è¡è®¡ç®ã
the first layer is a 3 Ã 3 convolution, the second is a fully connected layer on top of the 3 Ã 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 Ã 5 convolution with two layers of 3 Ã 3 convolution.
æ们å设å¾çæ¯5*5ç
æ们使ç¨5*5çå·ç§¯æ ¸å¯¹å ¶å·ç§¯ï¼æ¥é¿ä¸º1ï¼å¾å°çç»ææ¯:(5-5)/1+1=1
ç¶åæ们使ç¨2个å·ç§¯æ ¸ä¸º3*3çï¼è¿éç两个æ¯æ2å±ï¼
第ä¸å±3*3ï¼
å¾å°çç»ææ¯(5-3)/1+1=3
第äºå±3*3ï¼
å¾å°çç»ææ¯(3-3)/1+1=1
æ以æ们çæç»å¾å°ç»ææåé大å°åç¨5*5çå·ç§¯æ ¸å¾å°çç»æ大å°æ¯ä¸æ ·çï¼ï¼ï¼
5ãå ³äºæ± åå±ï¼ä»¥ä¸åªç§è¯´æ³æ¯é误çï¼
A.æ± åå±ä¸åä¸ååä¼ æ
B.æ± åå±æ²¡æ模ååæ°
C.æ± åå±é常ä¼åå°ç¹å¾å¾çé«å宽
D.æ± åå±çè¾å ¥åè¾åºå ·æç¸åçééæ°
çï¼A
é项1ï¼é误ï¼æ± åå±æåä¸æ¨¡åçæ£å计ç®ï¼åæ ·ä¹ä¼åä¸ååä¼ æ
é项2ï¼æ£ç¡®ï¼æ± åå±ç´æ¥å¯¹çªå£å çå ç´ æ±æ大å¼æå¹³åå¼ï¼å¹¶æ²¡æ模ååæ°åä¸è®¡ç®
é项3ï¼æ£ç¡®
é项4ï¼æ£ç¡®
åèæç®ï¼
n::Mat out`中。最后,对推理结果应用`sigmoid`函数,得到输出的outPtr及其对应的类别置信度。