【阿三源码】【raw源码】【sax源码】qnetwork 源码

2024-11-19 00:50:37 来源:15.05.1源码 分类:知识

1.Qt三种方式实现FTP上传功能
2.统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)
3.卷积神经网络

qnetwork  源码

Qt三种方式实现FTP上传功能

       FTP协议是源码用于文件传输的一种协议,简称“文件传输协议”,源码属于TCP/IP协议组的源码一部分,适用于在互联网上传输大文件。源码FTP协议有主动模式和被动模式两种,源码本文仅作简要介绍。源码阿三源码

       实现Qt项目中FTP上传功能,源码主要有三种方式:Qt4 QFtp、源码Qt5 QNetworkAccessManager和POCO中的源码FTPClientSession。

       1. Qt4 QFtp:为Qt4专设的源码FTP传输类,包含了创建目录、源码删除目录、源码删除文件、源码获取文件列表、源码raw源码上传、源码下载等常规操作接口。然而,由于Qt5弃用了该模块,转而使用QNetworkAccessManager。

       2. Qt5 QNetworkAccessManager:是Qt中的网络请求模块,包含HTTP的post、get和put操作,适用于Qt5中实现FTP上传功能。但不支持FTP创建目录、删除目录、删除文件、获取文件列表等功能,sax源码仅限上传和下载操作。

       3. POCO FTPClientSession:POCO网络模块内的FTP实现类,提供了创建目录、删除目录、删除文件、获取文件列表等接口。其功能基本涵盖了所有FTP上传需求。

       三种方式各有优缺点,使用过程中面临各种问题。下面对比分析:

       1. QFtp:虽然功能全面,但在Qt5中被废弃,需要自行编译源码,可能遇到编码问题。namenode源码优点在于接口完整、使用方便;缺点是编码和异常处理复杂,尤其在网络中断时,无法及时反馈异常信号。

       2. QNetworkAccessManager:操作简单、集成度高,异常处理友好,断网后能及时反馈,支持超时后继续上传,提高了开发效率。但功能较为单一,仅限于上传下载操作。

       3. FTPClientSession:使用简单、辞海源码接口完整,异常处理通过抛出异常实现,如删除不存在的文件夹、创建已存在的文件夹等。缺点在于没有提供上传下载进度接口或回调,计算进度较为繁琐。网络异常处理不够友好。

       FTPClientSession在获取服务器文件列表时,若文件名包含空格,会导致文件名分段,影响文件列表的正确读取。与QFtp相比,FTPClientSession的文件上传默认方式为二进制流,而QFtp和FTPClientSession允许调整上传方式,QNetworkAccessManager默认使用二进制流上传,可能导致文件大小变化,这是一个重要的问题。

       就实际使用经验而言,QFtp相对更适合,能满足需求,但需自行处理异常情况。

       本文仅概述三种实现方式的优缺点,后续文章将详细介绍如何使用这些方法,并展示在实际代码中遇到的各种问题。

统信UOS系统开发笔记(八):在统信UOS上编译搭建mqtt基础环境(版本使用QMQTT::Clinet)

       MQTT协议介绍

       MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是基于发布/订阅模式的轻量级通讯协议,由IBM于年发布。其最大优点在于,能以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT广泛应用于物联网、小型设备、移动应用等领域。

       MQTT设计原则

       MQTT具有以下特点:

       1. 使用发布/订阅模式,实现一对多的消息发布,解除应用程序耦合。

       2. 提供对负载内容的屏蔽,进行消息传输。

       3. 使用TCP/IP提供网络连接。

       4. 支持三种消息发布服务质量。

       5. 具有小型传输、开销小的特性,协议交换最小化。

       6. 为客户端异常中断提供机制。

       发布/订阅者模式

       MQTT支持发布/订阅模式,使MQTT协议在物联网、机器与机器(M2M)通信、智能家居等领域得到广泛应用。

       统信UOS系统MQTT编译与环境搭建

       统信UOS系统版本:系统版本为统信UOS 。

       Qt编译MQTT

       Qt5版本开始支持MQTT,但并未集成至安装包,需自行下载编译。Qt提供的qtmqtt库不支持点对点方式,仅支持订阅/发布者模式。

       编译步骤

       下载并解压MQTT源码至目标系统。

       使用QtQCreator打开pro工程编译,切换至release模式。

       在解压的源码路径手动创建Qt5Mqtt文件,编译成功。

       部署MQTT模块至qt

       将MQTT源码融入qt工程中,实现模块化部署。新建mqttClientDemo工程,提取源码中的mqtt模块,将其加入新工程的modules,引入qmqtt.pri文件。

       解决编译报错

       编译报错时,添加缺失的网络模块(QT += network),并调整私有头文件宏至头文件宏。

       源码融入编译成功

       源码成功融入,后续无需重新编译即可替换系统或版本。

       模块化部署优化

       创建mqttClientManager管理模块,用于包含MQTT源码,实现模块化部署。

卷积神经网络

       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:正确

       å‚考文献:

       /

       /question//answer/

       /zouxiaolv/article/details/

本文地址:http://8o.net.cn/html/37d150098462.html 欢迎转发