目标检测 | 卷积神经网络(CNN)详细介绍及其原理详解

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。CNN的核心思想是通过输入层、卷积层、池化层、全连接层和输出层来提取图像特征并进行分类。本文将详细给大家介绍卷积神经网络的基本组成及其实现原理!~🌈

     目录

🚀1.基础概念

🚀2.输入层

🚀3.卷积层

🚀4.池化层

🚀5.激活函数

🚀6.全连接层

🚀7.输出层

1962年,加拿大神经科学家Hubel和Wiesel通过研究猫的视觉神经,首次提出神经元感受野这一概念。

20世纪80年代,日本科学家 Kunihiko Fukushima在论文中介绍了神经认知网络模型,该模型可以看作是卷积神经网络的初期结构。

20世纪90年代,Yann LeCun等人提出LeNet模型,并成功应用于美国的邮政系统,用来识别手写邮政编码,首次实现了卷积神经网络的商业应用。

2012年,Geoffrey E. Hinton等人提出AlexNet,该模型获得了计算机视觉领域ImageNet图像分类竞赛冠军。

2015年,何凯明等人将参数化修正线性单元(PReLU)激活函数应用于卷积神经网络,第一次在ImageNet数据集上使神经网络的预测错误率低于人类预测错误率。

随着残差网络(ResNet)稠密连接网络(DenseNet)以及使用神经结构搜索框架得到的NASNet等一系列新型卷积神经网络模型的提出,卷积神经网络的表达能力不断提高,应用领域越来越广泛。

卷积神经网络是各个领域的研究热点,尤其是图像分类、自然语言处理、语音分析等领域,它所拥有的权值共享结构极大地减少了权值的数量,从而使得模型在复杂度方面大大地降低,尤其是在处理多维图像时,避免了繁琐的特征处理及重建过程。


🚀1.基础概念

机器学习是现今非常热门的一种人工智能方法,是通过各种智能算法,从海量的数据中找到潜在的规律,并将学习到的规律应用在新样本的识别和预测当中。深度学习是在人工神经网络等智能算法的基础上发展起来的。通过模拟人的思维,获得了识别和区分事物的能力,并建立了多层神经网络模型,这个过程叫做深度学习

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。

CNN的核心思想是通过输入层卷积层池化层全连接层输出层来提取图像特征并进行分类。下面是CNN的基本组成部分:

  1. 输入层(Input layer):主要用来输入图像信息,也是卷积神经网络最开始的层。
  2. 卷积层(Convolutional Layer):卷积层是CNN的核心部分,通过使用一组可学习的滤波器(也称为卷积核)对输入图像进行卷积操作,提取图像的局部特征。卷积操作可以有效地减少参数数量,并保留空间结构信息。

  3. 激活函数(Activation Function):在卷积层之后常,会使用激活函数对卷积结果进行非线性变换,增加网络的表达能力。常用的激活函数有ReLU、Sigmoid和Tanh等。

  4. 池化层(Pooling Layer):池化层用于降低特征图的空间尺寸,减少计算量,并保留重要的特征。常见的池化操作有最大池化和平均池化。

  5. 全连接层(Fully Connected Layer):全连接层将池化层输出的特征图展平成一维向量,并通过全连接操作进行分类或回归。全连接层通常使用softmax函数将输出转化为概率分布。

  6. 输出层(Output layer):输出预测结果,卷积神经网络最后的一层。

除了上述基本组成部分,CNN还可以通过堆叠多个卷积层、池化层和全连接层来构建深层网络,提高模型的表达能力和性能。此外,还可以使用批归一化(Batch Normalization)dropout等技术来加速训练和提高模型的泛化能力。

下面提供两种不同形式的卷积神经网络原理图,以供大家参考。👇

关于卷积神经网络,所涵盖层的作用简单总结如下: 👇

  • 输入层:输入图像等信息
  • 卷积层:用来提取图像的底层特征
  • 池化层:防止过拟合,将数据维度减小
  • 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息
  • 输出层:根据全连接层的信息得到概率最大的结果

 可以看到其中最重要的一层就是卷积层,这也是卷积神经网络名称的由来。

说明:♨️♨️♨️

YOLOv5中的Conv是最基础的卷积模块,它由一个卷积层、一个批量归一化层和一个激活函数层组成。其中卷积层用于提取特征,批量归一化层用于规范化特征图,激活函数层用于增加非线性。批归一化(Batch Normalization)是一种用于加速深度神经网络训练的技术,它通过对每个小批量样本的输入进行归一化,使得网络在训练过程中更加稳定和快速收敛。

