稀疏卷积【1】Submanifold Sparse Convolutional Networks-程序员宅基地

技术标签: 目标检测  深度学习  

学习submanifold sparse convolutional networks是因为在看3D点云目标检测文章时遇到了问题,在3D点云目标检测问题中,相关算法如PVrcnn,pointnet系列,Voxelnet都使用了3D sparse convolutional作为提取特征的工具,这一部分有必要深入了解。


Submanifold Sparse Convolutional Networks

文章研究动机和目标
此处是摘要内容,我结合了最近在研究的PVrcnn文章来分析稀疏卷积。

卷积网络是分析图像、视频、三维形状等时空数据的事实标准。 虽然其中一些数据是自然密集的(例如,照片),但许多其他数据源本质上是稀疏的。 例子包括在一张纸上形成的笔击,或(彩色)三维点使用LiDAR扫描仪或RGB-D相机获得的DS。 当应用于这种稀疏数据时,卷积网络的标准“密集”实现是非常低效的。 我们引入了一种稀疏卷积运算,它专门处理稀疏数据,它不同于以往在稀疏卷积网络上的工作,因为它严格地在子流形上工作, 而不是用网络中的每一层“膨胀”观察。我们对得到的子流形稀疏卷积网络的经验分析表明,它们的性能与最先进的方法相当,同时需要更少的计算。

可以看出稀疏卷积要解决的是对稀疏数据进行更有效的特征提取问题。
什么是稀疏数据源呢?

在逆向工程中通过测量仪器得到的产品外观表面的点数据集合也称之为点云,通常使用三维坐标测量机所得到的点数量比较少,点与点的间距也比较大,叫稀疏点云;而使用三维激光扫描仪或照相式扫描仪得到的点云,点数量比较多并且比较密集,叫密集点云。

在PV-rcnn点云目标检测算法中,第一步是对点数数据进行关键点提取,使用的关键点提取的方法是FPS算法,提取关键点在KITTI数据中设置的是2048,相比较原有的数万个点云,2048个数据点包含了全局的信息,显然,与原本的点云数据量相比,数据点变少了,数据间的间距变大了,密集的点云也会变成稀疏点云,得到了稀疏数据源,由此要处理稀疏数据就使用到了稀疏卷积。这也就是为什么第二步要使用稀疏卷积的原因。

那么为什么不能使用密集卷积呢?使用其会导致什么问题呢?
传统的卷积网络实现是针对稠密网格上的数据进行优化的,不能有效地处理稀疏数据。稠密网格上的数据,正如图片就是标准的网格数据,其是一个像素接着一个像素的。 最近,已经提出了一些卷积网络实现,这些实现是为了有效地处理稀疏数据[1,2,9]而量身定做的。在数学上,这些实现中的一些与常规卷积网络相同,但它们在FLOPS[1]和/或内存[2]方面需要较少的计算资源。OctNets[9]稍微修改卷积算子,以产生“平均”隐藏状态的部分网格远离感兴趣的区域。
卷积网络的先验稀疏实现的缺点之一是它们“扩展”了每一层中的稀疏数据,因为它们实现了“完全”卷积。 在本工作中,我们证明了在不扩展特征映射的情况下,成功地训练在整个网络层中保持相同稀疏模式的卷积网络是可能的。为此,我们探索了两种新的卷积算子:稀疏卷积(SC)和有效稀疏卷积(VSC)。 在我们识别手写数字和三维形状的实验中,使用SC和VSC的网络达到了最先进的性能,同时将计算和内存需求减少了~50%。


文章的动机

