网络架构学习1

news2025/5/14 2:05:39

文章目录

  • 网络架构学习1
    • 1. 传统CNN卷积神经网络
      • 1.1 基本思想
      • 1.2 VCG16(经典CNN网络架构之一)
    • 2. 两种经典的网络架构
      • 2.1 FCN网络
      • 2.2 U-Net网络
    • 3. FCNVMB(基于U-Net架构)
      • 3.1 FCNVMB 主要思想
      • 3.2 FCNVMB 提供的其他思想

网络架构学习1

1. 传统CNN卷积神经网络

1.1 基本思想

CNN网络主要得过程:输入层-卷积层(ReLU)-池化层-全连接层-输出层 如下图所示:在这里插入图片描述
从传统的CNN网络架构中,我们可以看出CNN网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息,这个概率信息是一维的,即只能标识整个图片的类别,不能标识每个像素点的类别。
全连接层
在 CNN 结构中,经多个卷积层和池化层后,连接着1个或1个以上的全连接层,全连接层中的每个神经元与其前一层的所有神经元进行全连接.全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息。最后全连接层输出进行分类。
在这里插入图片描述

1.2 VCG16(经典CNN网络架构之一)

在这里插入图片描述其中一共有13个卷积层;5个池化层和3个全连接层。其中

  • 卷积层:全部都是3*3的卷积核+ReLU激活函数 提取图像局部特征
  • 池化层:都是2x2的池化核和步长2,减小特征图的大小
  • 全连接层:包含2个全连接层,每个全连接层包含4096个神经元,用于分类输出
  • 输出层:一个大小为1000的全连接层,使用softmax激活函数,生成1000个类别的概率分布

从结构图可以看出,VCG有很明显的优缺点;其中

优点

  • VCG16网络是相对比较深的网络架构,随着卷积层的通道数增多,则提取的特征信息也越多,则可以提取更多的深层特征;
  • 其次就是卷积核较小且卷积核都是一样的,有助于更好的提取特征信息;

缺点

  • 网络参数过多,如果训练数据少就可能会发生过拟合,假设我们训练数据少,就要考虑用数据增强或则正则化策略去解决(数据增强是通过对训练数据进行一系列变换来生成新的数据样本,从而增加数据样本的数量和多样性;正则化是通过修改模型的损失函数,以鼓励模型保持简单的一种技术)
  • 其次就是输入图像尺寸不能太小(因为经历了5个池化层,可能多次池化后会导致特征图太小了)

如下是一个代码的主要过程思路:

    def __init__(self):
        super(vgg16, self).__init__()
        self.model = models.Sequential([   # 假设输入图像尺寸为224*224*3
            #64个通道;3x3的卷积核,步长为1,padding=same填充,卷积两次,再经ReLU激活,输出的尺寸大小为224x224x64
            Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'),
            BatchNormalization(),
            #最大池化层采用2*2 步长为2 输出的尺寸大小为 112x112x64
            MaxPooling2D(),
            #128个通道 3x3的卷积核,步长为1,padding=same填充,卷积两次,再经ReLU激活,输出的尺寸大小为112x112x128
            Conv2D(filters=128, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=128, kernel_size=(3, 3), padding='same', activation='relu'),
            BatchNormalization(),
            # 最大池化层采用2*2 步长为2 输出的尺寸大小为 56x56x128
            MaxPooling2D(),
            # 256个通道 3x3的卷积核,步长为1,padding=same填充,卷积三次,再经ReLU激活,输出的尺寸大小为56x56x256
            Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'),
            BatchNormalization(),
            # 最大池化层采用2*2 步长为2 输出的尺寸大小为 28x28x256
            MaxPooling2D(),
            # 512个通道 3x3的卷积核,步长为1,padding=same填充,卷积三次,再经ReLU激活,输出的尺寸大小为28x28x512
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            BatchNormalization(),
            # 最大池化层采用2*2 步长为2 输出的尺寸大小为 14x14x512
            MaxPooling2D(),
            # 512个通道 3x3的卷积核,步长为1,padding=same填充,卷积三次,再经ReLU激活,输出的尺寸大小为14x14x512
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            Conv2D(filters=512, kernel_size=(3, 3), padding='same', activation='relu'),
            BatchNormalization(),
            # 最大池化层采用2*2 步长为2 输出的尺寸大小为 7x7x512
            MaxPooling2D(),
            #将数据拉平成向量,变成一维51277=25088
            Flatten(),
            # 经过两层1x1x4096,一层1x1x1000的全连接层(共三层),经ReLU激活
            Dense(4096, activation='relu'),
            Dense(4096, activation='relu'),
            # 通过softmax输出1000个预测结果
            Dense(10, activation='softmax')
        ])