定义:♨️♨️♨️

批归一化(Batch Normalization)是一种在深度神经网络中常用的技术,它的主要目的是解决梯度消失梯度爆炸的问题,同时还能加速网络的训练过程

在深度神经网络中,随着网络层数的增加,输入数据在每一层的变化会逐渐放大或缩小,导致激活函数的输入值分布发生偏移。这种偏移会使得网络的学习变得困难,因为每一层的参数都需要重新适应新的输入分布。此外,由于每一层的参数都是通过反向传播算法进行更新的,梯度消失和梯度爆炸也会影响网络的训练效果。

批归一化通过对每一层的输入进行归一化处理,使得每一层的输入分布保持在一个较稳定的范围内。具体来说,它通过对每个小批量样本的均值和方差进行估计,然后对输入进行线性变换和平移操作,将输入数据重新映射到一个标准正态分布。这样做的好处是可以使得网络更容易学习到适应不同输入分布的参数,并且减少了梯度消失和梯度爆炸的问题。

批归一化的优点包括:

  1. 提高网络的收敛速度:通过将输入数据归一化到一个标准分布,可以加速网络的训练过程,使得网络更快地收敛到最优解。
  2. 减少梯度消失和梯度爆炸:通过控制每一层输入的范围,批归一化可以减少梯度消失和梯度爆炸的问题,使得网络更稳定地进行训练。
  3. 提高模型的泛化能力:批归一化可以减少模型对输入数据分布的依赖,提高了模型的泛化能力,使得模型在测试集上的表现更好。

总之,批归一化是一种非常有效的技术,可以提高深度神经网络的性能和训练效果。

定义:♨️♨️♨️

Dropout是一种常用的正则化技术,用于减少神经网络中的过拟合问题。在训练过程中,Dropout会随机地将一部分神经元的输出置为0,这样可以强制网络去学习更加鲁棒的特征表示。具体来说,Dropout会在每次训练迭代中随机选择一些神经元,并将它们的输出置为0。这样做的好处是,每个神经元都不能依赖于其他特定的神经元,因此强迫网络去学习更加鲁棒的特征表示。此外,Dropout还可以减少神经元之间的相互适应性,从而减少过拟合的风险。

在测试阶段,Dropout不会被应用,而是将所有神经元的输出乘以一个保留概率,通常为0.5或0.8,以保持期望输出的总体大小不变。

总结一下,Dropout的主要作用是减少过拟合问题,增强模型的泛化能力。

卷积神经网络(Convolutional Neural Network,CNN)是一种在计算机视觉和图像处理领域非常成功的深度学习模型。以下是一些比较有名的卷积神经网络结构:

  1. LeNet-5:LeNet-5 是由 Yann LeCun 在1998年提出的第一个卷积神经网络结构,用于手写数字识别任务。它包含了卷积层、池化层和全连接层,并且使用了激活函数和softmax分类器。

  2. AlexNet:AlexNet 是由 Alex Krizhevsky 等人在2012年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。它是第一个在大规模图像数据集上取得显著突破的卷积神经网络,包含了多个卷积层和全连接层,并且使用了ReLU激活函数和Dropout正则化。

  3. VGGNet:VGGNet 是由 Karen Simonyan 和 Andrew Zisserman 在2014年提出的卷积神经网络结构,也是用于在 ImageNet 数据集上进行图像分类任务。VGGNet 的特点是使用了非常小的卷积核(3x3),并且通过堆叠多个卷积层来增加网络的深度。

  4. GoogLeNet:GoogLeNet 是由 Google 的研究团队在2014年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。它的特点是引入了 Inception 模块,通过并行使用不同大小的卷积核和池化操作来提取多尺度的特征。

  5. ResNet:ResNet 是由 Kaiming He 等人在2015年提出的卷积神经网络结构,用于在 ImageNet 数据集上进行图像分类任务。ResNet 的特点是使用了残差连接(residual connection),允许网络更深,并且能够更容易地训练。

  6. MobileNet:MobileNet 是由 Google 的研究团队在2017年提出的卷积神经网络结构,用于在移动设备上进行图像分类和目标检测任务。MobileNet 的特点是使用了深度可分离卷积(depthwise separable convolution),可以在减少参数数量的同时保持较好的性能。