将d维卷积网络定义为一个d+1维张量作为输入的网络(d+1维中d维是时空维(包括长、宽、高、时间等),那1维主要指的是特征空间维度)
稀疏输入对应于与特征向量相关联的site的d维网格。 如果特征向量中的任何元素不处于基态,例如,如果它是非零1 ,我们将输入中的site定义为活动site。 在许多实际问题中,阈值可以用来消除特征向量在离基态很小距离内的位置。 注意,即使输入张量是(D 维,活动是一种d维现象:沿特征维的整个平面要么是活动的,要么不是活动的。

卷积网络的隐层也用特征空间向量的d维网格表示。当通过网络传播输入数据时,如果作为输入的层中的任何site处于活动状态,则隐藏层中的site处于活动状态。 (注意,当使用3×3个卷积时,每个site连接到下面隐藏层中的3×3=9个站点。 ) 因此,隐藏层中的活动遵循归纳定义,其中每一层确定下一层中的活动状态集。 在每个隐藏层中,非活动site都有相同的特征向量:对应于基态的特征向量。 注意,隐藏层中的基态通常不等于零,特别是当使用带有偏置项的卷积时。 然而,无论基态的值如何,在训练过程中,基态值只需要计算一次每向前通过一次(并且在测试时只计算一次所有向前通过)。 这样可以大大节省计算和内存需求;确切的节省取决于数据稀疏性和网络深度。


本文分析的问题点和提出的解决方法

在本文中,我们认为上面描述的框架限制性过强,特别是因为卷积操作没有被修改以适应输入数据的稀疏性。 如果输入数据包含单个活动site,那么在应用3d 卷积后,将有3d活动site点。 应用相同大小的第二次卷积将产生5d活性site,以此类推。在实现包含几十个甚至数百个卷积的现代卷积网络体系结构时,这种活动站点数量的快速增长是一个很糟糕的前景,例如VGG,resnet和densenet[3,4,10]。 当然,卷积网络并不经常应用于只具有单个活动site的输入,但是当输入数据进行计算时,上述“膨胀”问题和当输入数据包括具有两个或多个维度的空间中的一维曲线,或三维或多个维度中的二维曲面时存在同样的问题。
为了解决有源位点膨胀的问题,我们提出了两种稍微不同的卷积操作,用于卷积网络。 这两种运算的共同点是它们都忽略了基态:它们用零向量代替基态,以简化卷积运算。 这两种操作的区别在于它们如何处理活动site:而不是自动使site处于活动状态,如果对其接收字段的任何输入都是活动的(从而扩大了一组活动site set,这里的扩大和膨胀是一个意思,英文都是dilation),我们最有效的卷积运算只考虑中心输入。 因此,活动站点的输出集与输入集的输出集完全相同。我们实验证明,使用我们的适应卷积算子允许我们建立更深的网络,以实现最先进的结果,同时通过保持稀疏需要更少的计算资源。

总结上面可以看出文章提出的解决方案是:
处理活动site时只考虑中心输入,而避免了密集卷积中处理数据时出现的‘膨胀’问题。


Submanifold Dilation

在这里插入图片描述
上图中,我们给出了一个嵌入在二维网格上的一维曲线的例子。 图中显示,即使我们在这个网格上应用小的3×3卷积,网格上的稀疏性也会迅速消失。 同时,如果我们只将卷积的输出限制在主动输入点的集合上,则网络中的隐藏层无法捕获许多与曲线分类相关的信息 。 特别是,两个相邻的连接组件将被完全独立地处理。 幸运的是,几乎所有的卷积网络都包含某种形式的池,或者使用strided卷积。这个操作是我们研究的稀疏卷积网络2 的基础,因为它们允许相邻组件合并。 尤其是对于组件越接近,池数/阶梯卷积越小,用于将组件合并到隐藏层表示中就越有必要。


Very Deep Convolutional Networks

在图像分类中,具有小滤波器的非常深的卷积网络,通常大小为3×3像素,填充为1像素(以保持特征映射的大小),已经证明是非常有效的。 这种小滤波器在具有相对宽层的VGG网络中得到了成功的应用。 剩余网络(ResNet)的引入表明,具有小滤波器的更深但更窄的网络更有效。 非常深的Res网、ResNeXt模型和具有瓶颈连接的密集网的成功[3,4,12]表明,一次计算相对较少的特征并将这些特征合并成一个更大的状态变量是有用的,要么通过向量加法,要么通过特征向量级联。
不幸的是,使用现有的稀疏卷积网络实现,这些技术是不切实际的。 一个问题是,具有多个路径的网络将倾向于生成不同的活动路径集,这些路径必须合并才能重新连接输出。 这似乎很难有效地执行这种合并。 更重要的是,Res网和密集网产生了如此大的接收场,稀疏几乎会立即被活跃地点数量的爆炸所破坏。


(Valid) Sparse Convolutions: SC and VSC

我们定义了一个稀疏卷积SC ( m , n , f , s ) (m,n,f,s) (mnfs),它有m个输入特征平面、n个输出特征平面、f的滤波器大小和步长s。我们假设f和s是奇数整数,但我们可以允许推广到非平方滤波器,例如, f = 1 × 7 o r f = 7 × 1 f = 1 × 7 or f = 7 × 1 f=1×7orf=7×1,如果我们想实现Inception风格的分解卷积[11]。 SC卷积以与常规卷积相同的方式计算活动site点集:它在其大小为 f d f^d fd的接收场中寻找任何活动site的存在。如果输入有大小为 l l l 那么输出将有大小 ( l − f + s ) / s (l-f+s)/s (lf+s)/s
SC卷积不同于常规卷积,因为它假设来自这些site的输入完全为零,从而丢弃了非活动site的基态。 虽然这是卷积运算的一个看似很小的变化,但它可能在实践中带来计算上的好处。
接下来,我们定义了第二种稀疏卷积,这构成了本文的主要贡献。同样,让 f f f表示奇数,或奇数的集合,例如 f = 3 f=3 f=3 f = 1 × 7 f=1×7 f=1×7。 我们将有效稀疏卷积VSC ( m , n , f , 1 ) (m,n,f,1) (mnf1)定义为修正的SC ( m , n , f , 1 ) (m,n,f,1) (mnf1)卷积。
首先,我们用 ( f − 1 ) / 2 (f-1)/2 (f1)/2来填充输入, 这样输出将具有与输入相同的大小。接下来,我们限制输出站点处于活动状态,当且仅当输入中相应站点的站点处于活动状态(即如果接收字段中的中心站点处于活动状态)。 无论何时一个输出site被确定为活动的,其输出特征向量由SC操作计算。
下表给出了规则卷积以及SC和VSC卷积的计算和内存需求。
在这里插入图片描述
在活动和非活动站点上的三种不同卷积操作的计算和内存成本:规则卷积C、稀疏卷积(SC)和有效稀疏卷积(VSC)。 我们考虑尺寸为3的卷积在d维的单个位置。
注:a是空间位置的主动输入数,m是输入特征平面的数目,n是输出特征平面的数目。
为了使用SC和VSC构建卷积网络,我们还需要激活函数、批归一化和池。 激活函数像往常一样定义,但仅限于活动site集。 同样,我们定义了batch normalization,即在活动site集合上应用的常规批规范化。 最大池MP ( f , s ) (f,s) (fs)和平均池AP ( f , s ) (f,s) (fs)操作被定义为SC ( ⋅ , ⋅ , f , s ) (·,·,f,s) (fs)的变体)。 在接收场中,MP取零向量和输入特征向量的最大值。 AP计算 f − d f^{-d} fd乘以主动输入向量的和。
我们还定义了一个反卷积运算DC ( ⋅ , ⋅ , f , s ) (·,·,f,s) (fs)作为SC ( ⋅ , ⋅ , f , s ) (·,·,f,s) (fs)卷积的逆操作。 从DC卷积得到的有源输出位点的集合正是输入有源位点到匹配的SC卷积的集合。 输入输出site之间的连接集是简单地倒置。


