深度学习入门笔记之VggNet网络

2023-11-03

VGGNet是由牛津大学的视觉几何组(Visual Geometry Group)和谷歌旗下DeepMind团队的研究员共同研发提出的,获得了ILSVRC 2014( 2014年ImageNet图像分类竞赛) 的第二名,将 Top-5错误率降到7.3%, 在Top-5中取得了92.3%的正确率,同年的冠军是googlenet。
目前使用比较多的网络结构主要有ResNet(152-1000层),GooleNet(22层),VGGNet(19层),大多数模型都是基于这几个模型上改进,采用新的优化算法,多模型融合等。到目前为止,VGGNet 依然经常被用来提取图像特征。
一、简介
论文名为《Very Deep Convolutional Networks for Large-Scale Image Recognition》,论文地址:https://arxiv.org/pdf/1409.1556.pdf。 VGGNet论文给出了一个非常振奋人心的结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用。
VGGNet探索了CNN的深度及其性能之间的关系,通过反复堆叠33的小型卷积核和22的最大池化层,VGGNet成功的构筑了16-19层深的CNN。
二、网络结构
网络结构如下图所示,其中D和E即为常用的VGG-16和VGG-19,前者拥有13个核大小均为3×3的卷积层、5个最大池化层和3个全连接层,后者拥有16个核大小均为3×3的卷积层、5个最大池化层和3个全连接层。本文主要针对VGG16进行解读,可以看出VGG19只是多了3个卷积层而已,其它的和VGG16没啥区别。
在这里插入图片描述
表中的卷积层(conv3-kernels,其中kernels代表卷积核的个数)全部都是大小为3x3,步距为1,padding为1的卷积操作(经过卷积后不会改变特征矩阵的高和宽)。最大池化下采样层全部都是池化核大小为2,步距为2的池化操作,每次通过最大池化下采样后特征矩阵的高和宽都会缩减为原来的一半。
VGG-16的结构图如下图:
在这里插入图片描述
VGG-16架构:13个卷积层+3个全连接层,前5段卷积网络(标号1-5),最后一段全连接网络(标号6-8),网络总共参数数量大约138M左右。。

(1) 输入层(Input):图像大小为224×224×3

(2) 卷积层1+ReLU:conv3 - 64(卷积核的数量):kernel size:3 stride:1 pad:1
像素:(224-3+2×1)/1+1=224 输出为224×224×64 64个feature maps
参数: (3×3×3)×64+64=1792

(3) 卷积层2+ReLU:conv3 - 64:kernel size:3 stride:1 pad:1
像素: (224-3+1×2)/1+1=224 输出为224×224×64 64个feature maps
参数: (3×3×64×64)+64=36928

(4) 最大池化层: pool2: kernel size:2 stride:2 pad:0
像素: (224-2)/2 = 112 输出为112×112×64,64个feature maps
参数: 0

(5) 卷积层3+ReLU:.conv3-128:kernel size:3 stride:1 pad:1
像素: (112-3+2×1)/1+1 = 112 输出为112×112×128,128个feature maps
参数: (3×3×64×128)+128=73856

(6) 卷积层4+ReLU:conv3-128:kernel size:3 stride:1 pad:1
像素: (112-3+2×1)/1+1 = 112 输出为112×112×128,128个feature maps
参数: (3×3×128×128)+128=147584

(7) 最大池化层:pool2: kernel size:2 stride:2 pad:0
像素: (112-2)/2+1=56 输出为56×56×128,128个feature maps。
参数: 0

(8) 卷积层5+ReLU:conv3-256: kernel size:3 stride:1 pad:1
像素: (56-3+2×1)/1+1=56 输出为56×56×256,256个feature maps
参数: (3×3×128×256)+256=295168

(9) 卷积层6+ReLU:conv3-256: kernel size:3 stride:1 pad:1
像素: (56-3+2×1)/1+1=56 输出为56×56×256,256个feature maps,
参数: (3×3×256×256)+256=590080

(10) 卷积层7+ReLU:conv3-256: kernel size:3 stride:1 pad:1
像素: (56-3+2×1)/1+1=56 输出为56×56×256,256个feature maps
参数: (3×3×256×256)+256=590080

(11) 最大池化层:pool2: kernel size:2 stride:2 pad:0
像素:(56 - 2)/2+1=28 输出为28×28×256,256个feature maps
参数: 0

(12) 卷积层8+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(28-3+2×1)/1+1=28 输出为28×28×512,512个feature maps
参数: (3×3×256×512)+512=1180160

