当前位置: 首页 > news >正文

PyTorch 中神经网络相关要点(损失函数,学习率)及优化方法总结

笔记

1 神经网络搭建和参数计算

1.1 构建神经网络模型

import torch
import torch.nn as nn  # 线性模型和初始化方法
​
​
# todo:1-创建类继承 nn.module类
class ModelDemo(nn.Module):# todo:2-定义__init__构造方法, 构建神经网络def __init__(self):# todo:2-1 调用父类的__init__方法super().__init__()# todo:2-2 创建隐藏层和输出层  定义属性# in_features: 输入特征数(上一层神经元个数)# out_features: 输出特征数(当前层神经元个数)self.linear1 = nn.Linear(in_features=3, out_features=3)self.linear2 = nn.Linear(in_features=3, out_features=2)self.output = nn.Linear(in_features=2, out_features=2)# todo:2-3 对隐藏层进行参数初始化# self.linear1.weight: 在类的内部调用对象属性nn.init.xavier_normal_(tensor=self.linear1.weight)nn.init.zeros_(tensor=self.linear1.bias)nn.init.kaiming_normal_(tensor=self.linear2.weight, nonlinearity='relu')nn.init.zeros_(tensor=self.linear2.bias)
​# todo:3-定义前向传播方法 forward(方法名固定) 得到预测y值def forward(self, x):  # x->输入样本的特征值# todo:3-1 第一层计算 加权求和值计算  激活值计算x = torch.sigmoid(input=self.linear1(x))# todo:3-2 第二层计算x = torch.relu(input=self.linear2(x))# todo:3-3 输出层计算  假设多分类问题# dim=-1: 按行计算, 一个样本一个样本算x = torch.softmax(input=self.output(x), dim=-1)# 返回预测值return x
​
​
if __name__ == '__main__':# 创建神经网络模型对象my_model = ModelDemo()

1.2 计算和查看模型参数

# 创建模型预测函数
def train():# todo:1-创建神经网络模型对象my_model = ModelDemo()print('my_model->', my_model)# todo:2-构造数据集样本, 随机生成data = torch.randn(size=(5, 3))print('data->', data)print('data.shape->', data.shape)# todo:3-调用神经网络模型对象进行模型训练output = my_model(data)print('output->', output)print('output.shape->', output.shape)# todo:4-计算和查看模型参数print(('====================计算和查看模型参数==================='))# input_size: 样本的特征数# batch_size: 批量训练的样本数# summary(model=my_model, input_size=(3,), batch_size=5)summary(model=my_model, input_size=(5, 3))for name, param in my_model.named_parameters():print('name->', name)print('param->', param)
​
​
if __name__ == '__main__':train()

2 损失函数

2.1 什么是损失函数

  • 衡量模型参数质量的函数(评估模型)

  • 对比模型预测值和真实值差异

  • 指导通过梯度下降法计算梯度, 进行参数更新 loss.backward()

2.2 分类任务损失函数

2.2.1 多分类任务损失函数
  • 适用于多分类问题

  • 计算出损失值后续结合梯度下降法和反向传播算法, 进行梯度更新

  • nn.CrossEntropyLoss()

# 适用于多分类
import torch
import torch.nn as nn
​
​
def dm01():# 手动创建样本的真实y值# y_true = torch.tensor(data=[[0, 1, 0], [1, 0, 0]], dtype=torch.float32)y_true = torch.tensor(data=[1, 2])print('y_true->', y_true.dtype)# 手动创建样本的预测y值 -> 模型预测值y_pred = torch.tensor(data=[[0.1, 0.8, 0.1], [0.7, 0.2, 0.1]], requires_grad=True, dtype=torch.float32)# 创建多分类交叉熵损失对象# reduction:损失值计算的方式, 默认mean 平均损失值criterion = nn.CrossEntropyLoss(reduction='sum')# 调用损失对象计算损失值# 预测y  真实yloss = criterion(y_pred, y_true)print('loss->', loss)
​
​
if __name__ == '__main__':dm01()
2.2.2 二分类任务损失函数
  • 适用于二分类问题

  • nn.BCEloss()

# 适用于二分类
import torch
import torch.nn as nn
​
​
def dm01():# 手动创建样本的真实y值y_true = torch.tensor(data=[0, 1, 0], dtype=torch.float32)print('y_true->', y_true.dtype)# 手动创建样本的预测y值 -> 模型预测值# 0.6901, 0.5459, 0.2469 -> sigmoid函数的激活值y_pred = torch.tensor(data=[0.6901, 0.5459, 0.2469], requires_grad=True, dtype=torch.float32)# 创建多分类交叉熵损失对象# reduction:损失值计算的方式, 默认mean 平均损失值criterion = nn.BCELoss()# 调用损失对象计算损失值# 预测y  真实yloss = criterion(y_pred, y_true)print('loss->', loss)print('loss->', loss.requires_grad)
​
​
if __name__ == '__main__':dm01()