Submanifold Convolutional Networks

这一部分实际上就是使用VSC和strided SC来重新搭建网络的基本结构。
我们使用VSC卷积、strided SC卷积和稀疏池操作的组合来构建流行的VGG、ResNet和DenseNet卷积网络的稀疏版本。

我们在网络中使用的块如下图所示。
在这里插入图片描述
(a)VG G块包括两个VSC卷积和一个最大池操作;
(b)保持空间分辨率的Res Net块将两个VSC卷积的输出添加到输入中;
( c)减少空间分辨率的Res Net块通过一条STREDSC卷积代替第一个VSC卷积和(隐式)标识函数;
(d)保持空间分辨率的密集网块将两个VSC卷积的输出与输入连接起来;
(e)减少空间分辨率的密集网块执行单个VSC卷积和平均池.
卷积算子(SC或VSC)的四个参数分别是输入平面ni的数目、输出平面no的数目、核大小和步长
池运算符的两个参数分别是内核大小和步幅。 密集网[4]的**“增长率”用g表示**。

我们将我们的网络称为子流变卷积网络,因为它们被优化以处理生活在高维空间中的低维数据 3
我们使用名称VGG来指包含多个VSC ( ⋅ , ⋅ , 3 , 1 ) (·,·,3,1) 31卷积的网络,由最大池[10]分隔。 每个卷积后面是批归一化和一个ReLU非线性激活函数。
同样,我们定义了“预激活的Resnet”[3]其中大多数数据处理是由VSC ( ⋅ , ⋅ , 3 , 1 ) (·,·,3,1) 31卷积对执行的, 其中剩余连接是标识函数。 每当输入/输出特性数量不同时,我们使用 V S C ( ⋅ , ⋅ , 1 , 1 ) VSC(·,·,1,1) VSC(,,1,1)代替。 当尺度发生变化时,我们用SC ( ⋅ , ⋅ , 3 , 2 ) (·,·,3,2) 32卷积代替第一卷积和残差连接。 这确保两个分支可以使用相同的活动site的哈希表,并减少对两个大小相等的矩阵的简单和的添加。 残差连接的接收场的增大也防止了过度的信息丢失。
我们也做实验submanifold DenseNets。 在这里,“密集”一词不是指缺乏空间稀疏性,而是指卷积运算之间的连接模式。 一个简单的DenseNet模块是一个卷积序列,其中每个卷积以所有先前卷积操作的级联输出作为输入。 我们的子流形密集网中的瓶颈层是以与Res网相同的方式实现的。


