卷积神经网络实验三:模型优化(1)

news2024/11/26 22:19:06

作者有话说:
这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试,虽然接触深度学习有一年了,但是对于模型的优化仅仅是局限于理论上。通过这一次的实验,我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问题,我只希望能通过这篇文章告诉你,学习一定要结合实践!!!

一、前言

上篇文章《卷积神经网络实验二:CNN实现猫狗分类任务-CSDN博客》通过在原有的多层感知机上增加卷积层,在相同的数据上表现明显好于多层感知机模型。但是在损失变化曲线上可以发现,训练损失在逐渐的减少,但是测试损失不降反增,出现了过拟合现象。因此,我在设想,既然训练集上模型的性能能逐渐的提升,是不是只要让模型不再过拟合,在测试集上的效果也能提升?

实验过程中,只提供更改的代码,完整代码请参考《卷积神经网络实验一:多层感知机进行猫狗分类》


二、实验环境

本次实验环境依然使用FunHPC | 算力简单易用 AI乐趣丛生这个平台提供的免费P4显卡进行实验,具体实验环境如图:

感谢这个平台对于学生用户的支持, FunHPC | 算力简单易用 AI乐趣丛生这个算力平台显卡在全网中性价比最高,并且学生用户认证可以使用这个平台免费提供的P4显卡,单次最长使用时间为24小时,没有总时间限制,可以无限次使用。 

新用户注册有15元的体验金,可以完全不充值白嫖使用,非常值得推荐!!!

三、过拟合解决策略

首先,我们得明白什么叫做过拟合?为什么过拟合?过拟合解决的方案有哪些? 

什么叫做过拟合?

过拟合(Overfitting)是指在机器学习模型中,模型在训练数据上表现良好,但在未见过的新数据(测试数据)上表现较差的现象。简单来说,过拟合发生在模型学习到了训练数据中的噪声和细节,而不仅仅是学习到了数据的基本规律。

过拟合的原因

  1. 模型复杂度过高:当模型的参数过多时,它可能会过度拟合训练数据。复杂模型能够捕捉到训练数据中的所有细节,但这些细节往往并不具有普遍性。
  2. 训练数据不足:当训练数据量不足时,模型容易记住每个样本的特征,而不是学习到数据的通用模式。
  3. 数据噪声:如果训练数据中包含噪声或异常值,模型可能会试图将这些噪声作为有效信号进行学习,导致过拟合。
  4. 特征选择不当:包含过多无关特征或不相关的变量也会导致模型在训练数据上表现很好,但在新数据上表现不佳。

解决过拟合的方案

  1. 简化模型

    • 使用更简单的模型(如减少层数、神经元数等)。
    • 降低模型的复杂度,以降低过拟合风险。
  2. 正则化

    • L1 正则化(Lasso):通过增加权重绝对值的和来惩罚模型,使某些权重趋向于零,达到特征选择的效果。
    • L2 正则化(Ridge):通过增加权重平方和的惩罚项来减少模型的复杂度。
  3. 数据增强

    通过对训练数据进行变换(如旋转、缩放、翻转等),增加训练数据的多样性,从而减少过拟合的可能性。

 四、实验设计

在不考虑数据的情况下,引起模型过拟合的原因主要在于模型的结构和训练过程。为此,我们对于模型过拟合的解决分三步进行,分别是:模型层数验证、卷积层的调整、正则化和残差连接。

  • 模型层数验证:主要是指增加或减少模型的层次结构,例如增加卷积层或减少全连接层等等。
  • 卷积层的调整:在确定整体的模型结构后,不同神经网络层的设置依然会影响模型的效果,例如卷积核的大小等等。
  • 正则化和残差连接:这一步主要进行的是:增加正则化操作、残差连接等等。

五、第一步

基础知识:

在进行第一步优化前我们先来了解以下全连接层和卷积层的基础知识。