2.3 回归任务损失函数

2.3.1 MAE回归损失函数
  • loss=(|y真实-y预测| + ...)/n

  • 导数为-1或1, 0点位置不可导

# 适用于回归任务
# MAE:导数为-1/1 0点位置不可导,一般取0作为导数
import torch
import torch.nn as nn
​
​
def dm01():# 手动创建样本的真实y值y_true = torch.tensor(data=[1.2, 1.5, 2.0], dtype=torch.float32)print('y_true->', y_true.dtype)# 手动创建样本的预测y值 -> 模型预测值# 0.6901, 0.5459, 0.2469 -> sigmoid函数的激活值y_pred = torch.tensor(data=[1.3, 1.7, 2.0], requires_grad=True, dtype=torch.float32)# 创建回归任务MAE损失对象# reduction:损失值计算的方式, 默认mean 平均损失值criterion = nn.L1Loss()# 调用损失对象计算损失值# 预测y  真实yloss = criterion(y_pred, y_true)print('loss->', loss)print('loss->', loss.requires_grad)
​
​
if __name__ == '__main__':dm01()
2.3.2 MSE损失函数
  • 数据集中有异常(噪声)样本, 影响结果, 误差放大, 容易产生梯度爆炸

  • 任意位置可导, 越接近底部, 导数越小, 符合梯度下降套路, 可以找到最小值

# 适用于回归任务, 如果数据集有异常样本, 放大误差, 有可能导致梯度爆炸
# MSE: 任意位置都可导, 越接近底部, 导数越小
import torch
import torch.nn as nn
​
​
def dm01():# 手动创建样本的真实y值y_true = torch.tensor(data=[1.2, 1.5, 2.0], dtype=torch.float32)print('y_true->', y_true.dtype)# 手动创建样本的预测y值 -> 模型预测值# 0.6901, 0.5459, 0.2469 -> sigmoid函数的激活值y_pred = torch.tensor(data=[1.3, 1.7, 2.0], requires_grad=True, dtype=torch.float32)# 创建回归任务MAE损失对象# reduction:损失值计算的方式, 默认mean 平均损失值criterion = nn.MSELoss()# 调用损失对象计算损失值# 预测y  真实yloss = criterion(y_pred, y_true)print('loss->', loss)print('loss->', loss.requires_grad)
​
​
if __name__ == '__main__':dm01()
2.3.3 Smooth L1损失函数
  • 中和MAE和MSE, w小于-1或w大于1使用MAE, w在[-1,1]范围内使用MSE

  • 不受异常值影响,不容易产生梯度爆炸,在任意位置可导,可以找到最小值

  • nn.SmoothL1()

# 适用于回归任务, 不受异常值影响
# smooth l1: 任意位置都可导, 越接近底部, 导数越小
import torch
import torch.nn as nn
​
​
def dm01():# 手动创建样本的真实y值y_true = torch.tensor(data=[1.2, 1.5, 2.0], dtype=torch.float32)print('y_true->', y_true.dtype)# 手动创建样本的预测y值 -> 模型预测值# 0.6901, 0.5459, 0.2469 -> sigmoid函数的激活值y_pred = torch.tensor(data=[1.3, 1.7, 2.0], requires_grad=True, dtype=torch.float32)# 创建回归任务smoothl1损失对象# reduction:损失值计算的方式, 默认mean 平均损失值criterion = nn.SmoothL1Loss()# 调用损失对象计算损失值# 预测y  真实yloss = criterion(y_pred, y_true)print('loss->', loss)print('loss->', loss.requires_grad)
​
​
if __name__ == '__main__':dm01()

3 神经网络优化方法

3.1 梯度下降算法回顾

  • W = W - lr * grad

  • 梯度下降算法是一种寻找最优网络参数的策略, 计算每次损失值对应的梯度, 进行参数更新

    • BGD, 使用全部样本计算梯度, 计算量大

    • SGD, 使用全部样本中随机一个样本计算梯度, 梯度可能不合理

    • Min-Batch, 使用一批样本计算梯度, 计算量相对小, 梯度更加合理