2. 两种经典的网络架构

2.1 FCN网络

FCN论文链接:Fully Convolutional Networks for Semantic Segmentation
对比传统的CNN网络,只进行了图像层面上的分类,而FCN的提出,对输入的图像进行了像素级分类的全卷积网络(这是开创性的),从而解决了语义级别的图像分割问题。(语义分割:图像中的每个像素分配给其所属的语义类别,即为图像中的每个像素标记一个类别标签;旨在理解图像中的物体和场景的整体语义信息,而不仅仅是对不同物体的像素进行分割)
例如下图:
在这里插入图片描述
在这里插入图片描述
下面主要分享的是FCN在CNN基础上的主要改进:

  • FCN提出了端到端,像素到像素卷积神经网络,搭建了一个全卷积神经网络,输入任意尺寸的图像,经过学习后输出相同尺寸的输出。
    在这里插入图片描述
  • FCN将全连接层转换为卷积层,则保留了原始空间的特征信息; 添加反卷积层进行向上采样,从而获得更接近真实图像的输出;添加了skip-connection结构(跳跃连接基本思想是在网络的某些层中,将输入直接连接到输出,以允许信息在不同层之间跳跃传递,可以提高了模型性能和训练速度);他的过程结构如下:
    在这里插入图片描述
    FCN网络在基于几个CNN网络架构下测试,发现基于VCG16网络表现出的性能是最好的,所以在FCN网络架构的pool5之前都是VCG16的架构。如下是具体的一个过程。从上面可以知道VCG16网络每个卷积核都是33且stride=1,padding=1; 池化都是22(直接对半)。
    (1)第一阶段:
    FCN32S:把全连接层转换为卷积层,且直接进行上采样32倍变为大图(无跳跃连接)
    在这里插入图片描述

(2)FCN16S:第二阶段:使用跳跃连接将conv7+pool4进行特征融合提升精确性
在这里插入图片描述

(3)FCN8S:使用跳跃连接将conv7+pool4+pool3进行特征融合提升精确性
在这里插入图片描述
在这里插入图片描述
从FCN网络训练结果看出,他得到的结果不够精细,采样结果还是比较模糊和平滑,对一些细节的处理还不是很好。但是在这篇论文中提供的思路是值得我们去学习和扩展的。

2.2 U-Net网络

U-Net论文地址:Convolutional Networks for Biomedical Image Segmentation