🚀2.输入层

输入层比较简单,这一层的主要工作就是输入图像等信息,因为卷积神经网络主要处理的是图像相关的内容,但是我们人眼看到的图像和计算机处理的图像是一样的么?很明显是不一样的,对于输入图像,首先要将其转换为对应的二维矩阵,这个二位矩阵就是由图像每一个像素的像素值大小组成的,我们可以看一个例子,如下图所示的手写数字“8”的图像,计算机读取后是以像素值大小组成的二维矩阵存储的图像。

上图又称为灰度图像,因为其每一个像素值的范围是0~255(由纯黑色到纯白色),表示其颜色强弱程度。另外还有黑白图像,每个像素值要么是0(表示纯黑色),要么是255(表示纯白色)。我们日常生活中最常见的就是RGB图像,有三个通道,分别是红色绿色蓝色。每个通道的每个像素值的范围也是0~255,表示其每个像素的颜色强弱。但是我们日常处理的基本都是灰度图像,因为比较好操作(值范围较小,颜色较单一),有些RGB图像在输入给神经网络之前也被转化为灰度图像,也是为了方便计算,否则三个通道的像素一起处理计算量非常大。当然,随着计算机性能的高速发展,现在有些神经网络也可以处理三通道的RGB图像。现在我们已经知道了,输入层的作用就是将图像转换为其对应的由像素值构成的二维矩阵,并将此二维矩阵存储,等待后面几层的操作。


🚀3.卷积层

图片输入后,想要提取其中的特征,则需要经过卷积层了。

在卷积神经网络出现以前,最常见的神经网络被称为多层感知机(Multi-Layer Perceptron,MLP),多层感知机由输入层隐藏层输出层组成,多层感知机的结构较为简单,相邻两层之间的节点是全连接的,如下图所示,隐藏层通过非线性激活函数(Sigmoid,ReLu等)对输入数据进行处理,并将处理后的数据传递到输出层,对于分类任务,输出层通常使用Softmax输出每个类别的概率,对于回归任务,输出层输出的是一个连续值,与卷积神经网络相同的是,二者都使用反向传播算法来学习权重参数, 通常用在处理文本数据和数值数据,但在图像等非结构化数据上效果远不如卷积神经网络

图  多层感知机

定义:♨️♨️♨️

Softmax是一种常用的数学函数,它通常用于多分类问题中,将一个向量转换为概率分布。Softmax函数的定义如下:

给定一个具有n个元素的向量x = [x1, x2, …, xn],Softmax函数将每个元素xi映射为一个介于0和1之间的值,使得所有映射后的值的和等于1。

Softmax函数的计算公式如下:

softmax(xi) = exp(xi) / (exp(x1) + exp(x2) + … + exp(xn)),其中exp()表示指数函数。

Softmax函数的作用是将原始的向量转换为概率分布,使得每个元素表示对应类别的概率。在机器学习中,Softmax函数常用于多分类问题中的输出层,用于计算每个类别的概率。

定义:♨️♨️♨️

反向传播算法是一种用于训练神经网络的常用优化算法。它通过计算损失函数对网络参数的梯度,然后利用梯度下降法来更新参数,从而使得网络能够逐步优化并适应输入数据。

具体来说,反向传播算法可以分为两个阶段:前向传播反向传播

前向传播阶段,输入数据通过神经网络的各个层,逐层进行计算和传递,最终得到输出结果。在这个过程中,每个神经元都会根据输入数据和激活函数计算出输出值,并将其传递给下一层。

反向传播阶段,首先计算输出结果与真实标签之间的误差,通常使用损失函数来度量误差大小。然后,从输出层开始,通过链式法则将误差逐层向前传播回网络的每一层。在每一层中,根据上一层传递过来的误差和该层的激活函数的导数,计算出该层的误差,并将其传递给前一层。最终,得到每个参数对误差的贡献,即参数的梯度。利用参数的梯度,可以使用梯度下降法或其他优化算法来更新网络的参数,使得网络的输出结果逐渐接近真实标签,从而实现对网络的训练。

总结一下,反向传播算法通过计算损失函数对网络参数的梯度,然后利用梯度下降法来更新参数,从而实现神经网络的训练和优化。