3.2 反向传播算法(BP算法)

  • 反向传播就是算当前损失值和参数的导数(梯度), 需要借助梯度连乘的方式

  • 结合梯度下降算法更新参数 W1 = W0 - LR * 梯度 -> W0和LR已知, 梯度根据BP算法计算出

3.3 梯度下降优化方法

避免遇到鞍点以及局部最小值情况

3.3.1 指数移动加权平均
  • S100 = 0.1*Y100 + 0.1*0.9*Y99 + 0.1*0.9*0.9*Y98 + ....

  • β值越大, 受当前时刻真实值越小, 一般0.9

3.3.2 动量算法Momentum
  • # 动量法计算梯度实际上计算的是当前时刻的指数移动加权平均梯度值
    import torch
    from torch import optim
    ​
    ​
    def dm01():# todo: 1-初始化权重参数w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)# 自定义损失函数, 实际工作中调用不同任务的损失函数, 交叉熵损失/MSE损失...loss = ((w ** 2) / 2.0).sum()# todo: 2-创建优化器函数对象 SGD->动量法# momentum: 动量法, 一般0.9或0.99optimizer = optim.SGD([w], lr=0.01, momentum=0.9)# todo: 3-计算梯度值optimizer.zero_grad()loss.sum().backward()# todo: 4-更新权重参数 梯度更新optimizer.step()print('w.grad->', w.grad)# 第二次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad)
    ​
    ​
    if __name__ == '__main__':dm01()
3.3.3 AdaGrad
  • 随着训练次数增加调整学习率, 开始学习率大, 后续学习率越来越小

    # adagrad优化方法调整学习率, 随着训练次数增加, 学习率越来越小, 一开始的学习率比较大
    import torch
    from torch import optim
    ​
    ​
    def dm01():# todo: 1-初始化权重参数w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# todo: 2-创建优化器函数对象 Adagradoptimizer = optim.Adagrad([w], lr=0.01)# todo: 3-计算梯度值optimizer.zero_grad()loss.sum().backward()# todo: 4-更新权重参数 梯度更新optimizer.step()print('w.grad->', w.grad, w)# 第二次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)# 第三次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)
    ​
    ​
    if __name__ == '__main__':dm01()
3.3.4 RMSProp
  • 对adagrap优化, 使用指数移动加权平均梯度代替累加梯度

    # rmsprop优化方法调整学习率, 对adagrad方法进行优化, 使用指数移动加权平均梯度代替历史累加梯度
    # 避免学习率过快减小, 导致后续模型收敛速度慢
    import torch
    from torch import optim
    ​
    ​
    def dm01():# todo: 1-初始化权重参数w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# todo: 2-创建优化器函数对象  RMSpropoptimizer = optim.RMSprop([w], lr=0.01, alpha=0.9)# todo: 3-计算梯度值optimizer.zero_grad()loss.sum().backward()# todo: 4-更新权重参数 梯度更新optimizer.step()print('w.grad->', w.grad, w)# 第二次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)# 第三次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)
    ​
    ​
    if __name__ == '__main__':dm01()
3.3.5 Adam
  • 修正梯度和学习率

    # adam既优化学习率又优化梯度  adam=rmsprop+momentum
    import torch
    from torch import optim
    ​
    ​
    def dm01():# todo: 1-初始化权重参数w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# todo: 2-创建优化器函数对象# betas: 两个β值, 接收元组类型optimizer = optim.Adam([w], lr=0.01, betas=(0.9, 0.99))# todo: 3-计算梯度值optimizer.zero_grad()loss.sum().backward()# todo: 4-更新权重参数 梯度更新optimizer.step()print('w.grad->', w.grad, w)# 第二次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)# 第三次计算loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('w.grad->', w.grad, w)
    ​
    ​
    if __name__ == '__main__':dm01()

3.3.6 如何选择梯度下降优化方法
  • SGD和momentum适用于简单任务或浅层神经网络模型

  • Adam适用于复杂任务或数据量大

  • AdaGrad和RMSprop适用于文本数据处理 nlp

4 学习率衰减优化方法

4.1 为什么进行学习率优化

  • 根据模型训练次数, 手动调整学习率, 使模型前期收敛速度快, 后期收敛速度慢

4.2 等间隔学习率衰减