U-Net提出的初衷和fcn一样,也是为了解决医学图像分割的问题,他主要得特点是:

  • 端到端得网络,对称的网络结构(编码器-解码器结构)
  • skip-connection(跳跃连接)
    在这里插入图片描述在U-Net网络结构中:
    1. 左侧收缩路径(编码器Ecoder)功能是特征提取;主要过程是:卷积和最大池化。进行了4次像下采样,通道filters = [64, 128, 256, 512, 1024];。其中padding=0; strid为1;(没有进行边缘填充,每次卷积都会有损失,则会导致输入图像和输出图像分辨率并不一致。如果有填充,就会有误差存在,随着模型越深那受到padding的影响也越大)。
    1. 右侧扩展路径(解码器Decoder)功能是恢复特征图;主要过程是:卷积,上采样和skip-connection。
    1. skip-connection(挺重要的一个点,对比FCN)
      主要功能是进行特征融合,图中灰色箭头表示。将浅层的位置信心和深层的语义信息进行concat操作(浅层特征有较高的分辨率和较少的语义信息;深层特征反之)。具体的思想过程举例:
      假设特征图像尺寸: 256 ∗ 256 ∗ 64 256*256*64 25625664( 长 ∗ 宽 ∗ 通道数 长*宽*通道数 通道数)和另一个特征图像: 256 ∗ 256 ∗ 32 256*256*32 25625632进行concat融合,这直接会得到一个 256 ∗ 256 ∗ 96 256*256*96 25625696的特征图
      若特征图像尺寸: 256 ∗ 256 ∗ 64 256*256*64 25625664( 长 ∗ 宽 ∗ 通道数 长*宽*通道数 通道数)和另一个特征图像: 240 ∗ 240 ∗ 32 240*240*32 24024032进行concat融合,他们图像大小不相等有两种方法:
      a.对特征图 256 ∗ 256 ∗ 64 256*256*64 25625664进行裁剪变为 240 ∗ 240 ∗ 64 240*240*64 24024064,然后再和 240 ∗ 240 ∗ 32 240*240*32 24024032进行concat得到 240 ∗ 240 ∗ 96 240*240*96 24024096的特征图
      b. 对特征图 256 ∗ 256 ∗ 32 256*256*32 25625632进行填充变为 256 ∗ 256 ∗ 32 256*256*32 25625632,然后再和 256 ∗ 256 ∗ 64 256*256*64 25625664进行concat得到 256 ∗ 256 ∗ 96 256*256*96 25625696的特征图在这一个结构中采用的是裁剪+拼接(copy+crop
      注::FCN的skip-connection是加操作,即像素点相加;U-Net网络是叠操作(copy+crop)

3. FCNVMB(基于U-Net架构)

3.1 FCNVMB 主要思想

如下是FCNVMB网络结构图:
在这里插入图片描述数据集层级关系:在这里插入图片描述
FCNVMB是基于U-Net网络架构,结合上面的U-Net网络结构,FCNVMB也是一个对称的编码器-解码器结构;中间也采用了卷积,池化,反卷积和skip-connection; 但在U-Net下有创新之处如下:

  • 原始UNet模型是在图像处理领域提出的,通常用于处理RGB颜色通道表示的图像信息。在FCNVMB中主要处理地震数据,将不同位置生成的"炮集"作为输入的通道,进而输入通道的数量等于每个模型的源数量(每个炮集代表了来自相同模型的不同源位置的地震数据) —即输入数据发生了变化
  • 原始UNet的输出和输入在相同的图像领域内,在FCNVMB中 中为了实现地震速度模型的构建,将数据从(x, t)域映射到(x, z)域,并同时构建速度模型;并将输出层的通道修改为 1。—输出数据发生了变化
    如下图:
    地震数据(x, t)域
    在这里插入图片描述
    速度模型(x, z)域
    在这里插入图片描述
  • FCNVMB是基于监督的深度全卷积神经网络,在这个速度模型的构建过程中,论文采用了两种数据集一类是用声波方程作为正演模型来合成的模拟数据集;一类是采用Seg盐模拟数据对;将这些数据对 一部分用于训练;一部分用于测试。所以这篇论文我理解的大致思路就是:训练集数据集利用FCNVMB网络进行训练,学习地震数据和速度模型之间的一种映射关系,不断优化参数,训练好后我们再用测试集数据去进行预测。

监督网络:用大量的有标签的数据训练来训练模型,模型最终学习到输入和输出标签之间的相关性。监督学习主要是学习一种映射关系;
无监督网络:不依赖任何标签值(用无标签的数据训练),通过对数据内在特征的挖掘,找到样本间的关联。比如聚类算法;

  • FCNVMB代码主要的理解
class FCNVMB(nn.Module):
    def __init__(self, n_classes, in_channels, is_deconv, is_batchnorm):
        '''
        Network architecture of FCNVMB

        :param n_classes:       Number of channels of output (any single decoder) 输出通道数
        :param in_channels:     Number of channels of network input 输入通道树
        :param is_deconv:       Whether to use deconvolution 是否使用反卷积
        :param is_batchnorm:    Whether to use BN 是否使用BN
        '''
        super(FCNVMB, self).__init__()
        self.is_deconv = is_deconv
        self.in_channels = in_channels
        self.is_batchnorm = is_batchnorm
        self.n_classes = n_classes

        filters = [64, 128, 256, 512, 1024] #表示网络的通道数,这些整数用于定义U-Net模型的不同层级的通道数

        self.down1 = unetDown(self.in_channels, filters[0], self.is_batchnorm)
        self.down2 = unetDown(filters[0], filters[1], self.is_batchnorm)
        self.down3 = unetDown(filters[1], filters[2], self.is_batchnorm)
        self.down4 = unetDown(filters[2], filters[3], self.is_batchnorm)
        self.center = unetConv2(filters[3], filters[4], self.is_batchnorm)
        self.up4 = unetUp(filters[4], filters[3], self.is_deconv)
        self.up3 = unetUp(filters[3], filters[2], self.is_deconv)
        self.up2 = unetUp(filters[2], filters[1], self.is_deconv)
        self.up1 = unetUp(filters[1], filters[0], self.is_deconv)
        self.final = nn.Conv2d(filters[0], self.n_classes, 1)

    def forward(self, inputs, label_dsp_dim):
        '''

        :param inputs:          Input Image
        :param label_dsp_dim:   Size of the network output image (velocity model size)
        :return:
        '''
        down1 = self.down1(inputs)
        down2 = self.down2(down1)
        down3 = self.down3(down2)
        down4 = self.down4(down3)
        center = self.center(down4)
        up4 = self.up4(down4, center)
        up3 = self.up3(down3, up4)
        up2 = self.up2(down2, up3)
        up1 = self.up1(down1, up2)
        up1 = up1[:, :, 1:1 + label_dsp_dim[0], 1:1 + label_dsp_dim[1]].contiguous()

        return self.final(up1)

(1) 其中unetDown函数包含上采样过程:经过卷积和池化

class unetDown(nn.Module):
    def __init__(self, in_size, out_size, is_batchnorm):
        '''
        Downsampling Unit
        [Affiliated with FCNVMB]

        :param in_size:         Number of channels of input
        :param out_size:        Number of channels of output
        :param is_batchnorm:    Whether to use BN
        '''
        super(unetDown, self).__init__()
        self.conv = unetConv2(in_size, out_size, is_batchnorm)
        self.down = nn.MaxPool2d(2, 2, ceil_mode=True)

    def forward(self, inputs):
        '''
        :param inputs:          Input Image
        :return:
        '''
        outputs = self.conv(inputs)
        outputs = self.down(outputs)
        return outputs

(2) 其中UnetCenter部分
主要是增加了通道数,图像分辨率不变

(3) 其中unetUp函数:提供了两种方式的上采样,ConvTranspose2d:创建反卷积层进行上采样(U-Net使用的则是这一种);UpsamplingBilinear2d:传统的双线性插值上采样(FCN使用的是这一种); 另一个是skip-connection:是采用U-Net网络结构中的叠操作(copy+crop),并且是填充大小。

class unetUp(nn.Module):
    def __init__(self, in_size, out_size, is_deconv):
        '''
        Upsampling Unit
        [Affiliated with FCNVMB]

        :param in_size:      Number of channels of input
        :param out_size:     Number of channels of output
        :param is_deconv:    Whether to use deconvolution
        '''
        super(unetUp, self).__init__()
        self.conv = unetConv2(in_size, out_size, True)
        # Transposed convolution
        if is_deconv:
            self.up = nn.ConvTranspose2d(in_size, out_size, kernel_size=2, stride=2)
        else:
            self.up = nn.UpsamplingBilinear2d(scale_factor=2)

    def forward(self, inputs1, inputs2):
        '''

        :param inputs1:      Layer of the selected coding area via skip connection
        :param inputs2:      Current network layer based on network flows
        :return:
        '''
        outputs2 = self.up(inputs2)
        offset1 = (outputs2.size()[2] - inputs1.size()[2])
        offset2 = (outputs2.size()[3] - inputs1.size()[3])
        padding = [offset2 // 2, (offset2 + 1) // 2, offset1 // 2, (offset1 + 1) // 2]

        # Skip and concatenate
        outputs1 = F.pad(inputs1, padding)
        return self.conv(torch.cat([outputs1, outputs2], 1))

3.2 FCNVMB 提供的其他思想

(1)VMB的局限1:训练数据集的选择;FCNVMB网络结构很依赖选择的数据集,直接使用经过训练的网络来测试复杂(例如SEG盐模型)或真实模型会很困难。如实验中对数据进行不加盐的预测(使用 10 个不含盐的训练样本进行训练),用现有的FCNVMB和FWI去预测,其预测结果如下,VMB的性能结构并没有FWI好
在这里插入图片描述
结合这个问题,一方面我们可以增强数据,增加数据的多样性(对现有数据进行变换、旋转、缩放),另一方面是引入迁移学习,迁移学习主要思想:将在一个任务上学到的知识或模型应用于解决另一个相关任务(尤其是新任务的数据集相对较小或缺乏标注时),则可以使用预训练网络作为初始化网络,目的是更有效地显示输入和输出之间的非线性映射,而不仅仅是让机器记住数据集的特征。
(2) 低频信息的重要性。
低频信息的在论文中提到当低频信息被移除时(利用技术滤除低频信息进行实验),速度模型的结构边界变得不太清晰,背景速度层次略显模糊。这表明低频信息对于提高速度模型预测的精度和清晰度非常重要。VMB的局限2:但是如何获取低频信息是一个难点。(为什么低频信息回很重要呢,多少hz才算低频?)
(3)作者在最后提出了另一个思想即利用生成对抗网络(GAN): 生成对抗网络包含一个生成模型和一个判别模型(一种基于有限开放数据集的半监督学习网络)其中

  • 生成器:其任务是尽生成模仿训练集中的真实样本;
  • 判别器:判别模型一般情况下是一个二分类器,目标是判别输入是真实数据还是生成的样本。
  • 博弈过程:训练中,生成器和判别器相互竞争。生成器的目标是生成能够欺骗判别器的伪造数据,而判别器的目标是尽量准确地识别伪造数据。这个博弈过程推动了生成器和判别器不断完善
  • 训练过程: 训练过程包括多轮的生成器和判别器之间的竞争。通过这个过程,生成器逐渐学习生成逼真的数据,而判别器逐渐学习变得更善于区分真实和伪造数据。
    目前是CNN和GAN进行结合的网络即DCGAN 网络,具体的网络结构还未去了解过。

(4)作者论文提到以后可能得一个研究方向是去揭示传统反演方法与特定网络之间的潜在关系。我觉得挺有趣的,就像本论文的VMB,他其实就是在传统经典的网络架构上进行了改进,将他巧妙的应用到地震反演中并修改了输入输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android SurfaceFlinger做Layer合成时,如何与HAL层进行交互

目录 零、本文讨论问题的范围一、问题:SurfaceFlinger图层合成选择实现方式的两难1.1 从OpenGL ES、HWC本身来讲1.2 以HWC为主导的判断逻辑 二、SurfaceFlinger与HAL层进行交互的具体实现框架2.1 SurfaceFlinger 调用 OpenGL ES 流程2.2 FrameBuffer2.3 SurfaceFlin…

c语言从入门到实战——数组

数组 前言1. 数组的概念2. 一维数组的创建和初始化2.1 数组创建2.2 数组的初始化2.3 数组的类型 3. 一维数组的使用3.1 数组下标3.2 数组元素的打印3.3 数组的输入 4. 一维数组在内存中的存储5. sizeof计算数组元素个数6. 二维数组的创建6.1 二维数组得概念6.2 二维数组的创建 …

Java集成腾讯云OCR身份证识别接口

一、背景 项目用到身份证识别获取人员信息的功能,于是想到了腾讯云提供这样的API。在整合代码过程都很顺利,利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题,通过Nginx代理后的环境无法访问到目标腾讯云接口,…

buuctf_练[CSCCTF 2019 Qual]FlaskLight

[CSCCTF 2019 Qual]FlaskLight 文章目录 [CSCCTF 2019 Qual]FlaskLight掌握知识解题思路关键paylaod 掌握知识 内置函数的过滤,globals变量的过滤,调用内部变量或函数的OS函数进行命令执行 解题思路 打开题目链接,很明显看标题和内容是fla…

【动态基础】从暴力递归到动态规划

C面经汇总 系列综述: 目的:本系列是个人整理为了秋招和实习面试的,整理期间苛求每个知识点,平衡背诵量与深入程度。 来源:材料主要源于算法大神(左程云)教你从暴力递归到动态规划进行的&#xf…

vue实现连接线

效果展示 实现代码 下载插件npm install --save leader-line-vue <template><div class"wrap"><div ref"start" class"start">start</div><div ref"end" class"end">end</div></d…

数据结构时间复杂度(补充)和空间复杂度

Hello&#xff0c;今天事10月27日&#xff0c;距离刚开始写博客已经过去挺久了&#xff0c;我也不知道是什么让我坚持这么久&#xff0c;但是学校的课真的很多&#xff0c;很少有时间多出来再学习&#xff0c;有些科目马上要考试了&#xff0c;我还不知道我呢不能过哈哈哈&…

Django 全局配置 settings 详解

文章目录 1 概述1.1 Django 目录结构 2 常用配置&#xff1a;settings.py2.1 注册 APP&#xff1a;INSTALLED_APPS2.2 模板路径&#xff1a;TEMPLATES2.3 静态文件&#xff1a;STATICFILES_DIRS2.4 数据库&#xff1a;DATABASES2.5 允许访问的主机&#xff1a;ALLOWED_HOSTS 1 …

[SQL开发笔记]UPDATE 语句:更新表中的记录

一、功能描述&#xff1a; UPDATE 语句&#xff1a;用于更新表中的记录 二、UPDATE 语句语法详解&#xff1a; UPDATE 语法 UPDATE table_nameSET column1value1,column2value2,...WHERE some_columnsome_value; 参数说明&#xff1a; 1.table_name&#xff1a;要修改的表…

【Docker】github Actions自动构建

通过github的Actions 实现代码push仓库后自动构建容器并发布到DockerHub. 创建项目 首先我们创建一个项目,这里我就用Vue项目进行演示. npm init vuelatest Actions-demo-swback进去项目&#xff0c;按照提示执行 npm install npm run dev 启动项目. 首先保证项目的正常启动…

DAY36 738.单调递增的数字 + 968.监控二叉树

738.单调递增的数字 题目要求&#xff1a;给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单…

Python机器学习基础(一)---数据集加载的方法

几个数据集加载的方式 鸢尾花练习资源(这个资源有瑕疵&#xff0c;index列和Species 都是带”“的字符串 导致一些加载现实问题&#xff0c;从而验证 还是pandas最好用) "index","Sepal.Length","Sepal.Width","Petal.Length","…

echarts中横向柱状图的数字在条纹上方

实现效果&#xff1a; 数字在条纹的上方 实现方法&#xff1a;这些数字是用新添加一个坐标轴来实现的 直接添加坐标轴数字显示是在条纹的正右边 所以需要配置一下偏移 完整代码 var option {grid: {left: "3%",right: "4%",bottom: "3%",cont…

FreeROTS 任务通知和实操 详解

目录 什么是任务通知&#xff1f; 任务通知值的更新方式 任务通知的优势和劣势 任务通知的优势 任务通知的劣势 任务通知相关 API 函数 1. 发送通知 2. 等待通知 任务通知实操 1. 模拟二值信号量 2. 模拟计数型信号量 3. 模拟事件标志组 4. 模拟消息邮箱 什么是任务…

高防CDN:网络攻防的坚强防线

在当今数字化时代&#xff0c;网络攻击已经成为一种常态&#xff0c;对企业和个人的网络资产构成了严重威胁。为了应对这些风险&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;已经崭露头角&#xff0c;它不仅提供内容分发&#xff0c;还整合了强大的网络…

电脑上使用的备忘记事软件哪一款好用点?

生活中充斥着大大小小的任务&#xff0c;如工作方面、学习方面、生活方面等&#xff0c;多种事务掺杂交错在一起非常容易忘记&#xff0c;为避免忘记重要的事情&#xff0c;大家可以借助电脑上好用的备忘录工具来进行记事。 支持在电脑上使用的备忘录软件是比较多的&#xff0…

论文阅读 - Learning Human Interactions with the Influence Model

NIPS01 早期模型 要求知识背景&#xff1a; 似然函数&#xff0c;极大似然估计、HMM、期望最大化 目录 1 Introduction 2 The Facilitator Room 3 T h e I n f l u e n c e M o d e l 3 . 1 ( R e ) i n t r o d u c i n g t h e I n f l u e n c e M o d e l 3 . 2 L e…

SpringCloud Alibaba【三】Gateway

Gateway配置与使用 前言新建gateway子项目pom.xml配置文件启动类访问接口方式 测试拓展 前言 在工作中遇到一种情况&#xff0c;一个父项目中有两个子项目。实际使用时&#xff0c;需要外网可以访问&#xff0c;宝信软件只能将一个端口号发布在外网上&#xff0c;所以需要运用…

多线程---线程安全问题及解决

文章目录 一个线程不安全的案例造成线程不安全的原因抢占式执行多个线程修改同一个变量修改操作不是原子的内存可见性问题指令重排序问题 如何让线程变得安全&#xff1f;加锁volatile 一个线程不安全的案例 题目&#xff1a;有较短时间让变量count从0加到10_0000 解决方案&a…

【AD9361 数字接口CMOS LVDS】A CMOS

〇、综述 本章介绍并行数据端口和串行外设接口&#xff08;SPI&#xff09;&#xff0c;用于在AD9361和BBP之间传输数据和控制/状态信息。 下图显示了这些接口&#xff0c;并提供了AD9361和BBP在宽带无线系统中的使用方式的高级视图。数据接口工作在两种模式之一&#xff1a;标…