与多层感知机不同的是,卷积神经网络主要是通过卷积层堆叠组成的,它通过卷积层对图像进行特征提取,通常一个网络会堆叠很深层的卷积结构,这样就可以从图像中提取出更高质量的特征,从而提升了对目标的识别准确率,同时卷积神经网络还具有多层感知机不具备的两个特性:局部连接权值共享,局部连接这个特性类似于生物视觉系统,类似于人眼可以通过物体的局部特征去判断这个物体的类别,对于卷积神经网络而言,输出特征图上的每一个像素点都是由卷积核在输入图像上卷积得到的,也就是卷积核只与输入特征的一个小区域连接,因此,卷积层可以保留到图像的空间局部性,从而准确地捕捉到特征的局部信息,这与全连接层不同,全连接层的各个节点之间是互相连接的,输出层的每一个特征点都与上一层的特征点有联系。

具体来讲,卷积层就是通过一定数量的卷积核对输入通道的单个或多个通道的特征图进行“滑窗”式运算,得到更高层次的语义信息的特征图,不断重复这个过程就可以实现高维度的特征提取,从而识别出图像上的特征信息。

下图展示的是单通道的二维特征图进行卷积运算的滑动步骤,即一个尺寸为3×3卷积核(绿色方格)特征尺寸为5×5 (浅蓝色方格)步长为2填充边界为1的输入图像上进行卷积的完整过程。

图   卷积运算的滑动过程

关于卷积运算过程,大家可能有点懵,让我们讲解的再详细一点。

首先卷积核也是一个二维矩阵,当然这个二维矩阵要比输入图像的二维矩阵要小或相等,卷积核通过在输入图像的二维矩阵上不停的移动,每一次移动都进行一次乘积的求和,作为此位置的值,这个过程如下图所示:

可以看到,整个过程就是一个降维的过程,通过卷积核的不停移动计算,可以提取图像中最有用的特征。我们通常将卷积核计算得到的新的二维矩阵称为特征图,比如上方动图中,下方移动的深蓝色正方形就是卷积核上方不动的青色正方形就是特征图

有的读者可能注意到,每次卷积核移动的时候中间位置都被计算了,而输入图像二维矩阵的边缘却只计算了一次,会不会导致计算的结果不准确呢?

让我们仔细思考,如果每次计算的时候,边缘只被计算一次,而中间被多次计算,那么得到的特征图也会丢失边缘特征,最终会导致特征提取不准确,那为了解决这个问题,我们可以在原始的输入图像的二维矩阵周围再拓展一圈或者几圈,这样每个位置都可以被公平的计算到了,也就不会丢失任何特征,此过程可见下面两种情况,这种通过拓展解决特征丢失的方法又被称为Padding

🍀(1)Padding取值为1,拓展一圈

🍀(2)Padding取值为2,拓展两圈

那如果情况再复杂一些呢?如果我们使用两个卷积核去提取一张彩色图片呢?之前我们介绍过,彩色图片都是三个通道,也就是说一个彩色图片会有三个二维矩阵,当然,我们仅以第一个通道示例,否则太多了也不好介绍。此时我们使用两组卷积核,每组卷积核都用来提取自己通道的二维矩阵的特征,刚才说了,我们只考虑第一通道的,所以说我们只需要用两组卷积核的第一个卷积核来计算得到特征图就可以了,那么这个过程可见下图。

看着上面的动图确实有些不知所措是吧,我来解释一下,按照刚才的思路,输入图片是彩色图片,有三个通道,所以输入图片的尺寸就是7×7×3,而我们只考虑第一个通道,也就是从第一个7×7的二维矩阵中提取特征,那么我们只需要使用每组卷积核的第一个卷积核即可,这里可能有读者会注意到Bias,其实它就是偏置项,最后计算的结果加上它就可以了,最终通过计算就可以得到特征图了。可以发现,有几个卷积核就有几个特征图,因为我们现在只使用了两个卷积核,所以会得到两个特征图。

随着卷积神经网络在各种问题中的广泛应用,卷积层也衍生出许多的变种版本,其中常见的有分组卷积(Group Convolution)转置卷积(Transposed Convolution)空洞卷积(Atrous Convolution)深度分离卷积(Depthwise Separable Convolution)

分组卷积的主要思想就是将卷积分成不同的小组,每个小组分别计算一部分通道的卷积,从而减少计算量和参数量。转置卷积的运算方式与普通的卷积相似,转置卷积通常用于逆操作,也就是将缩小的特征图进行放大,其原理图如下图所示。这样可以在增强语义信息的同时对特征图进行上采样,转置卷积通常用于语义分割或者图像生成领域。