# 等间隔: 指定训练次数后修改学习率  lr=lr*gamma
import torch
from torch import optim
import matplotlib.pyplot as plt
​
​
def dm01():# todo: 1-初始化参数# lr epoch iterationlr = 0.1epoch = 200iteration = 10# todo: 2-创建数据集# y_true x wy_true = torch.tensor([0])x = torch.tensor([1.0], dtype=torch.float32)w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)# todo: 3-创建优化器对象 动量法optimizer = optim.SGD(params=[w], lr=lr, momentum=0.9)# todo: 4-创建等间隔学习率衰减对象# optimizer: 优化器对象# step_size: 间隔, 指定训练次数后修改学习率# gamma: 衰减系数 默认0.1scheduer = optim.lr_scheduler.StepLR(optimizer=optimizer, step_size=50, gamma=0.5)# todo: 5-创建两个列表, 收集训练次数, 收集每次训练lrlr_list, epoch_list = [], []# todo: 6-循环遍历训练次数for i in range(epoch):# todo: 7-获取每次训练的次数和lr保存到列表中# scheduer.get_last_lr(): 获取最后lrlr_list.append(scheduer.get_last_lr())epoch_list.append(i)# todo: 8-循环遍历, batch计算for batch in range(iteration):# 先算预测y值 wx, 计算损失值 (wx-y_true)**2y_pred = w * xloss = (y_pred - y_true) ** 2# 梯度清零optimizer.zero_grad()# 梯度计算loss.backward()# 参数更新optimizer.step()# todo: 9-更新下一次训练的学习率scheduer.step()print('lr_list->', lr_list)
​plt.plot(epoch_list, lr_list)plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()
​
​
if __name__ == '__main__':dm01()

4.3 指定间隔学习率衰减

  • 前期模型训练设置比较多次数学习率更大, 中期设置相对少训练次数学习率小一些, 后期设置更少训练次数学习率更小一些

    # 指定间隔: 通过步长列表指定训练次数后修改学习率  lr=lr*gamma
    import torch
    from torch import optim
    import matplotlib.pyplot as plt
    ​
    ​
    def dm01():# todo: 1-初始化参数# lr epoch iterationlr = 0.1epoch = 200iteration = 10# todo: 2-创建数据集# y_true x wy_true = torch.tensor([0])x = torch.tensor([1.0], dtype=torch.float32)w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)# todo: 3-创建优化器对象 动量法optimizer = optim.SGD(params=[w], lr=lr, momentum=0.9)# todo: 4-创建等间隔学习率衰减对象# optimizer: 优化器对象# milestones: 指定间隔列表, 指定训练次数后修改学习率# gamma: 衰减系数 默认0.1scheduer = optim.lr_scheduler.MultiStepLR(optimizer=optimizer, milestones=[50, 100, 160], gamma=0.5, last_epoch=-1)# todo: 5-创建两个列表, 收集训练次数, 收集每次训练lrlr_list, epoch_list = [], []# todo: 6-循环遍历训练次数for i in range(epoch):# todo: 7-获取每次训练的次数和lr保存到列表中# scheduer.get_last_lr(): 获取最后lrlr_list.append(scheduer.get_last_lr())epoch_list.append(i)# todo: 8-循环遍历, batch计算for batch in range(iteration):# 先算预测y值 wx, 计算损失值 (wx-y_true)**2y_pred = w * xloss = (y_pred - y_true) ** 2# 梯度清零optimizer.zero_grad()# 梯度计算loss.backward()# 参数更新optimizer.step()# todo: 9-更新下一次训练的学习率scheduer.step()print('lr_list->', lr_list)
    ​plt.plot(epoch_list, lr_list)plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()
    ​
    ​
    if __name__ == '__main__':dm01()

4.4 按指数学习率衰减

  • 根据指数衰减, lr=$$lr * gamma^{epoch}$$

  • 更符合梯度下降规律, 前期下降快, 中期缓慢, 后期更慢

    # 指数间隔: 前期学习率衰减快, 中期慢, 后期更慢  lr=lr * gamma**epoch
    import torch
    from torch import optim
    import matplotlib.pyplot as plt
    ​
    ​
    def dm01():# todo: 1-初始化参数# lr epoch iterationlr = 0.1epoch = 200iteration = 10# todo: 2-创建数据集# y_true x wy_true = torch.tensor([0])x = torch.tensor([1.0], dtype=torch.float32)w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)# todo: 3-创建优化器对象 动量法optimizer = optim.SGD(params=[w], lr=lr, momentum=0.9)# todo: 4-创建等间隔学习率衰减对象# optimizer: 优化器对象# gamma: 衰减系数 设置大一些, 初始指数大scheduer = optim.lr_scheduler.ExponentialLR(optimizer=optimizer, gamma=0.9)# todo: 5-创建两个列表, 收集训练次数, 收集每次训练lrlr_list, epoch_list = [], []# todo: 6-循环遍历训练次数for i in range(epoch):# todo: 7-获取每次训练的次数和lr保存到列表中# scheduer.get_last_lr(): 获取最后lrlr_list.append(scheduer.get_last_lr())epoch_list.append(i)# todo: 8-循环遍历, batch计算for batch in range(iteration):# 先算预测y值 wx, 计算损失值 (wx-y_true)**2y_pred = w * xloss = (y_pred - y_true) ** 2# 梯度清零optimizer.zero_grad()# 梯度计算loss.backward()# 参数更新optimizer.step()# todo: 9-更新下一次训练的学习率scheduer.step()print('lr_list->', lr_list)
    ​plt.plot(epoch_list, lr_list)plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()
    ​
    ​
    if __name__ == '__main__':dm01()