Implementation

这部分是实现(V)SC卷积的过程
有效地实现(V)SC卷积, 我们将输入/隐藏层的状态存储在两个部分中:哈希表 4 和矩阵。矩阵的大小为a×m,每个活动site包含一行。(a是空间位置的主动输入数,m是输入特征平面的数目。) 哈希表包含所有活动site的(位置,行)对:位置是整数坐标的元组,行号表示特征矩阵中对应的行。
给定滤波器大小 f f f的卷积,我们定义了一个规则书,它是大小 k i × 2 ki×2 ki×2 f d f^d fd整数矩阵的集合 R = ( R i : i ∈ { 0 , 1 , . . . , f − 1 } d ) R=(R_{i}:i∈\{0,1,...,f-1\} ^{d} ) R=(Rii{ 01...f1}d)。 实现SC ( m , n , f , s ) (m,n,f,s) (mnfs)卷积,,我们执行了:

  • 通过输入哈希表迭代一次。 我们通过迭代输出层中接收来自输入层中给定点的输入的点,实时构建输出哈希表和规则簿。 当第一次访问输出站点时,在输出哈希表中创建一个新条目。 根据输入和输出点之间的空间偏移,在规则书中添加一个(输入索引、输出索引)对。
  • 将输出矩阵初始化为所有零。 对于每个 i ∈ f i∈f if,都有一个参数矩阵 W i W_i Wi,其大小为 m × n m×n m×n。 对于每个 j ∈ { 1 , . . . , k i } j∈\{1,...,k_i\} j{ 1...ki},将输入特征矩阵的第 R i ( j , 1 ) R^i(j,1) Ri(j1)行乘以 W i W^i Wi,并将其添加到输出特征矩阵的第 R i ( j , 2 ) R^i(j,2) Ri(j2)行中。 这可以在GPU上非常有效地实现,因为它是一个矩阵矩阵乘法添加操作。

为了实现VSC卷积,我们重用了输出的输入哈希表,并构造了适当的规则书。 请注意,由于稀疏模式不变,相同的规则书可以在VGG/RESNET/DenseNet网络中重用,直到遇到池或次采样层。

如果输入层中有活动点,则构建输入哈希表的成本为 O ( a ) O(a) O(a)。 对于VGG/Res Net/Dense Net网络,假设活动site的数量随着每次池操作而减少,无论网络的深度如何,构建所有哈希表和规则簿的成本也是 O ( a ) O(a) O(a)


Experiments

我们在具有稀疏图像的二维和三维数据集上进行实验。 CASIA数据集[7] 5包含3755个GBK级别-1字符的样本,每类约240个列车和60个测试图像。 对于我们的模型来说,CJVK字符是很好的测试用例,因为它们是稀疏卷积网络的最坏情况: 当在尺度64×64绘制时,大约8%的像素是活动的,但由于笔划密度小,这一百分比在汇集后迅速下降。 这使它们成为我们模型的一个很好的测试用例。
ModelNet-40数据集 6 包含2468个CAD模型,其中包含与40个类对应的形状。 在将模型输入到卷积网络之前,我们遵循[8]的预处理。 所有CAD模型都呈现为尺寸为 3 0 3 30^3 303的表面。

Results on CASIA

我们首先在CASIA数据集上实验了两种VGG架构。 我们训练了100个epoch的所有模型,使用大小为100的批次,SGD+momentum 为0.9,重量衰减为 1 0 − 4 10^{-4} 104, 每个epoch的学习速率衰减为5。 为了简单起见,我们不使用任何数据增强。