图   转置卷积

空洞卷积的操作方式近似于普通卷积,与普通卷积不同的是,空洞卷积的卷积核中存在空洞,如下图所示,这些空洞的大小可以通过调整空洞率来实现,这种方式近似于增加了卷积核的大小,但并未带来更多的参数量,所以空洞卷积可以显著增加卷积层的感受野。

图   空洞卷积 

深度可分离卷积的操作方式和普通卷积有很大的区别,深度可分离卷积由深度卷积 (Depthwise Convolution)点卷积(Pointwise Convolution)两步组成,原理图如下图所示。在深度卷积中,每个通道的特征图都独立使用一组卷积核进行卷积,在点卷积中,深度卷积的结果使用一个小的卷积核进行卷积,从而得到最终的输出。深度可分离卷积相比普通卷积具有更少的参数,因此可以在降低计算复杂度的同时保持较高的准确度。它在计算机视觉、图像语义分割等任务中得到了广泛应用。

图   深度可分离卷积


🚀4.池化层

池化操作也是卷积神经网络中一个非常重要的概念,它可以对特征层的信息进行筛选或计算,从而得到该部分特征最具代表性的一个,在降低特征信息冗余的同时间接地扩大了网络的感受野,一般情况下,池化层在卷积神经网络里面扮演着降采样层 (Downsampling Layer)的作用,常用的池化操作有最大值池化平均池化

总结:♨️♨️♨️

池化层(Pooling)可以对图片进行压缩从而使得压缩后的图像在质量方面优于原图,同时可以降低特征维度并保留有用信息,网络模型的参数数量得到了进一步的减少,过拟合的情况也有所缓解。当输入图片的领域像素值产生了一些微小的位移时,下采样层可保持输出不变,增强网络模型的鲁棒性。

下图展示的是一个4×4大小的特征图通过2×2大小的池化核进行最大值池化过程👇

图   最大值池化

下图展示的是一个4×4大小的特征图通过2×2大小的池化核进行平均值池化过程。👇

图   平均值池化

池化层特点:

  1. 特征不变性:池化相当于对图像进行放大缩小操作,假设原图是一只猫,那么不管我们对该图放大一倍或是缩小一倍,都能够看出这张图片是一只猫,其重要的特征仍在,含有该张图像的主要特征,这就是我们平时所了解到的尺度不变性,丢失掉的特征对原图不会造成影响。
  2. 特征降维:当我们对一张图片进行处理时,图像尺寸越大,参数量就越多,导致网络的计算量增大。但是对于该张图片,有很多的信息是冗余的,对于我们的网络没有太大的用处,因此我们可以通过降维提取其中重要的特征,减少卷积神经网络计算量。
  3. 在一定程度上避免过拟合。

随着卷积神经网络技术的不断发展,池化层也逐渐衍生出了很多的变种版本,如混合池化随机池化全局平均池化等。在卷积神经网络训练初期,卷积层通过池化层后一般要接多个全连接层进行降维,最后再Softmax分类,这种做法使得全连接层参数很多,降低了网络训练速度,且容易出现过拟合的情况。在这种背景下,提出使用全局平均池化(Global Average Pooling)来取代最后的全连接层,如下图所示。全局平均池化用很小的计算代价实现了降维,更重要的是全局平均池化极大减少了网络参数,除此之外,使用全局平均池化代替全连接层,可以实现任意图像大小的输入,并且全局平均池化对整个特征图求平均值,也可以用来提取全局上下文信息,进一步增强网络性能。

图   全局平均池化


🚀5.激活函数

多层神经网络中,每一层都有多个节点,每个节点通过连接上一层的节点来接收输入,并将输出传递给下一层的节点。这种上下层节点之间的映射关系,可以通过一个函数来描述,该函数被称为激活函数

激活函数的作用是对输入信号进行非线性变换,从而增加网络的表达能力,使其能够更好地拟合复杂的非线性模型。具体来说,激活函数能够将神经网络的输出限制在一个特定的范围内,使其具有一定的鲁棒性非线性可塑性常用的非线性激活函数主要有SigmoidTanhReLUSiLU等,其图像如下图所示。

图   常用激活函数图像