4.5 如何选择学习率衰减方法

  • 优先选择指数学习率衰减方法

  • 根据经验设置间隔选择指定间隔学习率衰减方法

  • 简单模型选择等间隔学习率衰减方法

相关文章:

PyTorch 中神经网络相关要点(损失函数,学习率)及优化方法总结

笔记 1 神经网络搭建和参数计算 1.1 构建神经网络模型 import torch import torch.nn as nn # 线性模型和初始化方法 ​ ​ # todo:1-创建类继承 nn.module类 class ModelDemo(nn.Module):# todo:2-定义__init__构造方法, 构建神经网络def __init__(self):# todo:2-1 调用父…...

适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO

​一、软件介绍 文末提供程序和源码下载 该项目利用 Ultralytics 最先进的 YOLO11 模型将您的 iOS 设备转变为用于对象检测的强大实时推理工具。直接从 App Store 下载该应用程序,或浏览我们的指南,将 YOLO 功能集成到您自己的 Swift 应用程序中。 二、…...

why FPGA喜欢FMC子卡?

FMC 即 FPGA Mezzanine Card ( FPGA中间层板卡),由子板模块、载卡两构成。 FMC 载卡:为子板模块提供插槽,使用母座FMC连接器。载卡连接器引脚与具有可配置IO资源的芯片例如FPGA引脚通过PCB设计连接在一起。。 盘古100…...

【优选算法 | 字符串】字符串模拟题精选:思维+实现解析

算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表哈希表 在众多字符串算法题中,有一类题目看起来没有太多算法技巧,却经常让人“翻车”——那就是字符串模拟题。这类题型往往不依赖复杂的数据…...

比亚迪固态电池突破:王传福的技术哲学与产业重构|创客匠人热点评述

合肥某车间凌晨两点依然灯火通明,工程师正在调试的银白色设备,即将颠覆整个电动车行业 —— 比亚迪全固态电池产线的曝光,标志着中国新能源汽车产业正式迈入 “技术定义市场” 的新纪元。 一、技术突破的底层逻辑 比亚迪全固态电池的核心竞…...

UUG杭州站 | 团结引擎1.5.0 OpenHarmony新Feature介绍

PPT下载地址:https://u3d.sharepoint.cn/:b:/s/UnityChinaResources/EaZmiWfAAdFFmuyd6c-7_3ABhvZoaM69g4Uo2RrSzT3tZQ?e2h7RaL 在2025年4月12日的Unity User Group杭州站中,Unity中国OpenHarmony技术负责人刘伟贤带来演讲《团结引擎1.5.0 OpenHarmony新…...

OpenHarmony轻量系统--BearPi-Nano开发板网络程序测试

本文介绍RISC-V架构海思Hi3861开发板,通过Linux开发环境运行OpenHarmony轻量化系统,下载测试网络例程的过程与步骤。 OpenHarmony操作系统分类 轻量系统(mini system) 面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备&#x…...

k8s 中使用 Service 访问时NetworkPolicy不生效问题排查

背景 针对一个服务如下NetworkPolicy, 表示只有n9e命名空间的POD才能访问 k8s-man 服务 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata:name: k8s-mannamespace: n9elabels:app: k8s-manversion: v1 spec:podSelector:matchLabels:app: k8s-manversion: v1…...

2025 AI如何重构网络安全产品

威胁检测与防御 利用机器学习算法提升威胁检测能力 :AI能够分析大量的网络数据和行为模式,通过机器学习算法自动识别出潜在的威胁和异常行为。例如,Darktrace的Cyber AI Analyst基于真实SOC数据训练,可推进威胁调查,提…...

ARM杂谈——临界段保护恢复的中断状态可靠吗