特性全连接层 (FC Layer)卷积层 (Convolutional Layer)
作用特征组合:全连接层将上层提取的特征重新组合,将局部信息整合为全局信息。
非线性变换:通过学习权重和偏置,增加非线性表达能力。
分类和回归:用于输出层,进行类别或数值预测。
局部特征提取:通过卷积核扫描局部区域,提取边缘、角点等空间结构特征。
参数减少:只连接局部区域,降低参数数量。
多层次特征提取:通过堆叠卷积层逐层提取复杂特征。
层数多和少的影响多层:增加表达能力,能学习复杂特征组合,但可能过拟合。
少层:简单结构,减少计算,适合基本任务。
多层:学习丰富、复杂的特征,适合处理复杂结构数据。
少层:适合简单任务,减少计算,特征学习能力有限。
单层中神经元/卷积核数量多和少的影响神经元多:提高拟合能力,适合复杂数据,但易过拟合。
神经元少:降低参数量,有助泛化,但可能无法捕捉复杂模式。
卷积核多:捕获更多样的特征,增强模型特征表达能力。
卷积核少:计算资源减少,但特征丰富度降低。
卷积核大小不适用小卷积核(如 3x3):捕捉细节,堆叠后可扩大感受野,参数效率高。
大卷积核(如 5x5 或 7x7):覆盖更大区域,计算复杂度高,适合少层情况。
输入/输出通道数不适用输入通道数:输入通道越多,卷积核可接收更多特征。
输出通道数:增加输出通道数可增强特征捕获能力,通常层数增加后通道逐步增加。
滑窗步长 (Stride)不适用小步长(如 1):获取更高分辨率特征,但计算量大。
大步长(如 2 或 3):减小特征图尺寸、降低计算量,但过大会导致信息丢失。
Padding(填充)不适用无填充 (padding=0):特征图尺寸减小,适合内部特征。
零填充 (padding>0):保留尺寸,适合深层结构保留空间分辨率。

原来的模型:

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = 50 * 35 * 35  # 根据卷积后的特征图大小来设置

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 2)

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))

        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

损失曲线:

模型实验:

实验1:减少全连接层

 在这一步中,通过将全连接层fc2剔除,来降低模型的复杂程度:

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = 50 * 35 * 35  # 根据卷积后的特征图大小来设置

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 128)
        #self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(128, 2)

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        #x = F.relu(self.fc2(x))

        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

去掉一个全连接层后发现,模型损失的减少变得缓慢,并且最低测试损失大于原来的模型。通过实验可以发现,减少一层全连接层就降低了模型的表达能力和综合能力,并且最终也出现了过拟合。

实验2:降低全连接层的神经元数量

在实验1的基础上降低全连接层fc1的神经元数量,降低模型的拟合能力。

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = 50 * 35 * 35  # 根据卷积后的特征图大小来设置

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 64)
        #self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 2)

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        #x = F.relu(self.fc2(x))

        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

通过实验发现,模型损失降低的速度增加,并且最低损失小于原有的模型和实验1。

通过降低全连接层的神经元的数量可以明显降低模型的过拟合,但是模型还是出现了过拟合现象。为什么模型的能力还是不行? 

 

实验3:增加卷积层