我们的VGG网络的体系结构及其性能见下表。我们观察到,“规则”C卷积和“稀疏”SC卷积实现了相同的误差:这一结果表明,丢弃基态基本上不会对性能产生负面影响。 这是一个总是丢弃基态的论点,因为它使事情在计算和算法上更容易。 比较SC和VSC卷积,我们只考虑卷积的有效部分,观察到性能损失最小。最小的精度损失确实有助于很大的计算改进:使用VSC的网络使用2到3×倍较少的计算和内存。
在这里插入图片描述

接下来,我们在CASIA上进行了 submanifold ResNets实验。 我们实现Resnet和常规Resnet的关键区别在于stage-2 Resnet模块使用SC ( ⋅ , ⋅ , 3 , 2 ) (·,·,3,2) 32卷积用于strided 卷积,而不是SC ( ⋅ , ⋅ , 1 , 2 ) (·,·,1,2) 12。 这种改变是必要的,以确保两个分支产生相同的活动site集,这简化了簿记,并将加法操作转化为简单的矩阵-矩阵加法。 与大多数层中使用的VSC卷积不同,我们在下采样后使用的SC ( ⋅ , ⋅ , 3 , 2 ) (·,·,3,2) 32如果其任何输入都是活动的,则导致站点处于活动状态,从而避免了传递中的信息丢失。
我们的ResNet网络的体系结构及其性能见表3。
结果与使用VGG网络得到的结果是一致的:我们在最小的精度损失下,计算和内存需求至少减少了2倍。
在这里插入图片描述

我们还对密集网进行了实验;请参见下表
在这里插入图片描述

接下来,我们尝试向VGG网络添加额外的连接,以增加隐藏状态的有效接收字段;结果见下表。
在表中, a , b {a,b} ab表示与 S C ( ⋅ 、 b 、 3 、 2 ) − V S C ( b 、 3 、 1 ) − D C ( b 、 b 、 3 、 2 ) SC(·、b、3、2)-VSC(b、3、1)-DC(b、b、3、2) SC(b32)VSC(b31)DC(bb32)操作链并行执行的VSC ( ⋅ 、 a 、 3 、 1 ) (·、a、3、1) (a31)卷积; 输出被连接以产生 a + b a+b a+b输出特征平面。
为了简化网络设计,我们切换到大小-3步-2最大池,匹配SC-VSC-DC分支中的SC卷积,并将输入大小从 64 × 64 64×64 64×64减少到 63 × 63 63×63 63×63。 图3显示了一个 概述我们在CASIA数据集上的所有结果。

在这里插入图片描述


  1. 注意基态不一定要为零。

  2. 此处的“稀疏卷积网络”,我们指的是设计用于稀疏输入数据的网络。 我们不是指具有稀疏参数矩阵的网络。)

  3. 我们注意到,这是对“submanifold”一词的轻微滥用。我们的输入数据可能包含多个连接组件,甚至包含嵌入在3D空间中的1D和2D对象的混合。

  4. https://github.com/sparsehash/sparsehash

  5. http://www.nlpr.ia.ac.cn/databases/handwriting/Online_database.html

  6. http://3dshapenets.cs.princeton.edu/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38087692/article/details/107400425

智能推荐

Java面试题之:日志_logback面试问题-程序员宅基地

文章浏览阅读614次。Java面试题之:日志一、Slf4j二、Log4j三、LogBackLogback 优点四、ELK一、Slf4j  slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,jdk 自带的 java.util.lo_logback面试问题

树莓派安装mysql并开启远程访问(开启3306端口)_树莓派 mysql client sdk-程序员宅基地

文章浏览阅读2.5w次,点赞2次,收藏15次。使用dpkg -l|grep mysql:查看是否安装mysql注意:在2016-02-26-raspbian-jessie这个版本中:系统安装了mysql和java 在2015-05-05-raspbian-wheezy这个版本中:系统没有安装mysql、java1、卸载mysql一开始安装的操作系统是raspbian-jessie,故需_树莓派 mysql client sdk

python3.6 学习笔记之安装PIL_python3.6 image.pil-程序员宅基地

文章浏览阅读4.6k次。安装环境:Python 3.6.3PIL(Python Image Library)是python 的一个强大的图像处理库,不过只支持到python2.7pillow是PIL的一个派生分支,如今已发展成比PIL更具活力的图像处理库本次安装使用pip命令查看python的版本安装pillow步骤如下:1、以管理员运行命令提示符,首先_python3.6 image.pil

