深度学习中损失函数(loss function)介绍
深度学习中损失函数(loss function)介绍
在深度学习的宏伟城堡中,损失函数扮演着国王的角色,它决定了模型训练的方向和目标。损失函数,也被称为代价函数,是衡量模型预测与实际结果之间差异的函数。在深度学习的训练过程中,我们的目标就是最小化这个损失函数,就像是在一场游戏中,我们的目标是获得尽可能低的失误和丢分。
损失函数的选择对于模型的训练至关重要。不同的问题可能需要不同的损失函数。比如在图像识别中,我们可能需要一个能够处理大量类别的损失函数,这时候交叉熵损失就是一个很好的选择。而在预测房价等连续值的问题中,均方误差损失可能更为合适。
损失函数不仅是评价模型性能的标尺,也是指导模型学习的方向。在训练过程中,我们通过计算损失函数的梯度,并使用梯度下降算法来更新模型的权重,以此来减少损失函数的值。
1. 损失函数的作用
1-1. 损失函数作用
想象一下,你在玩一个投飞镖的游戏,而飞镖靶就是损失函数。你的每一次投掷,都对应着模型的一次预测。飞镖落在靶上的位置,就是预测结果与实际结果之间的误差。损失函数的作用就是告诉我们,我们的飞镖投得有多准,或者说,我们的模型预测得有多准确。
在深度学习中,损失函数计算模型输出(预测值)和真实标签(实际值)之间的差异。这个差异,或者说“误差”,量化了模型的性能。训练深度学习模型的过程,本质上就是通过调整模型的参数来最小化损失函数的过程。损失函数通常被视为一种 优化目标,它在训练过程中不断变化,我们希望通过优化算法(如梯度下降)来不断 减小损失函数,使得模型更精确地拟合数据。
1-2. 为什么要让损失函数持续下降
损失函数的下降反映了模型的性能提高,因此我们希望通过调整模型参数使损失函数尽可能持续下降。具体来说:
- 反映模型拟合度:损失函数值越小,说明模型在训练数据上的拟合程度越高,预测误差越小。
- 优化目标:在机器学习和深度学习中,我们的最终目标是训练出一个 尽可能准确 的模型,使得它对未见过的数据(测试数据或未来数据)具有较好的预测能力。为了达到这个目标,必须尽量 最小化损失函数,降低模型的误差。
- 梯度下降优化:优化过程的核心就是通过梯度下降法(或其变种)不断更新模型参数,以减少损失函数。每次更新时,都会使用损失函数来计算梯度,并沿着梯度的方向调整参数。
- 避免过拟合或欠拟合:通过不断调整模型参数(如网络层、权重等),让损失函数下降,可以防止模型在训练数据上产生过拟合或欠拟合。过拟合是指模型在训练数据上表现很好,但在新数据(测试数据)上表现差;欠拟合则是指模型的表达能力不足,无法有效地拟合训练数据。
模型的拟合度(Model Fit)指的是模型在训练数据上的表现程度,衡量模型能够多好地捕捉训练数据中的规律和模式。拟合度越高,表示模型能够更精确地预测训练数据中的目标变量。具体来说:
- 高拟合度:模型能够准确地预测训练数据中的结果,误差较小。这通常意味着模型的复杂度较高,可以很好地表达数据中的模式和关系。然而,过高的拟合度可能导致过拟合,即模型过度依赖训练数据中的噪声,不能很好地推广到新数据。
- 低拟合度:模型不能很好地拟合训练数据,误差较大。这通常表明模型过于简单,无法捕捉数据的复杂规律,可能存在欠拟合现象。欠拟合的模型通常表现出较高的训练误差和较低的泛化能力。
为了避免过拟合和欠拟合,常通过调整模型的复杂度、损失函数、训练数据的量和质量、正则化方法等,来优化模型的拟合度,使其既能在训练集上取得较好的结果,又能在测试集或实际应用中具有较好的预测能力。
梯度下降是通过不断调整参数来最小化损失函数,最终使模型学习到最优的参数,从而提高预测准确性。假设你正在训练一个神经网络,并且已经得到了初始的参数(例如权重)。你计算出当前参数下的损失函数值(比如MSE损失)。接下来,你计算每个参数的梯度(即每个权重对损失函数的影响)。然后,你根据这些梯度调整权重,使得损失函数逐渐减小,模型预测更加准确。这个过程重复进行,直到损失函数的值降到足够小为止。
1-3. 损失函数下降的目标
- 模型优化:每次调整参数时,我们希望通过梯度下降法(或其他优化算法)最小化损失函数。这是因为只有在训练过程中,模型的误差不断下降,才能有效地提高模型的预测性能。
- 收敛与稳定性:损失函数在训练过程中逐渐减少,通常是模型朝着最佳解(即最小化误差)收敛的标志。若损失函数在多个训练轮次中持续下降,表明模型已经开始稳定地找到最优的参数。
- 防止欠拟合和过拟合:当损失函数 持续下降 到一个较低的值时,通常说明模型在训练集上拟合得较好。如果损失函数长时间不下降,可能表明模型无法有效拟合数据,产生了 欠拟合。如果损失函数持续下降,并且在训练集和测试集上都表现良好,模型可能会很好地泛化,避免 过拟合。
1-4. 损失函数下降的具体作用
- 减少误差:损失函数的值反映了模型的预测值与真实值之间的误差。通过不断降低损失函数,我们希望减少模型的误差,使其预测更加精确。
- 训练收敛:训练中的优化目标是让损失函数趋于最小。随着训练轮次的增加,损失值应当逐渐减少,模型的参数也会越来越接近最优解。损失函数达到某个极小值时,表示训练收敛,模型已经学到了数据中的规律。
- 提高泛化能力:一个低损失函数值通常意味着模型不仅在训练集上表现好,同时也在未见过的数据上(例如验证集或测试集)具有较好的预测能力。这有助于提升模型的 泛化能力。
1-5. 如何让损失函数持续下降
让损失函数持续下降通常依赖于以下几个因素:
- 合理的学习率(Learning Rate):学习率过大可能导致损失函数震荡或发散,学习率过小可能导致训练过程非常缓慢。通过调整学习率,可以使得梯度下降更加平稳,使得损失函数持续下降。
- 优化器选择:不同的优化器(如SGD、Adam、RMSprop等)会影响训练过程中的参数更新方式,进而影响损失函数的下降速度。Adam优化器通常能加速训练并使得损失函数下降得更快。
- 模型架构:模型的复杂度(层数、神经元数量等)也影响损失函数的下降速度。如果模型太简单,可能无法捕捉数据的复杂性,导致损失函数下降缓慢或者停滞。如果模型过于复杂,则可能导致过拟合,使损失函数在测试数据上不下降。
- 数据预处理:合适的数据处理方式(如标准化、归一化、去噪等)可以加速训练过程,让损失函数更快速地下降。
- 训练轮次(Epochs):适当增加训练轮次可以帮助模型有更多的机会去优化参数,从而让损失函数继续下降。
2. 常见的损失函数
-
均方误差损失(MSE):
想象你在玩一个扔球进篮子的游戏,而篮子的大小就是均方误差损失。你每次扔球,球与篮子中心的距离平方就是你的得分。游戏的目标是尽可能让得分低,也就是让球尽可能接近篮子中心。在深度学习中,均方误差损失函数计算预测值与实际值之间差的平方的平均值,常用于回归问题。 -
交叉熵损失(Cross-Entropy Loss):
想象你在玩一个猜谜游戏,每次猜测后,系统会告诉你猜测结果与正确答案之间的差异。交叉熵损失就是这样一个函数,它衡量的是模型输出的概率分布与真实标签的概率分布之间的差异。在分类问题中,当我们有多个类别时,交叉熵损失是首选的损失函数。 -
Hinge损失(Hinge Loss):
想象你在玩一个挥剑砍靶的游戏,目标是让剑刃尽可能地砍进靶心。Hinge损失函数用于支持向量机(SVM)等最大间隔分类器,它鼓励模型产生更大的间隔,以提高分类的鲁棒性。 -
绝对值损失(Absolute Loss):
想象你在玩一个射箭游戏,目标是射中靶心,而靶心的半径就是绝对值损失。你的箭与靶心的距离越小,得分越低。绝对值损失计算预测值与实际值之间差的绝对值的平均值,它对异常值的敏感度低于均方误差损失。
3. 损失函数代码使用示例
通过以下一个示例,我们不断的优化参数,调整训练方式,来逐步使得损失函数下降的方法
【注意】:每次的参数调整只是一个调整探索过程,并不是调整后的参数一定为最优解,通过示例为了体会这个调参的过程,如何逐渐的去使得损失函数下降
demo_reg.py 功能介绍:
1.数据获取与预处理:代码首先从UCI机器学习库(archive.ics.uci.edu)获取波士顿房价数据集,对数据进行清洗(去除多余空格),并将清洗后的数据保存到本地文件housing.data中。
2.数据加载与分割:使用numpy加载本地文件,并提取特征变量x和目标变量y,然后将数据分为训练集和测试集。
3.模型定义:定义一个简单的线性神经网络模型Net,包含一个线性层用于预测。
4.模型训练:使用均方误差损失函数(MSELoss)和随机梯度下降优化器(SGD)训练模型,共迭代10000次,并在每次迭代后打印损失值和部分预测值与实际值。
注意事项:
1.确保网络连接正常,以便成功从UCI机器学习库获取数据。
2.确保数据文件housing.data可以正确保存到本地,并且路径正确。
3.确保模型训练时的数据形状一致,以避免广播问题导致的警告。
完整代码如下:demo_reg.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @Project :demo_create
# @File :demo_reg.py
# @Time :2024-12-12 18:15
# @Author :wangting_666"""pip install torch -i https://mirrors.aliyun.com/pypi/simple/pip install requests -i https://mirrors.aliyun.com/pypi/simple/pip install numpy -i https://mirrors.aliyun.com/pypi/simple/
"""# 导入所需的库
import torch
import requests
import numpy as np
import re# 指定数据文件的URL
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'
response = requests.get(url)
# 发送HTTP GET请求
if response.status_code == 200:# 请求成功,获取网页内容url_data = response.text# 按行分割数据lines = url_data.split('\n')processed_lines = []for line in lines:# 去除每行的首尾空白字符stripped_line = line.strip()if stripped_line:# 将多个连续空格替换为单个空格,并去除首尾空白字符processed_line = re.sub(r'\s{2,}', ' ', line).strip()processed_lines.append(processed_line)# 将处理后的数据行合并为一个字符串,每行之间用换行符分隔url_data = '\n'.join(processed_lines)# 指定本地文件名filename = 'housing.data'# 将处理后的数据写入本地文件with open(filename, 'w') as f:f.write(url_data)print('Data saved to {}'.format(filename))
else:# 请求失败,打印错误信息print('Failed to retrieve data')# 使用numpy加载本地文件
data = np.loadtxt('housing.data')
# 506行,14列数据
print("data.shape: {}".format(data.shape))# 提取目标变量y和特征变量x
# data 数组中提取最后一列数据,存储在变量 y 中。
y = data[:, -1]
# data 数组中提取除了最后一列之外的所有列,存储在变量 x 中。
x = data[:, 0:-1]# 将数据分为训练集和测试集
x_train = x[0:496, ...]
y_train = y[0:496, ...]
x_test = x[496:, ...]
y_test = y[496:, ...]# 打印训练集和测试集的形状
print("x_train.shape: {}".format(x_train.shape))
print("y_train.shape: {}".format(y_train.shape))
print("x_test.shape: {}".format(x_test.shape))
print("y_test.shape: {}".format(y_test.shape))# 定义神经网络模型
class Net(torch.nn.Module):def __init__(self, n_features, n_output):super(Net, self).__init__()# 定义一个线性层,用于预测self.predict = torch.nn.Linear(n_features, n_output)def forward(self, x):# 前向传播out = self.predict(x)return out# 实例化模型
net = Net(13, 1)
# 定义损失函数
loss_func = torch.nn.MSELoss()# 定义优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.0001)# 训练模型
for i in range(10000):# 将训练数据转换为PyTorch张量x_data = torch.tensor(x_train, dtype=torch.float32)y_data = torch.tensor(y_train, dtype=torch.float32)# 前向传播,计算预测值pred = net.forward(x_data)# 计算损失loss = loss_func(pred, y_data) * 0.001# 清空梯度optimizer.zero_grad()# 反向传播,计算梯度loss.backward()# 更新模型参数optimizer.step()# 每轮迭代后打印损失和部分预测值、实际值print("item:{},loss:{}".format(i, loss.item()))print(pred[0:10])print(y_data[0:10])
最后item输出损失函数结果(11.82%):loss:0.11819077283143997
item:9999,loss:0.11819077283143997
tensor([[22.0104],[20.1129],[22.3382],[22.9463],[21.9336],[21.3733],[21.1441],[17.4917],[14.9874],[18.2216]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
3-1. 调整学习率 (Learning Rate)
通过调整学习率来优化,目前使用的学习率lr=0.001,这可能会导致模型训练得较慢。可以尝试增大学习率来加速训练,或者使用更适合的值。可以尝试以下几种调整:
- 尝试
0.001
或0.01
。 - 过高的学习率可能会导致发散,可以逐步减小。
# optimizer = torch.optim.SGD(net.parameters(), lr=0.0001)
optimizer = torch.optim.SGD(net.parameters(), lr=0.001)
最后item输出损失函数结果(9.47%):item:9999,loss:0.09471820294857025
item:9999,loss:0.09471820294857025
tensor([[22.1652],[21.6274],[19.9424],[19.1086],[19.8691],[20.0128],[22.4789],[24.8061],[26.4139],[23.9335]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
3-2. 调整损失函数权重
当前在计算损失时将结果乘以了一个常数 0.001
,这会影响损失的计算。可以尝试不同的乘法因子,看看是否能改善模型表现。比如,将 0.001
改为 0.0001
。
# 计算损失
# loss = loss_func(pred, y_data) * 0.001
loss = loss_func(pred, y_data) * 0.0001
最后item输出损失函数结果(1.07%):loss:0.0107608987018466
item:9999,loss:0.0107608987018466
tensor([[24.8059],[21.2679],[21.0506],[20.6933],[20.7666],[21.0484],[21.9299],[22.2718],[19.4872],[21.5408]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
3-3. 增加训练轮数 (Epochs)
目前代码中训练轮数为 10000
次。如果你觉得模型在 10000
次迭代后仍未达到最优结果,可以适当增加训练轮数。例如,增加到 20000
或 30000
,并观察损失函数是否持续下降。
# for i in range(10000):
for i in range(30000):
最后item输出损失函数结果(0.93%):loss:0.00932362861931324
item:29999,loss:0.00932362861931324
tensor([[22.3280],[22.3310],[22.1053],[20.9865],[21.1635],[21.2615],[21.4697],[22.1821],[20.5868],[21.7904]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
3-4. 使用更高级的优化器(优化器调整)
当前使用的是 SGD(随机梯度下降),尽管它是最基础的优化器,但它可能在某些问题上收敛较慢,尤其是当损失函数比较复杂时。你可以尝试使用 Adam 优化器,它通常比 SGD 更有效,能加速训练并避免过拟合。
SGD:标准的梯度下降方法,适用于较简单的任务,收敛速度较慢且容易陷入局部最小值。
Adam:结合了动量和自适应学习率调整,通常能在复杂问题中更快收敛,避免过拟合。
学习率过大会导致模型训练不稳定,过小则会导致收敛缓慢。调整学习率可以帮助模型快速收敛
# optimizer = torch.optim.SGD(net.parameters(), lr=0.0001)
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)
最后item输出损失函数结果(0.86%):loss:0.008578178472816944
item:29999,loss:0.008578178472816944
tensor([[22.4775],[22.4890],[22.7133],[22.8217],[22.9005],[22.6268],[22.3341],[22.4805],[22.4585],[22.4555]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
3-5. 使用更复杂的损失函数
尽管 MSELoss 是回归任务中的标准损失函数,但有时候可以根据任务的特性尝试其他损失函数。例如,Huber Loss 对于一些数据中的异常值更具鲁棒性,可以尝试替换掉 MSELoss
# loss_func = torch.nn.MSELoss()
loss_func = torch.nn.HuberLoss(delta=1.0)
最后item输出损失函数结果(0.06%):loss:0.0006132011767476797
item:29999,loss:0.0006132011767476797
tensor([[21.1054],[21.1156],[21.3443],[21.4555],[21.5352],[21.2573],[20.9581],[21.1065],[21.0816],[21.0821]], grad_fn=<SliceBackward0>)
tensor([24.0000, 21.6000, 34.7000, 33.4000, 36.2000, 28.7000, 22.9000, 27.1000,16.5000, 18.9000])
通过以上的示例,可以看到损失值降低的办法非常多,是一个持续优化的过程。
相关文章:
深度学习中损失函数(loss function)介绍
深度学习中损失函数(loss function)介绍 在深度学习的宏伟城堡中,损失函数扮演着国王的角色,它决定了模型训练的方向和目标。损失函数,也被称为代价函数,是衡量模型预测与实际结果之间差异的函数。在深度学习的训练过程中&…...
【渗透测试】信息收集二
其他信息收集 在渗透测试中,历史漏洞信息收集是一项重要的工作,以下是相关介绍: 历史漏洞信息收集的重要性 提高效率:通过收集目标系统或应用程序的历史漏洞信息,可以快速定位可能存在的安全问题,避免重复…...
前端三大框架 Vue、React 和 Angular 的市场占比分析
一、引言 ?? 随着前端技术的迅速发展,Vue.js、React 和 Angular 已成为全球最受欢迎的三大前端框架。在国内外,不同的框架在市场中的占比和流行程度存在显著差异。本文将从全球和中国市场的角度,对这三大框架的市场占比进行分析࿰…...
Gitlab服务管理和仓库项目权限管理
Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件; gitlab-ctl stop # 停止所有 gitlab 组件; gitlab-ctl restart # 重启所有 gitlab 组件; gitlab-ctl status …...
MySQL ON DUPLICATE KEY UPDATE影响行数
目录 分析为什么Updates返回7 总结 数据库更新日志如下 insertOrUpdateList|> Preparing: INSERT INTO clue_user_tag (vuid, tag_id, tag_type, content) VALUES (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) ON DUPLICATE KEY UPDATE …...
美团2024年秋招第一场笔试【前端移动端】
美团2024年秋招第一场笔试【前端&移动端】 2024/12/12 1.在一个长度为28的数组中删除第5个元素时(元素序号:1~28),需要向前移动(23)个元素。 2.如下图一个树型结构,其结点E在树的中序遍历…...
【EXCEL】 获取多列中 不为空的那一个数据
从多个表格筛选出来的上班时间是下表这样的 我要把他们放在同一列,这样方便后续处理,合并列输入下面这个公式即可 日期不加 TEXT() 函数 转日期格式;将得到是一串数字 TEXT(TEXTJOIN(", ",TRUE,B2:F2),&qu…...
Qt 开发笔记2
1> 样式表加载 一定要在Ui 初始化之前调用, 之后调用会不生效。 2> 设置QlineEdit输入框 具体四周的间距: setTextMargins(m_nLeftTextMargin, m_nTopTextMargin, m_nRightTextMargin, m_nBottomTextMargin);3> 设置背景图(平滑不…...
R学习——数据框
目录 1数据框的合并 2数据框的访问 2.1 通过索引[] 2.2符号$访问 2.3 attach访问 2.4 with访问 1数据框的合并 当每个内容存储为单独的向量,data.frame可以进行这些内容单独数据框合并。 2数据框的访问 2.1 通过索引[] [i]输出对应的列 [i,]输出对应的行 …...
深入详解人工智能机器学习常见算法中的K-means聚类
目录 引言 1. K-means聚类的基本概念 1.1 K-means聚类的定义 1.2 K-means聚类的核心思想 1.3 K-means聚类的目标函数 2. K-means聚类的核心原理 2.1 初始化 2.2 分配 2.3 更新 2.4 迭代 3. K-means聚类的具体实现 3.1 K-means聚类的算法流程 3.2 K-means聚类的Pyt…...
TDengine SpringBoot操作
TDengine与Spring Boot的结合可以为开发者提供一个高性能、分布式的物联网、工业大数据处理平台,同时利用Spring Boot的简化配置和快速开发特性。以下是对TDengine与Spring Boot集成的详细解析: 一、TDengine简介 TDengine是由涛思数据开发的一款高性能…...
【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件
sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…...
C语言实验 函数一
时间:2024.12.14 6-1 弹球距离 double dist (double h,double p) {double sum = h,height;height = h*p;while(height>=TOL){sum += height * 2; //上行下行都算,所以是两倍的距离。height *=p;}return sum; } 6-2 使用函数输出一个整数的逆序数 错误代码:运行超…...
惠普Laser Jet MFP M437nda复印机成像装置严重不足及更换传输卷故障解决方法
惠普Laser Jet MFP M437nda复印机成像装置严重不足及更换传输卷故障解决方法,记录维修那点事儿,普通维修工的日常维修点滴; 惠普Laser Jet MFP M437nda复印机成像装置严重不足维修方法 如果复印及打印的效果没有问题的情况下我们也可以不更换套鼓及显影剂,那么不更换套鼓及…...
委托(Delegate)和事件(Event)-(下篇)
委托(Delegate)与事件(Event)-(上篇)-CSDN博客 上一篇内容! 一、创建非静态委托 在C#中,使用非静态委托意味着将委托绑定到类的实例方法上,而不是静态方法。这允许你通过委托调用特定对象上的方法&am…...
ios 开发配置蓝牙
如果使用了蓝牙功能, 又没有配置, 会出现以下错误: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The apps Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaini…...
JVM 栈帧结构详解
在 Java 虚拟机(JVM)中,栈帧(Stack Frame)是用于支持方法调用和方法执行的关键数据结构。每个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。本文将详细介绍 JVM 栈帧的结构及…...
HTML和JavaScript实现商品购物系统
下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)
目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 (1)提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…...
ip_done
文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…...
Mysql体系架构剖析——岁月云实战笔记
1 体系架构 理论内容阅读了mysql体系架构剖析,其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务,引入线程池,允许多台客户端连接,主要工作:连接处理、授权认证、安全防护、管理连接等。 连接处理&a…...
【卷积神经网络】AlexNet实践
构建模型 模版搭建 # 定义一个AlexNet模型类def __init__(self):# 调用父类的构造函数(如果继承自nn.Module的话)super(AlexNet, self).__init__()# ReLU激活函数self.ReLU nn.ReLU()# 卷积层1:输入1个通道(灰度图)&a…...
LF CRLF
这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...
Python学习(二)—— 基础语法(上)
目录 一,表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二,运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三,语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…...
科研绘图系列:R语言绘制网络图和密度分布图(network density plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…...
python解题之寻找最大的葫芦
问题描述 问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 �a 和另外两张相同牌面值的牌 �b。如果两个人同时拥有“葫芦”,我们会优先比较牌 &#…...
openwrt安装tailscale
1. 下载 进入tailscale的github仓库复制最新版本的链接:点击跳转 wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.36.1-fb2f6cf-autoupdate/openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz2.解压缩 tar x -zvC / …...
基于物联网的智能插座云平台 WIFI云平台MQTT协议
功能介绍 功能描述: STM32单片机为控制核心 LCD1602液晶显示当前时间温度 开启时间 关闭时间 按键设置开启时间/关闭时间,温度报警上限 到开启时间,继电器自动打开,到关闭时间,自动关闭 通过DS18B20温度传感器获…...
MySQL 事务
概念介绍 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。 事务就是要做的或所做的事情,主要用…...
消息中间件面试题-参考回答
消息中间件面试题-参考回答 面试官:RabbitMQ-如何保证消息不丢失 候选人: 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面…...
解决 MyBatis 中空字符串与数字比较引发的条件判断错误
问题复现 假设你在 MyBatis 的 XML 配置中使用了如下代码: <if test"isCollect ! null"><choose><when test"isCollect 1">AND exists(select 1 from file_table imgfile2 where task.IMAGE_SEQimgfile2.IMAGE_SEQ and im…...
【ETCD】【源码阅读】深入解析 etcd 的 `EtcdServer.Start` 函数
深入解析 etcd 的 EtcdServer.Start 函数 在 etcd 的代码中,EtcdServer.Start 是一个关键方法,用于初始化并启动服务器以便处理请求。本文将从源码的角度逐步分析此函数的每一步操作。 函数签名及注释 // Start performs any initialization of the Se…...
嵌入式驱动开发详解16(音频驱动开发)
文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于ALSA驱动框架过于复杂,实现音频编解码芯片的驱动不是一个人能完成的…...
【数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二分查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据键盘输入的一组有序数据建立顺序表,2.顺序表的输…...
探索云原生数据库 PolarDB
引言 在云计算时代,数据库的重要性不言而喻。随着企业数字化转型的加速,对数据库的性能、可靠性和灵活性的要求也越来越高。阿里云推出的云原生数据库 PolarDB,正是为了满足这些需求而设计的一款高性能、兼容性强、弹性灵活的关系型数据库产品。本文将详细介绍 PolarDB 的特…...
OGG FOR MYSQL同步DDL
以下实验测试OGG FOR mysql 同步DDL, OGG 21.3 MYSQL 8.0.27 --创建测试数据 create table oggddl_20241201 (oid int primary key ,oname varchar(10)); create table oggddl_20241202 (oid int primary key ,oname varchar(10)); create table oggddl_20241203…...
【CAN】asc报文格式文件合并(python版)
目录 一、简介二、合并asc格式报文1、准备多个asc文件2、根据时间合并asc文件3、结果 三、总结四、参考 一、简介 CAN通信:CAN(Controller Area Network)是一种多主方式的串行通讯总线。基本设计规范要求有高位速率、高抗电磁干扰性…...
C++之STL的map容器
map map的实现方式 set是一个有序的关联容器,是基于平衡二叉搜索树(红黑树)实现的,元素是有序的 map的用法 #include <iostream> #include <map> using namespace std;const int ADDSIZE 20; int main() {map<int, int> m;cout &…...
基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源
前言 对于本教程,说白了,就是期望能通过一个程序判断一张图片是否为某个物体,或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题,因此主要处理 是 与 不是 的问题,比如我的模型是判断一张图片是否为苹果…...
react-dnd 拖拽事件与输入框的文本选中冲突
问题描述 当我们使用拖拽库的时候,往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点,当拖拽的事件绑定在该元素身上时候,发现子孙的输入框不能进行文本选中了,会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…...
‘Close Project‘ is not available while IDEA is updating indexes的解决
XXX is not available while IDEA is updating indexes IDEA 1.Remove from Recent Projects 2.重新 Open工程即可...
如何解决samba服务器共享文件夹不能粘贴文件
sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效: sudo service smbd restart...
Three.js入门-材质详解,构建视觉真实感的核心
Three.js 材质详解:构建视觉真实感的核心 Three.js 是一个强大的 3D JavaScript 库,它为开发者提供了丰富的工具来创建和渲染逼真的三维场景。在这些工具中,材质是一个非常重要的组成部分。材质定义了物体表面的外观特性,例如颜色…...
GitHub、Google等镜像加速地址收集
GitHub、Google等镜像加速地址收集 摘要 本文用于收集GitHub、Google等镜像/加速地址。 GitHub GitHub加速地址一览 fastgithub Https://www.fastgithub.com/(推荐) 站源地址缓存github.comwww.fastgithub.com无raw.githubusercontent.com无github.gi…...
五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
目录 一、导论 二、路由选择算法 2.1 路由(route)的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择(lin…...
Fix the “The repository no longer has a Release file” error on Ubuntu 23.04
背景信息 在Ubuntu 23.04操作系统上执行apt-get update命令更新操作系统时,得到以下错误 登录后复制 # apt-get update Ign:1 http://mirrors.aliyun.com/ubuntu lunar InRelease Ign:2 http://mirrors.aliyun.com/ubuntu lunar-updates InRelease Ign:3 http://mir…...
开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力
在当今竞争激烈的商业环境中,私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性,从多个维度为私域流量运营提供了强有力的支持与推动,以下将详细阐述其在各个方面的…...
Java Exception解决方法
Java中的Exception是所有异常的基类,它指的是程序在执行过程中发生的非严重错误,比如空指针异常、数组越界异常等。 为了解决Java中的Exception,从以下步骤进行排查解决: 阅读错误信息:查看异常的完整堆栈跟踪信息&a…...
HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由
网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…...
JeecgBoot passwordChange 任意用户密码重置漏洞复现
0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...