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

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

一、前言

上篇文章《卷积神经网络实验二: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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.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)# 全连接层 + ReLUx = 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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.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)# 全连接层 + ReLUx = 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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.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)# 全连接层 + ReLUx = 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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)# 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1self.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)# 全连接层 + ReLUx = 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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)# 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1self.conv3 = nn.Conv2d(50, 70, kernel_size=4, stride=1, padding=0)# 新增的第四个卷积层: 输入70个通道,输出100个通道,卷积核大小为3x3,步长为1self.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)# 全连接层 + ReLUx = 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,步长为1self.conv1 = nn.Conv2d(3, 20, kernel_size=5, stride=1, padding=0)# 第二个卷积层: 输入20个通道,输出50个通道,卷积核大小为4x4,步长为1self.conv2 = nn.Conv2d(20, 50, kernel_size=4, stride=1, padding=0)# 第三个卷积层: 输入50个通道,输出70个通道,卷积核大小为4x4,步长为1self.conv3 = nn.Conv2d(50, 70, kernel_size=4, stride=1, padding=0)# 第四个卷积层: 输入70个通道,输出100个通道,卷积核大小为3x3,步长为1self.conv4 = nn.Conv2d(70, 100, kernel_size=3, stride=1, padding=0)# 新增的第五个卷积层: 输入100个通道,输出150个通道,卷积核大小为3x3,步长为1self.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)# 全连接层 + ReLUx = F.relu(self.fc1(x))# 输出层 (无激活函数,因为最后要用交叉熵损失)x = self.fc3(x)return x

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

 

总结

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

预告

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

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

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

相关文章

信息安全数学基础(42)分式域

一、定义 设R是一个整环,如果有一个域F使得从R到F有一个单的环同态,并且F中的每一个元素都可以表示成σ(a)σ(b)^(-1)的形式,其中a∈R,b∈R*(R的非零元构成的乘法群),那么把F称为R的分式域。 二…

HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构