0 前言 在MCU中,临界段保护是指在多任务或多线程环境中,确保某段代码在执行时不会被其他任务或中断打断,从而避免数据竞争或不一致的问题。临界段保护通常用于共享资源的访问,如全局变量、硬件寄存器等。 我们有一些常用的临界段…...

数据库MySQL学习——day10()

文章目录 1. 什么是子查询(Subquery)?2. 创建样例表:商品表 products3. 插入示例数据4. 子查询的三种常用位置4.1 子查询在 WHERE 子句中(最常见)4.2 子查询在 FROM 子句中(可以当成临时表&…...

YashanDB V23.4 LTS 正式发布|两地三中心、库级闪回重磅特性上线,生产级可用性再升级

近日,YashanDB V23.4 LTS(Long-Term Support Release)版本正式发布,新版本深度契合关键行业数字化转型对数据库“业务永续、风险可控”的核心诉求,打造两地三中心秒级容灾、库级闪回秒级恢复、MySQL全面兼容等重磅特性…...

AI规则引擎:解锁SQL数据分析新姿势

一、AI 规则引擎与 SQL 的奇妙邂逅 在当今数字化时代,数据如同石油,是企业发展和创新的核心驱动力。而如何从海量的数据中提取有价值的信息,成为了企业面临的关键挑战。人工智能规则引擎和 SQL,作为数据分析领域的两大重要工具&a…...

Kotlin Multiplatform与Flutter、Compose共存:构建高效跨平台应用的完整指南

简介 在移动开发领域,跨平台技术正在重塑开发范式。Kotlin Multiplatform (KMP) 作为 JetBrains 推出的多平台开发框架,结合了 Kotlin 的简洁性与原生性能优势,使开发者能够高效共享业务逻辑。而 Flutter 凭借其高性能渲染引擎(Skia)和丰富的组件库,成为混合开发的首选方…...

FunASR:语音识别与合成一体化,企业级开发实战详解

简介 FunASR是由阿里巴巴达摩院开源的高性能语音识别工具包,它不仅提供语音识别(ASR)功能,还集成了语音端点检测(VAD)、标点恢复、说话人分离等工业级模块,形成了完整的语音处理解决方案。 FunASR支持离线和实时两种模式,能够高效处理多语言音频,并提供高精度的识别结果。…...

【Spark分析HBase数据】Spark读取并分析HBase数据

Spark读取并分析HBase数据 一、摘要二、实现过程三、小结 一、摘要 Apache Spark 是一个快速、通用的大数据处理引擎,提供了丰富的 API 用于数据处理和分析。HBase 是一个分布式、可扩展的 NoSQL 数据库,适合存储海量结构化和半结构化数据。Spark 与 HB…...

探索直播美颜SDK的核心算法:图像增强与AI美颜技术详解

一款优秀的直播美颜SDK不仅能让主播拥有完美的在线形象,还能帮助平台吸引更多用户。然而,这背后的关键在于其核心算法——从基本的图像增强到前沿的AI美颜技术,每一步都至关重要。今天,我们就来深入探讨这些技术背后的秘密。 一、…...

全新linux网络配置工具nmcli:

1.Linux全新网络管理工具nmcli的使用 ,网络管理命令行工具nmcli 在nmcli中有2个命令最为常用: (1)nmcli connection 表示连接,可理解为配置文件,相当于ifcfg-ethX。可以简写为nmcli c (2)nmcl…...

LeetCode100.5 盛最多水的容器

对于这题,首先明确的是:盛水的体积取决于两垂线间的距离与两垂线中最短的长度。 那么使用双指针,在每次移动时,只移动其中最短的那个,因为若移动最长的那个,体积不会变大。 class Solution { public:int …...

AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)

目录 背景一、AI工业化时代的算力困局与破局之道1.1 中小企业AI落地的三大障碍1.2 GpuGeek的破局创新1.3 核心价值 二、GpuGeek技术全景剖析2.1 核心架构设计 三、核心优势详解‌3.1 优势1:工业级显卡舰队‌‌‌3.2 优势2:开箱即用生态‌3.2.1 预置镜像库…...

Java元注解

Java 元注解(Meta-Annotations) 元注解是指用于注解其他注解的注解,Java 提供了5个内置的元注解: 1. Target 指定注解可以应用的目标元素类型。 Target(ElementType.TYPE) // 只能用于类、接口或枚举 public interface MyAnno…...

FPGA:Xilinx Kintex 7实现DDR3 SDRAM读写

在Xilinx Kintex 7系列FPGA上实现对DDR3 SDRAM的读写,主要依赖Xilinx提供的Memory Interface Generator (MIG) IP核,结合Vivado设计流程。以下是详细步骤和关键点: 1. 准备工作 硬件需求: Kintex-7 FPGA(如XC7K325T&…...

深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察

深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察 前言 GpuGeek专注于人工智能与高性能计算领域的云计算平台,致力于为开发者、科研机构及企业提供灵活、高效、低成本的GPU算力资源。平台通过整合全球分布式数据中心资源&#…...

散列表(1)

散列表概念 键通过散列函数后转换为数组的下标,在对应的下标位置上存储相应的信息 键------>散列函数-------->数组下标------->存储信息 散列函数 散列函数就是一个函数,能够将给定的key转换为特定散列值。hashValuehash(key&…...

E. 23 Kingdom【Codeforces Round 1024 (Div. 2)】

E. 23 Kingdom 思路: 这道题的核心在于如何构造一个数组b,使得每个数的最远两个出现位置之差总和最大。通过分析,我们发现要最大化总美丽值,应尽可能让每个数的首次出现尽可能靠左、末次出现尽可能靠右。这样每个数的距离贡献j-i…...

TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动

🔄 本文是TTS-Web-Vue系列的最新文章,重点介绍如何在Vue3项目中实现侧边栏与顶部导航栏的双向联动功能。通过Vue3的响应式系统和组件通信机制,我们构建了一套高效、流畅的导航联动方案,让用户在不同入口都能获得一致的导航体验。 …...

【C++】模板(初阶)

一、模板与泛型编程 我们先来思考一下:如何实现一个通用的交换函数? void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp left;left right;right te…...

大模型微调实战:基于GpuGeek平台的低成本高效训练方案

文章目录 引言一、GpuGeek平台使用入门1. 注册与账号设置2. 控制台功能概览3. 快速创建GPU实例3. 预置镜像与自定义环境 二、GpuGeek平台核心优势解析1. 显卡资源充足:多卡并行加速训练2. 镜像超多:开箱即用的开发环境3. 计费灵活:按需付费降…...

黑马k8s(六)

1.Deployment(Pod控制器) Selector runnginx 标签选择:会找pod打的标签 执行删除之后,pod也会删除,Terminating正在删除 如果想要访问其中的一个pod借助:IP地址端口号访问 假设在某一个瞬间,…...

WEB安全--Java安全--CC1利用链

一、梳理基本逻辑 WEB后端JVM通过readObject()的反序列化方式接收用户输入的数据 用户编写恶意代码并将其序列化为原始数据流 WEB后端JVM接收到序列化后恶意的原始数据并进行反序列化 当调用: ObjectInputStream.readObject() JVM 内部逻辑: → 反…...

16S18S_OTU分析(3)

OTU的定义 OTU:操作分类单元是在系统发生学研究或群体遗传学研究中,为了便于进行分析,人为给某一个分类单元(如品系、种、属、分组等)设置的同一标志。目的:OTU用于将相似的序列归为一类,以便于…...

嵌入式开发学习日志(数据结构--单链表)Day20

一、gdb调试 (一)一般调试步骤与命令 1、gcc -g (调试版本,内含调试信息与源码;eg:gcc -g main.c linklist.c) 2、gdb a.out(调试可执行文件,eg:gdb …...

nginx报错-[emerg] getpwnam(“nginx“) failed in /etc/nginx/nginx.conf:2

报错 - nginx: [emerg] getpwnam(“nginx”) failed in /etc/nginx/nginx.conf:2 问题描述: nginx: [emerg] getpwnam(“nginx”) failed in /etc/nginx/nginx.conf:2 问题原因: 是因为配制文件中使用的启动账户在系统中并没有找到 解决方法&#x…...

Linux系统编程——fork函数的使用方法

在 Linux 系统编程 中,fork() 函数是创建新进程的关键系统调用。fork() 在当前进程(父进程)中创建一个几乎完全相同的子进程。子进程和父进程从调用 fork() 的位置继续执行,但它们是两个独立的进程,每个进程都有自己的…...

Linux进程信号处理(26)

文章目录 前言一、信号的处理时机处理情况“合适”的时机 二、用户态与内核态概念重谈进程地址空间信号的处理过程 三、信号的捕捉内核如何实现信号的捕捉?sigaction 四、信号部分小结五、可重入函数六、volatile七、SIGCHLD 信号总结 前言 这篇就是我们关于信号的最…...

黑马Java跟学.最新AI+若依框架项目开发(一)

黑马Java跟学.最新AI若依框架项目开发.一 前瞻为什么学习若依?AI局限性若依是什么?创新项目开发新方案课程安排前置知识 一、若依搭建若依版本官方非官方 RuoYi-Vue运行后端项目初始化项目Git下载Maven构建 MySQL相关导入sql配置信息 Redis相关启动配置信息 项目运…...

【自学30天掌握AI开发】第1天 - 人工智能与大语言模型基础

自学30天掌握AI开发 - 第1天 📆 日期和主题 日期:第1天 主题:人工智能与大语言模型基础 🎯 学习目标 了解人工智能的发展历史和基本概念掌握大语言模型的基本原理和工作机制区分不同类型的AI模型及其特点理解AI在当前社会中的…...

(十六)Java String类全面解析

一、String类概述 1.1 String的本质 在Java中,String类可能是使用最频繁的类之一,但它也是最容易被误解的类之一。从本质上讲,String代表的是一个不可变的Unicode字符序列。这种不可变性(immutability)是String类设计的核心特性。 java S…...

Android架构之自定义native进程

在Android五层架构中,native层基本上全是c的世界,这些c进程基本上靠android世界的第一个进程init进程创建,init通过rc配置文件,创建了众多的c子进程,也是这众多的c进程,构建了整个android世界的native层。 …...

#跟着若城学鸿蒙# HarmonyOS NEXT学习之AlphabetIndexer组件详解

一、组件介绍 AlphabetIndexer(字母索引条)是HarmonyOS NEXT中一个非常实用的UI组件,它主要用于在列表视图中提供快速的字母导航功能。当应用中有大量按字母顺序排列的数据(如联系人列表、城市列表等)时,A…...

React百日学习计划——Deepseek版

阶段一:基础巩固(1-20天) 目标:掌握HTML/CSS/JavaScript核心语法和开发环境搭建。 每日学习内容: HTML/CSS(1-10天) 标签语义化、盒模型、Flex布局、Grid布局、响应式设计(媒体查询…...

Room持久化库:从零到一的全面解析与实战

简介 在Android开发中,Room作为官方推荐的数据库持久化库,提供了对SQLite的抽象层,使得数据库操作更加安全、高效且易于维护。 Room通过注解处理器和编译时验证,显著降低了数据库操作的复杂度,同时支持响应式编程模式,使开发者能够轻松实现数据变化的实时监听。对于企业…...

Linux云计算训练营笔记day07(MySQL数据库)

数据库 DataBase 保存数据的仓库 数据库管理系统 DBMS 这是一个可以独立运行,用于维护磁盘上的数据的一套软件 特点: 维护性高,灵活度高,效率高,可扩展性强 常见的DBMS Mysql Mariadb Oracle DB2 SQLServer MySQL是一个关系型…...

C语言之旅5---分支与循环【2】

💫只有认知的突破💫才来带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫 🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己&#x…...

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考:K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…...

【Web应用】Vue 项目前端项目文件夹和文件介绍

文章目录 ⭐前言⭐一、文件夹介绍🌟1、.idea🌟2、bin🌟3、build🌟4、node_modules🌟5、public🌟6、src ⭐二、文件介绍🌟1、.editorconfig🌟2、.env.development、.env.production、…...

Leetcode 3544. Subtree Inversion Sum

Leetcode 3544. Subtree Inversion Sum 1. 解题思路2. 代码实现 题目链接:3544. Subtree Inversion Sum 1. 解题思路 这一题我的思路上就是一个动态规划的思路,因为原则上我们只需要遍历一下所有的状态即可,但是这样显然时间复杂度过高&am…...

分别在windows和linux上使用curl,有啥区别?

作为开发者常用的网络工具,curl 在 Windows 和 Linux 上的使用看似相似,但实际存在不少细节差异。以下从 命令语法、环境特性、功能支持 和 开发体验 四个角度展开对比,帮助读者避免跨平台开发时的常见“坑”。 一、命令语法差异:…...

微服务八股(自用)

微服务 SpringCloud 注册中心:Eureka 负载均衡:Ribbon 远程调用:Feign 服务熔断:Hystrix 网关:Gateway/Zuul Alibaba 配置中心:Nacos 负载均衡:Ribbon 服务调用:Feign 服务…...

TCP首部格式及三次握手四次挥手

TCP协议详解:首部格式与连接管理 一、TCP首部格式 TCP首部最小20字节,最大60字节,包含以下字段: | 源端口号(16bit) | 目的端口号(16bit) | | 序列号(32bit) | | 确认号(32bit) | | 数据偏移(4bit)| 保留(6bit) |U|A|P|R|S|…...