(13) 卷积层9+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(28-3+2×1)/1+1=28 输出为28×28×512,512个feature maps
参数: (3×3×512×512)+512=2359808

(14) 卷积层10+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(28-3+2×1)/1+1=28 输出为28×28×512,512个feature maps
参数: (3×3×512×512)+512=2359808

(15) 最大池化层:pool2: kernel size:2 stride:2 pad:0,输出为14×14×512,512个feature maps。
像素:(28-2)/2+1=14 输出为14×14×512
参数: 0

(16) 卷积层11+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(14-3+2×1)/1+1=14 输出为14×14×512,512个feature maps
参数: (3×3×512×512)+512=2359808

(17) 卷积层12+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(14-3+2×1)/1+1=14 输出为14×14×512,512个feature maps
参数: (3×3×512×512)+512=2359808

(18) 卷积层13+ReLU:conv3-512:kernel size:3 stride:1 pad:1
像素:(14-3+2×1)/1+1=14 输出为14×14×512,512个feature maps,
参数: (3×3×512×512)+512=2359808

(19) 最大池化层:pool2:kernel size:2 stride:2 pad:0
像素:(14-2)/2+1=7 输出为7×7×512,512个feature maps
参数: 0

(20) 全连接层1+ReLU+Dropout:有4096个神经元或4096个feature maps
像素:1×1×4096
参数:7×7×512×4096 = 102760448

(21) 全连接层2+ReLU+Dropout:有4096个神经元或4096个feature maps
像素:1×1×4096
参数:4096×4096 = 16777216

(22) 全连接层3:有1000个神经元或1000个feature maps
像素:1×1×1000
参数:4096×1000=4096000

(23) 输出层(Softmax):输出识别结果,看它究竟是1000个可能类别中的哪一个。

train和predict的可视化结果如下图所示:
在这里插入图片描述
三、VGGNet的特点
VGG网络的特点是利用小的尺寸核代替大的卷积核,然后把网络做深。
1. 结构简洁 卷积层+ReLU、最大池化层、全连接层、Softmax输出层。
VGGNet的结构十分简洁,由5个卷积层、3个全连接层和1个softmax层构成,**层与层之间使用最大池化连接,隐藏层之间使用的激活函数全都是ReLU。**并且网络的参数也是整齐划一的,赏心悦目。
2. 使用小卷积核
VGGNet使用含有多个小型的3×3卷积核的卷积层来代替AlexNet中的卷积核较大的卷积层。**2个3×3的卷积核堆叠的感受野相当于一个5×5的卷积核的感受野,而3个3×3的卷积核堆叠的感受野则相当于一个7×7的卷积核的感受野。**因此,采用多个小型卷积核,既能减少参数的数量,又能增强网络的非线性映射从而提升网络的表达能力。
在这里插入图片描述

为什么可以增加网络的非线性?我们知道激活函数的作用就是给神经网络增加非线性因素,使其可以拟合任意的函数,每个卷积操作后都会通过ReLU激活,ReLU函数就是一个非线性函数。下图展示了为什么使用2个3x3的卷积核可以代替5×5卷积核。
在这里插入图片描述
总结一下,使用多个3×3卷积堆叠的作用有两个:一是在不影响感受野的前提下减少了参数;二是增加了网络的非线性。
3. 使用小滤波器
与AlexNet相比,VGGNet在池化层全部采用的是2×2的小滤波器,stride为2。。
4. 通道数较多
VGGNet的第一层有64个通道,后面的每一层都对通道进行了翻倍,最多达到了512个通道( 64-128-256-512-512)。由于每个通道都代表着一个feature map,这样就使更多的信息可以被提取出来。
5 图像预处理
训练采用多尺度训练(Multi-scale),将原始图像缩放到不同尺寸 S,然后再随机裁切224x224的图片,并且对图片进行水平翻转和随机RGB色差调整,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
  初始对原始图片进行裁剪时,原始图片的最小边不宜过小,这样的话,裁剪到224x224的时候,就相当于几乎覆盖了整个图片,这样对原始图片进行不同的随机裁剪得到的图片就基本上没差别,就失去了增加数据集的意义,但同时也不宜过大,这样的话,裁剪到的图片只含有目标的一小部分,也不是很好。