TP5隐藏public和index.php_tp5.1 nginx 去除public-程序员宅基地

文章浏览阅读3.1k次。个人理解:将public下的index.php文件移动到主目录下和更改index的入口文件可以在URL去掉public将public下的.htaccess文件复制到主目录下并更改配置是:当url地址访问不存在的文件或路径时,调用正则表达式进行替换自动补齐/index.php/。也就是说即使你加上index.php访问也不会出错。一、Apache1、public下的index.php入口文件..._tp5.1 nginx 去除public

bash命令的使用方法_bash怎么用-程序员宅基地

文章浏览阅读1.7w次,点赞11次,收藏58次。小编给大家分享一下bash命令的使用方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Bash(Bash)是Bourne Again Shell的缩写,用于执行描述命令(如Linux中的命令)的shell。在Linux上采用bash作为标准,基本上它描述了对带有“.sh”扩展名的vi编辑器等文本的处理并执行。与编程一样,它有许多函数,如变量,函数和算术处理,所以如果你是一个小程序,你可以用bash编写..._bash怎么用

创意多彩CSS3垂直时间轴特效_基于css实现垂直时间轴特效-程序员宅基地

文章浏览阅读1.5k次。简要教程这是一款创意多彩CSS3垂直时间轴特效。该CSS3垂直时间轴通过CSS伪元素和css transform属性,制作椭圆形和箭头,并配以多彩的颜色,构建出漂亮的垂直时间轴效果。 使用方法在页面中引入bootstrap.min.css文件。<link rel="stylesheet" href="bootstrap.min.css" type="text/css"> HTML结构该..._基于css实现垂直时间轴特效

随便推点

嵌入式Linux系统BSP简介_auto linux bsp-程序员宅基地

文章浏览阅读1k次。 作者:李智敏,华清远见嵌入式学院讲师。嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环_auto linux bsp

源码仓库搭建---linux搭建svn服务器_linux服务器做源码库-程序员宅基地

文章浏览阅读151次。1、检查系统是否已经安装如果安装就卸载检查:svnserve --version卸载:yum remove subversion2、安装yum install subversion3、建立SVN库(文件位置可自由)创建仓库文件夹:mkdir -p/opt/svn/repository用svn管理员身份创建一个仓库:svnadmincreate/opt/svn/repository执行上面的命令后,自动建立repositories库,查看/opt/svn..._linux服务器做源码库

python程序的循环结构_循环14到19的程序用python的-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏14次。遍历循环 for无限循环 while循环控制保留字循环的高级用法遍历循环遍历某个结构形成的运行方式for <循环变量> in <遍历结构> : <语句块>从遍历结构中逐一提取元素,放在循环变量由保留字fo_循环14到19的程序用python的

统计大写辅音字母 (15分)_7-11 统计大写辅音字母 (15分)英文辅音字母是除a、e、i、o、u以外的字母。本题要求编写程序-程序员宅基地

文章浏览阅读1k次。英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。输入格式:输入在一行中给出一个不超过80个字符、并以回车结束的字符串。输出格式:输出在一行中给出字符串中大写辅音字母的个数。输入样例:HELLO World!输出样例:4注意点就是记录的字母一定是要大写的;参考代码#include<stdio.h>#include..._7-11 统计大写辅音字母 (15分)英文辅音字母是除a、e、i、o、u以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

【教程】phpstudy设置伪静态-程序员宅基地

文章浏览阅读1k次。开启phpstudy扩展,勾选“rewrite_module”开启phpstudy伪静态支持,打开httpd-conf,修改所有“AllowOverrideNone”为“AllowOverrideAll”修改并保存后,需重启Apache服务器在网站根目录下添加.htaccess文件,创建时需要使用文本编辑器进行另存为创建,比如Editplus.htaccess文件代码..._php_study 伪静态

从sockaddr结构获取IP和端口_socketaddress获取ip和端口号-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏10次。前言 从sockaddr结构中提取IP, 先将结构sockaddr转为sockaddr_in结构,然后用在利用相关API将其中的IP地址从网络格式转化我们熟悉点分十进制的字符串。一、sockaddr和sockaddr_in结构程序员不应操作sockaddr结构,sockaddr是给操作系统用的程序员应使用sockaddr_in来表示地址,sockaddr_in区分..._socketaddress获取ip和端口号