【小王讲源码】【linux c telnet源码】【线程控制 源码】cnn网络源码_cnn网络代码

来源:帝国后台系统源码

1.【Python时序预测系列】基于CNN+LSTM+Attention实现单变量时间序列预测(案例+源码)
2.(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的网网络DEAP脑电情绪识别
3.ncnn和pnnx和onnx
4.ncnn的使用2:onnx转ncnn模型跑resnet18
5.教程三分钟学习NCNN算法移植
6.卷积神经网络

cnn网络源码_cnn网络代码

【Python时序预测系列】基于CNN+LSTM+Attention实现单变量时间序列预测(案例+源码)

       本文将介绍如何结合CNN、LSTM和Attention机制实现单变量时间序列预测。络源这种方法能够有效处理序列数据中的代码时空特征,结合了CNN在局部特征捕捉方面的网网络优势和LSTM在时间依赖性处理上的能力。此外,络源引入注意力机制能够选择性关注序列中的代码小王讲源码关键信息,增强模型对细微和语境相关细节的网网络捕捉能力。

       具体实现步骤如下:

       首先,络源读取数据集。代码数据集包含条记录,网网络按照8:2的络源比例划分为训练集和测试集。训练集包含条数据,代码用于模型训练;测试集包含条数据,网网络用于评估模型预测效果。络源

       接着,代码对数据进行归一化处理,确保输入模型的数据在一定范围内,有利于模型训练和预测。

       构造数据集时,构建输入序列(时间窗口)和输出标签。这些序列将被输入到模型中,以预测未来的时间点。

       构建模拟合模型进行预测,通过训练得到的模型参数,将输入序列作为输入,预测下一个时间点的linux c telnet源码值。

       展示预测效果,包括测试集的真实值与预测值的对比,以及原始数据、训练集预测结果和测试集预测结果的可视化。

       总结,本文基于CNN、LSTM和Attention机制实现的单变量时间序列预测方法,能够有效处理序列数据中的复杂特征。实践过程中,通过合理的数据划分、归一化处理和模型结构设计,实现了对时间序列数据的准确预测。希望本文的分享能为读者提供宝贵的参考,促进在时间序列预测领域的深入研究和应用。

(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的DEAP脑电情绪识别

       在本文中,我们采用连续卷积神经网络(CNN)对DEAP数据集进行脑电情绪识别。主要内容是将脑电信号在频域分段后提取其微分熵特征,构建三维脑电特征输入到CNN中。实验结果表明,该方法在情感识别任务上取得了.%的准确率。

       首先,我们采用5种频率带对脑电信号进行特化处理,然后将其转换为**的格式。接着,我们提取了每个脑电分段的线程控制 源码微分熵特征,并对其进行了归一化处理,将数据转换为*N*4*的格式。在这一过程中,我们利用了国际-系统,将一维的DE特征变换为二维平面,再将其堆叠成三维特征输入。

       在构建连续卷积神经网络(CNN)模型时,我们使用了一个包含四个卷积层的网络,每个卷积层后面都添加了一个具有退出操作的全连接层用于特征融合,并在最后使用了softmax层进行分类预测。模型设计时考虑了零填充以防止立方体边缘信息丢失。实验结果表明,这种方法在情感识别任务上表现良好,准确率为.%。

       为了对比,我们还编写了支持向量机(SVM)和多层感知器(MLP)的代码,结果分别为.%和.%的准确率。实验结果表明,连续卷积神经网络模型在DEAP数据集上表现最好。

       总的来说,通过结合不同频率带的信号特征,同时保持通道间的空间信息,我们的三维脑电特征提取方法在连续卷积神经网络模型上的实验结果显示出高效性。与其他相关方法相比,该方法在唤醒和价分类任务上的hdmi源码输出设置平均准确率分别达到了.%和.%,取得了最佳效果。

       完整代码和论文资源可以在此获取。

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及其对应的类别置信度。

文章所属分类:休闲频道,点击进入>>