考虑到模型的性能提升并不高,这是不是因为特征的问题,因此在实验2的基础上增加了一层卷积层。

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        # 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1
        self.conv3 = nn.Conv2d(50, 70, kernel_size=4, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = self._get_fc1_input_size((3, 150, 150))

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 64)
        self.fc3 = nn.Linear(64, 2)

    def _get_fc1_input_size(self, input_shape):
        with torch.no_grad():
            x = torch.zeros(1, *input_shape)  # 创建一个符合输入图像尺寸的假数据
            x = F.max_pool2d(F.relu(self.conv1(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv2(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv3(x)), 2, 2)
            return x.numel()  # 计算展平后的特征大小

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 第三个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv3(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        
        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

通过实验发现,果然如猜测一样,模型虽然通过全连接层的结构简化可以降低过拟合, 但是在特征提取上不够也不行。增加了卷积层之后,模型的性能提升较高,最低损失比以往的都低。但也可以发现,增加卷积层后,模型损失降低的速度也变慢了。

实验4: 再增加一层卷积层

 通过上面的实验可以发现,增加卷积层非常有用,既然有用,是不是说明继续增加卷积层,提取增加综合的特征是不是模型的能力会在此提升。

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        # 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1
        self.conv3 = nn.Conv2d(50, 70, kernel_size=4, stride=1, padding=0)
        # 新增的第四个卷积层: 输入70个通道,输出100个通道,卷积核大小为3x3,步长为1
        self.conv4 = nn.Conv2d(70, 100, kernel_size=3, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = self._get_fc1_input_size((3, 150, 150))

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 64)
        self.fc3 = nn.Linear(64, 2)

    def _get_fc1_input_size(self, input_shape):
        with torch.no_grad():
            x = torch.zeros(1, *input_shape)  # 创建一个符合输入图像尺寸的假数据
            x = F.max_pool2d(F.relu(self.conv1(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv2(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv3(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv4(x)), 2, 2)
            return x.numel()  # 计算展平后的特征大小

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 第三个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv3(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 新增的第四个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv4(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        
        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

实验结果如猜想一样,最低损失进一步降低,但模型的损失减低速度也变得更慢了。 

实验5:继续增加卷积层

为了进一步验证增加卷积层是否能无线提高模型的性能,我们继续添加卷积层。 

# 定义CNN模型
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        # 第一个卷积层: 输入3个通道(RGB),输出20个通道,卷积核大小为5x5,步长为1
        self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)
        # 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1
        self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)
        # 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1
        self.conv3 = nn.Conv2d(50, 70, kernel_size=4, stride=1, padding=0)
        # 第四个卷积层: 输入70个通道,输出100个通道,卷积核大小为3x3,步长为1
        self.conv4 = nn.Conv2d(70, 100, kernel_size=3, stride=1, padding=0)
        # 新增的第五个卷积层: 输入100个通道,输出150个通道,卷积核大小为3x3,步长为1
        self.conv5 = nn.Conv2d(100, 150, kernel_size=3, stride=1, padding=0)
        
        # 计算经过卷积层和池化后的特征图大小
        # 输入图像的假设尺寸为 (3, 150, 150)
        self.fc1_input_size = self._get_fc1_input_size((3, 150, 150))

        # 全连接层
        self.fc1 = nn.Linear(self.fc1_input_size, 64)
        self.fc3 = nn.Linear(64, 2)

    def _get_fc1_input_size(self, input_shape):
        with torch.no_grad():
            x = torch.zeros(1, *input_shape)  # 创建一个符合输入图像尺寸的假数据
            x = F.max_pool2d(F.relu(self.conv1(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv2(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv3(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv4(x)), 2, 2)
            x = F.max_pool2d(F.relu(self.conv5(x)), 2, 2)
            return x.numel()  # 计算展平后的特征大小

    def forward(self, x):
        # 第一个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2),降低特征图尺寸
        
        # 第二个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 第三个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv3(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 第四个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv4(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 新增的第五个卷积层 + ReLU + 最大池化
        x = F.relu(self.conv5(x))
        x = F.max_pool2d(x, 2, 2)  # 池化层 (2x2)

        # 展平特征图
        x = x.view(-1, self.fc1_input_size)

        # 全连接层 + ReLU
        x = F.relu(self.fc1(x))
        
        # 输出层 (无激活函数,因为最后要用交叉熵损失)
        x = self.fc3(x)
        return x

这次实验的结果发现,模型的最低损失比上次降低一点,但不多。这说明模型再增加卷积层上已经无法再进一步的前进了。 

 

总结

通过一系列模型修改实验,我们其实可以得出结论。那就是,卷积层的增加的确会提高模型提取特征的能力,但是有限度。并且增加卷积层也会降低模型的收敛速度。全连接层的简化可以防止模型的过拟合。模型性能的好坏,其实是需要我们不断进行尝试修改的,这真的就是一个炼丹的过程,没人可以直接写出一个性能最优的模型。

预告

接下来我会继续完成模型的第二步和第三步优化,敬请期待!

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

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

相关文章

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件:先了解集群搭建流程是什么样,需要改哪些配置,有哪些环境,这个文章目的是简化部署。 clickhouse运维篇(一):docker-compose 快速部署clickhouse集群 clickhouse运维篇(二&am…

嵌入式浏览器 -- Chromium VS Firefox

嵌入式浏览器概念 嵌入式浏览器是嵌入式系统中的核心组件之一,用于为设备提供网络访问能力和内容显示功能。与传统PC浏览器相比,嵌入式浏览器更加注重性能优化和资源效率,同时确保核心功能可用,如HTML渲染、JavaScript支持和多媒…

CSP-J2024入门级T3:小木棍

题目链接 CSP-J2024T3:小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。 现在小 S 希望拼出一个正整数,满足如下条件: 拼出这个数恰好使用

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程 Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程前言 OpenCV概述核心功能优势特点应用领域安装与使用 OpenCV_contrib概述核心功能具体模块 安装与使用一、准备工作二、下载OpenCV和OpenCV_contrib三、编译和安装OpenCV四、…

shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘

查找美国安全局漏洞 nww.nsa.gov(美国安全局官方网站) net参数使用 搜索指定的ip网段 shodan search --limit 10 --fields ip_str,port net:208.88.84.0/24 (老美国家安全局的一个网段)可能直接访问不太行,可以使用host参数,得到域名再去…

nrm的使用

在安装nrm之前,要先完成node.js的安装。 1、nrm的介绍 ‌nrm(npm registry manager)是一个npm源管理器,允许用户在不同npm源之间快速切换。 关于npm和nvm的介绍,详见文章nvm的使用-CSDN博客。 解释:比如…

图片懒加载(自定义指令)

----------------------------------------------------------- 图片懒加载自定义指令使用mock模拟随机图片列表组件如下(主要内容):配置自定义指令 图片懒加载 实现思路 使用自定义指令实现通用图片懒加载(在图片到达视口内时再…

socket编程---UDP

目录 一、socket 二、socket接口 1.流程原理 2.代码 前言 提示:这里可以添加本文要记录的大概内容: socket编程又称套接字编程,指进行网络通信程序的编写 提示:以下是本篇文章正文内容,下面案例可供参考 一、soc…

R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍CatBoost的原理CatBoost的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC Curv…

创建ODBC数据源SQLConfigDataSource函数的用法

网络上没有这个函数能实际落地的用法说明&#xff0c;我实践后整理一下&#xff1a; 1.头文件与额外依赖库&#xff1a; #include <odbcinst.h> #pragma comment(lib, "legacy_stdio_definitions.lib") 2.调用函数&#xff1a; if (!SQLConfigDataSourceW(…

HCIP-HarmonyOS Application Developer V1.0 笔记(一)

HarmonyOS的系统特性 硬件互助&#xff0c;资源共享;一次开发&#xff0c;多端部署;统一OS&#xff0c;弹性部署。 分布式软总线&#xff1a;分布式任务调度、分布式数据管理、分布式硬件虚拟化的基座 18N的独立设备 1个手机&#xff0c;8种设备&#xff08;车机&#xff0c…

upload-labs靶场Pass-21

upload-labs靶场Pass-21 本关上传方法众多&#xff0c;但是应该考察的是数组后缀绕过&#xff0c;所以我的上传围绕此展开 1.分析源码 $is_upload false; // 初始化上传状态为false $msg null; // 初始化消息变量为null// 检查是否有文件上传 if(!empty($_FILES[upload_fi…

【undefined reference to xxx】zookeeper库编译和安装 / sylar项目ubuntu20系统编译

最近学习sylar项目&#xff0c;编译项目时遇到链接库不匹配的问题&#xff0c;记录下自己解决问题过程&#xff0c;虽然过程很艰难&#xff0c;但还是解决了&#xff0c;以下内容供大家参考&#xff01; undefined reference to 问题分析 项目编译报错 /usr/bin/ld: ../lib/lib…

网络服务ssh

Linux 网络基础 一、知识回顾 网络地址&#xff1a;互联网协议地址&#xff08;IP地址&#xff09;为互联网上每一个网络或主机分配一个逻辑地址&#xff0c;IP地址工作在网络层。 ​ IP的分类&#xff1a;IPV4 IPV6 物理地址&#xff1a;物理地址&#xff08;MAC地址&…

Git获取本地仓库和常用指令

一、获取本地仓库 1&#xff09;在电脑的任意位置创建一个空目录&#xff08;例如test01&#xff09;作为我们的本地Git仓库 2&#xff09;进入这个目录中&#xff0c;点击右键打开Git bash窗口 3&#xff09;执行命令git init&#xff08;初始化当前目录为一个git仓库&…

解决报错:JDK版本不正确

加载maven过程中&#xff0c;控制台报错&#xff1a; Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.…

Webserver(1.8)操作函数

目录 文件属性操作函数access函数chmod函数chown函数truncate函数 目录操作函数mkdir函数rmdir函数rename函数chdir函数*getcwd函数 目录遍历函数*opendir函数*readdir函数closedir函数 dup、dup2函数dupdup2 fcntl函数 文件属性操作函数 access函数 判断某个文件是否有某个权…

解决ElasticSearch启动成功却无法在浏览器访问问题

目录 前言&#xff1a; 问题复现 &#xff1a; 解决问题&#xff1a; 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出&#xff0c;输入以下命令使其生效 结语&#xff1a; 前言&#xff1a; 这篇文章是小白我今天突然启动es&#xff0c;发现e…

【tomcat系列漏洞利用】

Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用。主要组件&#xff1a;服务器Server&#xff0c;服务Service&#xff0c;连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container…

如何在Linux系统中使用SSH Key认证进行无密码登录

如何在Linux系统中使用SSH Key认证进行无密码登录 SSH Key认证简介 安装SSH 在Debian/Ubuntu系统中检查 在CentOS/RHEL系统中检查 生成SSH密钥 复制公钥到远程服务器 配置SSH服务端 编辑SSH配置文件 重启SSH服务 测试无密码登录 SSH Key认证的高级配置 设置密钥的权限 限制密…