针对上述裁剪的问题,提出的训练图片预处理过程:
(1)训练图片归一化,图像等轴重调(最短边为S)
等轴重调剪裁时的两种解决办法:
方法一:固定最小边的尺寸为256
方法二:随机从[256,512]的确定范围内进行抽样,这样原始图片尺寸不一,有利于训练,这个方法叫做尺度抖动,有利于训练集增强。 训练时运用大量的裁剪图片有利于提升识别精确率。
(2)随机剪裁(每SGD一次)
(3)随机水平翻转
(4)RGB颜色偏移
6. 将全连接层转换为卷积层
这个特征是体现在VGGNet的测试阶段。**在进行网络测试时,将训练阶段的3个全连接层替换为3个卷积层,使测试得到的网络没有全连接的限制,能够接收任意宽和高的输入。**如果后面3个层都是全连接层,那么在测试阶段就只能将测试的图像全部缩放到固定尺寸,这样就不便于多尺度测试工作的开展。
在这里插入图片描述
为什么这样替换之后就可以处理任意尺寸的输入图像了呢?因为1×1卷积一个很重要的作用就是调整通道数。如果下一层输入的特征图需要控制通道数为N,那么设置N个1×1卷积核就可以完成通道数的调整。比如最后需要1000个神经元用于分出1000个类别,那就在最后一层的前面使用1000个1×1的卷积核,这样的到的结果就是(1, 1, 1000)正好可以匹配。
在这里插入图片描述
7 参数和内存占用分析(来源[斯坦福大学CS231课程]课件截图):
在这里插入图片描述
由上图分析可以看出:
前面部分的卷积层占用大量内存
后面的三层全连接层占用了大量的参数
四、代码(Pytorch)
在VGG网络中,有两部分,提取特征网络结构和分类网络结构。
VGG网络非常大,训练起来大概要几个小时,如果训练集样本很少比如三千多张,是没办法充分的训练VGG网络的。如果需要使用VGG网络,建议使用迁移学习方法训练自己的样本集。
model.py:

import torch.nn as nn
import torch

# official pretrain weights
model_urls = {
    'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth',
    'vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth',
    'vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth',
    'vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth'
}


class VGG(nn.Module):
    #
    #num_classes=1000需要分类的类别个数
    #初始化函数__init__传进来features,也就是我们刚刚通过make_features(cfg: list)函数生成的提取特征网络结构
    #init_weights=False是否对网络进行权重初始化
    def __init__(self, features, num_classes=1000, init_weights=False):
        super(VGG, self).__init__()
        self.features = features
        #生成分类网络结构
        self.classifier = nn.Sequential(
            #输入节点个数,是展平处理之后所得到的1维向量的元素个数512*7*7
            nn.Linear(512*7*7, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, num_classes)
        )
        if init_weights:#是否要对网络进行参数的初始化
            self._initialize_weights()

    def forward(self, x):
        # N x 3 x 224 x 224
        x = self.features(x)
        # N x 512 x 7 x 7
        # 图像经过提取特征网络结构之后,得到一个7*7*512的特征矩阵,如果...
        # 要和全连接层进行全连接,要进行一个展平处理。展平之后,才能和全连接层进行全连接
        x = torch.flatten(x, start_dim=1)#展平,从第一个维度展平
        # N x 512*7*7
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():#遍历网络中的每一层
            if isinstance(m, nn.Conv2d):
                # nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                nn.init.xavier_uniform_(m.weight)#初始化权重
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                # nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)

#参数是配置变量,是list类型,传入对应配置的列表就可以了
#make_features(cfg: list)这个函数用来生成提取网络结构
def make_features(cfg: list):
    layers = []#定义一个空列表,用来存放所创建的每一层结构
    in_channels = 3#输入的图片是RGB彩色图片
    for v in cfg:#通过一个for循环来遍历配置列表,能得到一个由卷积操作和池化操作组成的一个列表
        if v == "M":#如果当前的配置元素是一个M字符,说明该层是最大池化层
            # 创建一个最大池化下采样层,在VGG中,所有的最大池化下采样层的核大小都是2,stride都是2
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:#否则是卷积层
            #in_channels表示输入的特征矩阵的深度,v是输出的特征矩阵的深度,也就是卷积核的个数
            #在VGG中,所有的卷积层padding为1,stride为1
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)#创建一个卷积层
            # 将卷积层和ReLU拼接好后,放到layers层中
            layers += [conv2d, nn.ReLU(True)]
            in_channels = v
    #将列表通过非关键字参数的形式,传入进去。layers前面的*表示我们是通过非关键字参数传入进去的
    return nn.Sequential(*layers)