文章目录 什么是 HTML ?HTML 的构成 ?什么是 HTML 元素?HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML ? HTML(超文本标记语言,HyperText Markup L…

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引? 全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。 二…

CentOS7配置静态IP(非解决方法指导,纯笨蛋记录)

一、这篇博客算是记录我终于解决我安装的虚拟机ping不通外网的问题,前前后后我尝试了很多次花了很多时间,最后弄完发现其实都是因为我之前根本不知道什么是虚拟机的网络配置。。。。。 这个链接介绍了vmware虚拟机三种网络模式及配置详解_vmware 特定虚…

数据丢失不用愁!10款必备的数据恢复软件全介绍

现在我们使用微信的频率愈发高涨,不论是生活、工作,甚至是兴趣还好可能都能在这个软件里看到身影。正因为它涉及了我们的生活如果因为病毒或者其他原因导致聊天记录清空,对很多人来说都很麻烦。那么微信聊天记录删了怎样才能恢复呢&#xff0…

国内版Sketchfab平台 - CG美术之家(3D编辑发布篇)

CG美术之家为您提供了一个简便的模型上传流程,让发布您的3D模型变得轻而易举。只需准备好通用的3D模型格式,如OBJ、FBX或STL,您就可以轻松上传并分享您的创作。我们的平台支持在线3D渲染,您只需花费不到一分钟的时间,就…

安防被动红外和主动红外

被动红外探测器是依靠被动的吸收热能动物活动时身体散发出的红外热能进行报警的,也称热释红外探头,其探测器本身是不会发射红外线的。 被动红外探测器中有2个关键性元件,一个是菲涅尔透镜,另一个是热释电传感器。**自然界中任何高…

使用Flask构建RESTful API

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Flask构建RESTful API Flask简介 环境搭建 安装Flask 项目结构 创建应用 路由定义 请求处理 获取查询参数 获取请求体 响应…

知识竞赛活动选手台桌怎么摆放好

知识竞赛活动选手台桌摆放主要根据选手台桌、舞台及和竞赛规则决定,一般有以下几种方案。 一、一字摆放 如果舞台宽度不够,就一字摆放。这样选手就无法看到大屏,选手就要配置看题平板或电脑。也可以在选手前面放置一台大电视。如图&#xf…

SQL之排名窗口函数RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表,表中包含id、uname、age、score 四个字段,如下所示: 该表的数据如下所示: 一、ROW_NUMBER() 1、概念 ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数,编号从 1 开始。‌ 该函数按照指…

NeurIPS - Ariel Data Challenge 2024

1比赛概述 Ariel数据挑战2024 邀请参赛者开发机器学习模型,解决天文学领域中的一项重大挑战——从即将到来的欧洲航天局(ESA)Ariel任务的模拟观测中提取微弱的系外行星信号。Ariel任务计划于2029年启动,旨在对银河系邻近的约1,00…

Javaweb 实验4 xml

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 实验四 XML 目的: 安装和使用XML的开发环境认识XML的不同类型掌握XML文档的基本语法了解D…

CRON组件一个复杂的一个简单的

CRON组件一个复杂的一个简单的 一个是复杂点的一个是简单点。 1.以简单的为例使用&#xff1a; 父组件 import CronSimple from "/views/xxx/components/cron-simple/index.vue";components: {CronSimple}<el-dialog title"调度CRON"v-if"cronV…

乒乓球烧拍日记之三蝴蝶蓝芳碳

朋友给了我个蝴蝶成品拍&#xff0c;要更换胶皮&#xff0c;底板是蓝芳碳磕碰很严重&#xff0c;木材都没了&#xff0c;没法补。淋巴面材&#xff0c;成品拍胶水很牢固非常难去除 把蓝芳碳纤维去除下毛边&#xff0c;然后用乳胶胶水填补缺失部分。(https://img-blog.csdnimg.…

高德地图如何标注店铺名称和位置信息?

在当今数字化和信息化的市场环境中&#xff0c;商家不仅需要提供优质的商品和服务&#xff0c;还需要通过多种方式来提升店铺的线上可见度和顾客体验。其中&#xff0c;在地图上准确标注店铺名称和位置信息已成为商家不可忽视的重要环节。而高德地图作为国内领先的导航和位置服…

构建品牌影响力:知识库工具在市场营销中的创新应用

在当今这个信息爆炸的时代&#xff0c;品牌影响力成为了企业市场竞争力的核心要素。为了有效提升品牌影响力&#xff0c;企业不仅需要精准的市场定位和优质的产品服务&#xff0c;还需要借助高效、智能的知识库工具来优化其市场营销策略。本文将探讨知识库工具在市场营销中的创…

HTML 文档规范与解析模式:DOCTYPE、<html> 标签以及结构化页面

文章目录 `<!DOCTYPE html>` 文档类型声明标准模式与怪异模式HTML5 的简化声明`<html>` 标签`<head>` 标签`<body>` 标签小结<!DOCTYPE html> 文档类型声明 在 HTML 文档中,<!DOCTYPE html> 是一个重要的文档类型声明,主要用于告知浏览…

YOLOv5之Common.py

文章目录 1.学习目的2.网络模型![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/67b8dbd00c9b4034ba370fc8b8a6031a.jpeg)3.common.py分析 1.学习目的 YOLOv5中最关键一个模型类 2.网络模型 3.common.py分析 # Ultralytics YOLOv5 &#x1f680;, AGPL-3.0 license…

【设计模式】如何用C++实现依赖倒置

【设计模式】如何用C实现依赖倒置 一、什么是依赖倒置&#xff1f; 依赖倒置原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是SOLID面向对象设计原则中的一项。它的核心思想是&#xff1a; 高层模块不应该依赖于低层模块&#xff0c;两者都应该…

2、liunx网络基础

一、TCP/IP协议概述 Linux服务器默认网卡配置文件在/etc/sysconfig/network-scripts/下&#xff0c;命名的名称一般为:ifcfg-eth0 ifcfg-eth1 &#xff0c;eth0表示第一块网卡&#xff0c;eth1表示第二块网卡&#xff0c;依次类推。一般DELL R720标配有4块千兆网卡。 TCP/IP&a…