其中,Sigmoid函数具有良好的平滑性和可导性,在一定程度上可以缓解梯度消失的问题;Tanh函数是Sigmoid函数的扩展,具有更强的非线性能力,但也容易出现梯度消失的问题;ReLU函数在实际应用中表现良好,其简单的形式和高效的计算使其成 了神经网络中最常用的激活函数之一;SiLU函数是一种近期提出的激活函数,具有平滑性和可导性,并在一些实验中表现出了优异的性能。总之,激活函数是神经网络中非常重要的组成部分,通过选择不同的激活函数,可以为神经网络提供不同的表达能力和适应性。


🚀6.全连接层

全连接层通常位于网络的最后几层,在全卷积神经网络出现以前,大部分网络的最后一层都通过全连接层进行分类,全连接层可以将网络的低维度特征映射到更高的维度,从而实现对特征进行分类,下图为全连接层的特征示意图,将经过卷积层、池化层、 激活函数层的二维图像特征展平成为一维向量特征,随后,全连接层将卷积核提取到的特征进行融合,通常在网络的输出端都使用多层全连接层进行分类,但多层全连接层也会导致网络的参数量大幅上升,目前很多网络都使用全局平均池化替代全连接层。

总结即是,输出层用于输出经卷积神经网络计算得到的数值。

对于不同的问题,输出的形式也不同。

  • 对于分类问题,输出层输出的是一个概率分布,这个概率分布通过对数值应用Softmax函数得到,表示不同类别对应的概率。
  • 对于回归问题,输出层输出经卷积神经网络由输入数据计算得到数值。
  • 对于图像生成图像分割等要求输出图像的问题,输出层输出的是表示图像的数值矩阵。

图   全连接层

单看这个过程可能还是不太清晰,所以我们可以把之前的过程与全连接层结合起来,如下图所示:

 图   整个过程

可以看到,经过两次卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。


🚀7.输出层

卷积神经网络输出层理解起来就比较简单了,我们只需要将全连接层得到的一维向量经过计算后得到识别值的一个概率,当然,这个计算可能是线性的,也可能是非线性的。在深度学习中,我们需要识别的结果一般都是多分类的(对于不同的问题,输出的形式也不同),所以每个位置都会有一个概率值,代表识别为当前值的概率,取最大的概率值,就是最终的识别结果。在训练的过程中,可以通过不断地调整参数值来使识别结果更准确,从而达到最高的模型准确率。



http://www.niftyadmin.cn/n/5370954.html

相关文章

通过Demo学WPF—数据绑定(二)

准备 今天学习的Demo是Data Binding中的Linq: 创建一个空白解决方案,然后添加现有项目,选择Linq,解决方案如下所示: 查看这个Demo的效果: 开始学习这个Demo xaml部分 查看MainWindow.xaml: …

上位机建立TCP/IP连接:Matlab实现

Python实现的参考: Xilinx ZYNQTCP通信Python上位机 实现实时视频传输系统 - 知乎 (zhihu.com) GitHub - yg99992/Image_transfer_open_source: ZYNQ-7000 based data transfer through TCP/IP protocol 参考: MATLAB实现tcp连接 - 知乎 (zhihu.com)…

代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)

01背包(滚动数组方法) 学习资料:代码随想录 (programmercarl.com) 题目链接(和上次一样):题目页面 (kamacoder.com) 思路 使用一维滚动数组代替二维数组。二维数组的解法记录在:代码随想录算…

Rust开发WASM,WASM Runtime运行

安装wasm runtime curl https://wasmtime.dev/install.sh -sSf | bash 查看wasmtime的安装路径 安装target rustup target add wasm32-wasi 创建测试工程 cargo new wasm_wasi_demo 编译工程 cargo build --target wasm32-wasi 运行 wasmtime ./target/wasm32-wasi/d…

PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制 CASE表达式如同 C语言中的if/else语句一样,为SQL添加了条件逻辑处理能力,可以根据不同条件返回不同结果。PgSQL支持两种语法:简单表达式和搜索表达式。 1、搜索表达式 语法如下: CASE WH…

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡 解决方案:关闭windows的Hyper-V服务,重启虚拟机

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

re:从0开始的CSS学习之路 8. 浏览器默认样式

1. 默认样式 浏览器会有一个默认样式&#xff0c;body标签会有自带一个8px的margin属性。在布局的时候通常不想要浏览器的默认样式&#xff0c;因此可以先清除一下浏览器提供的默认样式 示例如下&#xff1a; <!DOCTYPE html> <html lang"en"><head…