#定义cfgs一个字典文件,每一个key代表一个模型的配置文件,比如vgg11代表A配置,也就是11层的一个网络
#数字比如64代表卷基层的卷积核的个数,'M'代表池化层的结构
#有了这个配置,如何生成提取特征网络结构呢?定义了一个函数make_features(cfg: list)
cfgs = {
    'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}

#实例化给定的配置模型
def vgg(model_name="vgg16", **kwargs):
    assert model_name in cfgs, "Warning: model number {} not in cfgs dict!".format(model_name)
    cfg = cfgs[model_name]
    #实例化VGG网络
    #**kwargs表示可变长度的字典变量,是在调用VGG函数时传入的一个字典变量
    #这个字典变量包含了分类的个数,以及是否初始化权重的布尔变量
    model = VGG(make_features(cfg), **kwargs)
    return model

#在nn.Sequential(*layers)设置一个断点,可以实例化一个类来看一下
#vgg_model=vgg(model_name='vgg13')

五、注意事项和遇到的问题
(1) 我们通常看到别人在搭建VGG网络时,图像预处理的第一步会将图像的RGB分量分别减去[123.68, 116.78, 103.94]这三个参数。这三个参数是对应着ImageNet分类数据集中所有图像的R、G、B三个通到的均值分量。如果你要使用别人在ImageNet数据集上训练好的模型参数进行fine-trian操作(也就是迁移学习)那么你需要在在图像预处理过程中减去这[123.68, 116.78, 103.94]三个分量,如果你是从头训练一个数据集(不使用在ImageNet上的预训练模型)那么就可以忽略这一步。
(2)假如输入图像大小为nn,过滤器(filter)为ff,padding为p,步长(stride)为s,则输出大小为:如果商不是整数,向下取整,即floor函数。
在这里插入图片描述
(3)在特定的层使用了预训练得到的数据进行参数的初始化。对于较浅的网络,如网络A,可以直接使用随机数进行随机初始化,而对于比较深的网络,则使用前面已经训练好的较浅的网络中的参数值对其前几层的卷积层和最后的全连接层进行初始化。
(4)11的卷积层常被用来提炼特征,即多通道的特征组合在一起,凝练成较大通道或者较小通道的输出,而每张图片的大小不变。有时11的卷积神经网络还可以用来替代全连接层。
(5)模型训练方法:使用具有动量的小批量梯度下降优化多项式逻辑回归目标函数。
对于选择softmax分类器还是k个logistics分类器,取决于所有类别之间是否互斥。所有类别之间明显互斥用softmax;所有类别之间不互斥有交叉的情况下最好用k个logistics分类器。
(6)通过逐步增加网络深度来提高性能,虽然看起来有一点小暴力,没有特别多取巧的,但是确实有效,很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相对其他的方法,参数空间很大,最终的model有500多m,alnext只有200m,googlenet更少,所以train一个vgg模型通常要花费更长的时间,所幸有公开的pretrained model让我们很方便的使用。
(7)虽然每一级网络逐渐变深,但是网络的参数量并没有增长很多(相对而言),这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习入门笔记之VggNet网络 的相关文章

  • 关于burpsuite对app(移动端)进行抓包的配置

    可以使用手机模拟器 我这里以自己手机 物理机 演示配置过程 如果是使用的模拟器那么肯定和电脑是在同一局域网 如果使用物理机 那么可以通过连接同一WiFi确保在同一局域网环境下 查看电脑内网ip 192 168 1 105 注意 看的是无线局
  • 网工我劝你,这11种协议报文格式要烂熟于心!

    你们好 我的网工朋友 你最熟悉的报文是啥 TCP UDP 在网络世界里 就如同道路系统让车辆畅通无阻一样 网络协议是确保信息顺畅传输的关键 作为网络工程师 理解网络协议的种类与结构至关重要 今天就和你一起探索一下11种关键协议报文格式啊 包
  • 如何防护零日攻击

    零日攻击是什么 零日攻击 也称为零时差攻击 通常是指利用还没有被补丁的安全漏洞进行的攻击 这些漏洞在被发现后 由于各种原因 软件供应商未能及时发布补丁 使得黑客有机会利用这些漏洞进行攻击 零日攻击通常由技术高超的黑客发起 他们在对目标系统或
  • 分辨公网IP和内网IP的方法

    公网IP一般就是对外的访问地址 内网IP就是对内的访问地址 两者的使用范围是不一样的 那如果区分客户网络的IP地址是公网IP地址还是内网IP地址呢 公网IP的地址范围是很广泛的 我们可以先了解下内网IP 因为内网IP的地址段相对是局限的 一
  • 通过一个寒假能学会黑客技术吗?看完你就知道了

    一个寒假能成为黑客吗 资深白帽子来告诉你 如果你想的是学完去美国五角大楼内网随意溜达几圈 想顺走一点机密文件的话 劝你还是趁早放弃 但是成为一名初级黑客还是绰绰有余的 你只需要掌握好渗透测试 Web安全 数据库 搞懂web安全防护 SQL注
  • 浅谈能耗系统在马来西亚连锁餐饮业的应用

    1 背景信息 Background 针对连锁餐饮业能耗高且能源管理不合理的问题 利用计算机网络技术 通讯技术 计量控制技术等信息化技术 实现能源资源分类分项计量和能源资源运行监管功能 清晰描述各分店总的用能现状 实时监测各供电回路的电压 电
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • 网络空间安全女生就业,怎么学?

    我实验室的学长们基本都是以红队和复现为主 如果学校好点可能还有更多的选择 如果想在这个方向深入下去 推荐流程是先打两年CTF 把大概的技术方向摸一摸 大一的话 如果学校还不错 那就优先建议打好基础 包括C语言 Python一类 建议把CTF
  • 动手学深度学习3 数据操作+数据预处理

    数据操作 数据预处理 1 基础数据结构 N维数组 2 数据操作实现 基础的张量运算 1 张量 创建与赋值 1 数据生成 创建 torch arange 2 张量的属性 shape numel 3 reshape 改变张量的shape但
  • 十分钟部署清华 ChatGLM-6B,实测效果超预期(Linux版)

    前段时间 清华公布了中英双语对话模型 ChatGLM 6B 具有60亿的参数 初具问答和对话功能 最 最 最重要的是它能够支持私有化部署 大部分实验室的服务器基本上都能跑起来 因为条件特殊 实验室网络不通 那么如何进行离线部署呢 经过一上午
  • 基于成本和服务质量考虑的不确定性下,电动汽车充电网络基础设施需求预测和迭代优化的分层框架研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 概述:利用大模型 (LLMs) 解决信息抽取任务

    论文标题 Large Language Models for Generative Information Extraction A Survey 论文链接 https arxiv org pdf 2312 17617 pdf 论文主要探讨
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

    本文介绍了 LangChain 框架 它能够将大型语言模型与其他计算或知识来源相结合 从而实现功能更加强大的应用 接着 对LangChain的关键概念进行了详细说明 并基于该框架进行了一些案例尝试 旨在帮助读者更轻松地理解 LangChai
  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

    传统搜索系统基于关键字匹配 在面向 游戏攻略 技术图谱 知识库等业务场景时 缺少对用户问题理解和答案二次处理能力 本文探索使用大语言模型 Large Language Model LLM 通过其对自然语言理解和生成的能力 揣摩用户意图 并对
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 毕业设计- 基于深度学习的小样本时间序列预测算法 - Attention

    目录 前言 课题背景与意义 课题实现 一 数据集 二 设计思路 三 相关代码示例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校
  • 如何快速申请GPT账号?

    详情点击链接 如何快速申请GPT账号 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Gemini以及大模型
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 【安全】网络安全态势感知

    文章目录 一 态势感知简介 1 概念 2 形象举例 3 应具备的能力 二 为什么要态势感知 为什么网络安全态势感知很重要 三 态势感知系统的功能 四 如何评估态势感知的建设结果 五 什么是态势感知的三个层级 四 业界的态势感知产品 1 安全

随机推荐

  • 数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

    MATLAB 读取数字字符串混杂的文本文件txt中的数据 目标 介绍 纯数字的情况 需要读取的文本文件 判断文件路径 matlab 读取数据的结果 代码块 文字开头 数字在后的情况 需要读取的文本文件 matlab 读取数据的结果 代码块
  • cmake--编译器设置

    前言 cmake支持多种不同方式设置编译器标志 1 使用 target compile definitions 设置编译器标志 2 使用CMAKE C FLAGS和CMAKE CXX FLAGS设置编译标志 一 目录结构 CMakeList
  • 复习C语言指针---函数指针

    复习C语言指针 函数指针 文章目录 复习C语言指针 函数指针 函数 函数指针 函数指针数组 回调函数 结束语 函数 一个函数表达式其实是不存在直接的 操作符的 操作符要求操作数是函数指指针 或者一些类类型 实际上 当用 f1 这样调用f1时
  • 华为服务器系统崩了怎么办,服务器崩溃重装系统

    服务器崩溃重装系统 内容精选 换一换 裸金属服务器操作系统无法正常启动 操作系统中毒 或裸金属服务器系统运行正常 但需要对系统进行优化 使其在最优状态下工作时 用户可以使用重装裸金属服务器的操作系统功能 重装操作系统是以原镜像进行系统重装
  • jackson 驼峰注解_springboot jackjson驼峰转下划线

    有如下几种方法 1 通过ObjectMapper设置 mapper setPropertyNamingStrategy com fasterxml jackson databind PropertyNamingStrategy SNAKE
  • C++ 模板

    模板是泛型编程的基础 泛型编程即以一种独立于任何特定类型的方式编写代码 模板是创建泛型类或函数的蓝图或公式 库容器 比如迭代器和算法 都是泛型编程的例子 它们都使用了模板的概念 每个容器都有一个单一的定义 比如 向量 我们可以定义许多不同类
  • springboot整合Redis时spring.redis.database参数不生效

    问题描述 配置配件中配置redis的database参数无论配置什么值时都是默认的0 网上查阅大量资料没有查到原因 解决 在网上找到了此网友的回答 虽然没有直接帮助我们解决问题 但给我提供了解决问题的思路 从这图阔以看出redis的data
  • PCL分割方法:区域生长分割算法(RegionGrowing)

    转载 有梦想的田园犬 https blog csdn net AmbitiousRuralDog article details 80267519
  • 数字信号处理基础----傅里叶级数

    1 傅里叶级数的余弦形式 1 1 正交的三角函数集 三角函数集 1 2 2 1 2 3 内的函数在区间 上彼此正交 也即 任意两个不同的函数的内积为0 函数和自身的内积不为零 因此 函数可以由该正交函数集唯一的表示 1 2 傅里叶级数的定义
  • vite+vue3打包部署问题

    最近使用vite vue3写了个小的demo 发现打包部署后页面出不来 如果是正常把包放在服务器的根目录中 项目页面是可以打开的 但是我要部署的是根目录dist包里面 外面多了一层文件夹 解决 vite config ts文件 base z
  • 横向手风琴效果

    html
  • 华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动

    华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动 最近入手一只华硕a501lb5200 然后某宝上买内存 固盘 接着拆机加内存和固盘并装上win7系统 于是想分享下自己的经验 大家多多补充 1 拆机加内存和固盘 内
  • Redis集群主从复制不生效的问题分析及解决

    一 集群信息 Redis版本 5 0 集群规模 三主三从 二 基本情况 在项目中为了达到高可用的目的 使用了Redis集群 搭建过程同Redis Cluster集群原理 三主三从交叉复制实战 故障切换 但是在实际使用中发现 集群方式比单点模
  • discuz未登录情况下首页tdk显示“首页”

    问题 discuz未登录状态下首页tdk与后台设置的不符 如图问题keywords和description变成了门户 也有部分变成了首页 解决办法 用编辑器打开 source class helper下的helper seo php文件 找
  • LeetCode#88. 合并两个有序数组(Python)

    题目 来源力扣 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序
  • 很全的 Java 权限认证框架

    今天给大家推荐的这个开源项目超级棒 可能是史上功能最全的 Java 权限认证框架 这个开源项目就是 sa token Sa Token是什么 sa token是一个轻量级Java权限认证框架 主要解决 登录认证 权限认证 Session会话
  • FATFS:一个兼容windows的嵌入式文件系统API使用详解

    FATFS 一个兼容windows的嵌入式文件系统API使用详解 目录 FATFS 一个兼容windows的嵌入式文件系统API使用详解 1 API分类 2 常用API说明 2 1 挂载文件系统与解除挂载 2 2 文件操作 2 2 1 文件
  • arduino 1 读取电机编码器值

    define BAUDRATE 115200 define LEFT 0 左轮 define RIGHT 1 右轮 define FORWARDS true define BACKWARDS false 如果一个变量所在的代码段可能会意外地
  • vue3项目打开本地pdf文件实现方法

    vue3项目打开本地pdf文件实现方法 效果图 引入pdf插件 pdf页面封装 pdf存放目录 结语 效果图 引入pdf插件 注意一定要这个版本 不然会报错key split at is not a function npm install
  • 深度学习入门笔记之VggNet网络

    VGGNet是由牛津大学的视觉几何组 Visual Geometry Group 和谷歌旗下DeepMind团队的研究员共同研发提出的 获得了ILSVRC 2014 2014年ImageNet图像分类竞赛 的第二名 将 Top 5错误率降到