一、深度学习框架对比

  1. 核心框架对比

    • PyTorch:支持GPU加速,底层基于NumPy,Meta(原Facebook)开发,生态完善(如Llama大模型)。
    • TensorFlow:谷歌开发,存在2个不兼容版本(1.x/2.x),需注意版本选择。
    • Keras:中小型企业常用,已逐渐被取代。
    • 其他框架:如ONNX、MXNet等,但PyTorch因生态优势成为主流。
  2. 框架选择建议

    • 优先学习PyTorch,因其兼容性强、文档丰富,且与最新大模型(如Llama)深度整合。

二、PyTorch安装要点

  1. 安装方式选择

    • 避免使用pip在线安装:易因网络中断导致失败,推荐从官网下载预编译的.whl文件离线安装。
    • 步骤
      1. 检查CUDA版本(nvidia-smi命令)(当前英伟达驱动支持的最高cuda版本是12.8)
      2. 根据CUDA版本和Python版本选择对应的PyTorch版本。
      3. 下载并安装pytorchtorchvision库(含数据集工具)。
  2. CUDA与显卡驱动

    • CUDA版本需与显卡驱动匹配,例如驱动支持CUDA 12.7时,可安装更高版本的PyTorch(显卡驱动>CUDA>PyTorch)。
    • 英伟达显卡兼容性最佳,但需注意国内生态差异(如华为显卡需虚拟层模拟CUDA指令集)。

三、GPU与CPU性能差异

  1. GPU优势

    • 专为矩阵运算设计,单卡可并行处理多张图片(如batch size=32)。
    • 显存容量决定单次处理数据量(6GB/8GB/48GB等)。
  2. 硬件选择建议

    • 开发阶段:优先使用英伟达显卡,避免兼容性问题。
    • 国产替代:国企项目需使用国产显卡(如中科曙光、紫光),但需额外封装层适配CUDA指令。

四、项目案例:pytorch框架认识-手写数字识别

# 环境验证模块
import torch
print(torch.__version__)  # 验证PyTorch版本(示例输出:1.X)'''
MNIST数据集说明:
- 包含70,000张28x28灰度手写数字图像(60,000训练 + 10,000测试)
- 图像已居中处理,减少预处理需求
'''
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor# 训练数据集配置
training_data = datasets.MNIST(root="data",          # 数据集存储根目录train=True,           # 加载训练集download=True,        # 自动下载数据集transform=ToTensor()  # 图像转换为张量格式(PyTorch原生支持)
)# 测试数据集配置
test_data = datasets.MNIST(root="data",train=False,         # 加载测试集download=True,transform=ToTensor()
)# 打印训练集大小(应为60,000)
print(len(training_data))

模块总结
本模块完成开发环境验证和数据集准备:

  1. 验证PyTorch安装版本
  2. 数据准备:通过 datasets 加载标准数据集(如 datasets.MNIST(...)
  3. 数据预处理:使用 ToTensor 将图像转换为张量
  4. 数据加载:通过 DataLoader 将数据集分批次加载,支持训练时的高效迭代
  5. 模型构建:通过 nn 模块定义网络结构(如全连接层、卷积层)
  6. 使用datasets.MNIST加载MNIST数据集(MNIST(Modified National Institute of Standards and Technology)数据集是手写数字识别领域最著名的标准数据集)
  7. ToTensor转换将PIL图像转为张量格式
  8. 分离训练/测试集并自动下载数据
  9. 验证训练集样本数量(应为60,000)
# 数据加载模块
train_dataloader = DataLoader(training_data, batch_size=64)  # 训练集数据加载器
test_dataloader = DataLoader(test_data, batch_size=64)      # 测试集数据加载器# 测试批次数据形状验证
for X, y in test_dataloader:print(f"Shape of X [N, C, H, W]: {X.shape}")  # 输出:[64, 1, 28, 28]print(f"Shape of y: {y.shape} {y.dtype}")     # 输出:torch.Size([64]) torch.longbreak

模块总结
本模块实现数据加载与预处理:

  1. 使用DataLoader创建批次数据加载器(batch_size=64)(batch size是指每次训练模型时使用的样本数量)
  2. 验证数据格式:X为[batch_size, channels, height, width]的张量
  3. y为对应的标签张量(one-hot编码形式)
  4. 通过循环验证首个批次数据形状
# 设备检测模块
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device")  # 根据硬件自动选择最佳设备(CUDA/MPS/CPU)

模块总结
本模块实现设备适配:

  1. 优先检测CUDA可用性(NVIDIA显卡)
  2. 其次检测Apple MPS(苹果芯片专用)
  3. 最后回退到CPU执行
  4. 输出当前使用的设备类型
# 神经网络定义模块
class NeuralNetwork(nn.Module):def __init__(self):super().__init__()  # 调用父类初始化self.flatten = nn.Flatten()  # 展平操作(28*28→1维向量)self.hidden1 = nn.Linear(28*28, 128)  # 第一隐藏层(输入→隐藏神经元数)self.hidden2 = nn.Linear(128, 256)    # 第二隐藏层(隐藏→隐藏神经元数)self.out = nn.Linear(256, 10)         # 输出层(隐藏→10类别)def forward(self, x):  # 前向传播定义数据流路径x = self.flatten(x)               # 展平操作x = torch.relu(self.hidden1(x))   # 第一隐藏层+ReLU激活x = torch.relu(self.hidden2(x))   # 第二隐藏层+ReLU激活x = self.out(x)                   # 输出层(未激活)return x

模块总结
本模块定义神经网络架构:

  1. 继承nn.Module基类实现标准网络结构
  2. 包含三层全连接层:
    • Flatten层将28x28图像展平为784维向量
    • 隐藏层采用ReLU激活函数加速收敛
    • 输出层直接输出10维向量(对应0-9数字分类)
  3. forward方法严格定义数据流动路径
# 训练流程模块
def train(dataloader, model, loss_fn, optimizer):model.train()  # 启用训练模式(允许参数更新)batch_size_num = 1  # 批次计数器for X, y in dataloader:X, y = X.to(device), y.to(device)  # 数据移动到设备(CPU/GPU)pred = model(X)                     # 前向传播计算预测值loss = loss_fn(pred, y)             # 计算交叉熵损失optimizer.zero_grad()                # 清零梯度(关键步骤!)loss.backward()                     # 反向传播计算梯度optimizer.step()                    # 用梯度更新参数# 每100批次打印一次损失值if batch_size_num % 100 == 0:print(f"loss: {loss.item():>7f}  [number:{batch_size_num}]")batch_size_num += 1

模块总结
本模块实现完整训练流程:

  1. model.train()启用参数更新模式
  2. 每批次执行以下步骤:
    • 数据设备转移(CPU/GPU统一)
    • 前向传播获取预测值
    • 计算交叉熵损失
    • 梯度清零→反向传播→参数更新(SGD流程)
  3. 使用学习率0.005的Adam优化器(默认配置)
  4. 每100批次打印一次损失值监控训练进度
# 测试评估模块
def test(dataloader, model, loss_fn):size = len(dataloader.dataset)     # 总样本数(10,000)num_batches = len(dataloader)      # 批次总数(约156)model.eval()                       # 切换为评估模式(禁用Dropout等随机操作)correct = 0                        # 正确预测计数器total_loss = 0                     # 累计损失值with torch.no_grad():             # 上下文管理器禁用梯度计算for X, y in dataloader:X, y = X.to(device), y.to(device)pred = model(X)            # 前向传播获取预测值total_loss += loss_fn(pred, y).item()  # 累加损失correct += (pred.argmax(1) == y).sum().item()  # 统计正确预测数avg_loss = total_loss / num_batches  # 计算平均损失accuracy = (correct / size) * 100   # 计算准确率百分比print(f"Test result: \n Accuracy: {accuracy:.2f}%, Avg loss: {avg_loss:.4f}")

模块总结
本模块实现模型评估:

  1. model.eval()启用评估模式(稳定模型行为)
  2. 使用torch.no_grad()节省内存开销
  3. 计算两个核心指标:
    • 平均损失值(衡量模型拟合程度)
    • 准确率(模型在测试集上的表现)
  4. 使用argmax获取预测类别索引进行对比
  5. 最终输出格式化的评估结果(保留两位小数)
# 主程序执行模块(完整训练流程)
epochs = 10  # 训练轮数(可根据实际效果调整)
optimizer = torch.optim.Adam(model.parameters(), lr=0.005)  # Adam优化器配置
loss_fn = nn.CrossEntropyLoss()                             # 多分类交叉熵损失函数for t in range(epochs):                                       # 训练循环控制print(f"Epoch {t+1}\n-------------------------------")      # 打印训练进度提示train(train_dataloader, model, loss_fn, optimizer)        # 执行单轮训练
print("Done!")                                               # 训练结束标记
test(test_dataloader, model, loss_fn)                        # 最终测试评估

五、数据集处理与预处理

  1. PyTorch内置工具

    • torchvision.datasets可直接下载MNIST等标准数据集(训练集+测试集)。
    • DataLoader自动打包数据到GPU,减少IO耗时。
  2. 数据格式转换

    • OpenCV读取的图片为NumPy数组(CPU格式),需转为tensor类型以适配GPU计算。
    • to_tensor()方法实现数据类型转换。

六、环境配置与工具安装

  1. 软件安装

    • 使用pip install torch进行PyTorch安装,支持GPU加速需配合CUDA驱动。
    • 本地安装包下载与验证:通过官网下载大文件安装包,避免在线安装耗时。
    • 检查安装路径:运行
      import torch; 
      print(torch.__version__)
      确认版本。
  2. 计算设备选择

    • 通过torch.cuda.is_available()检测GPU支持性,自动分配设备:
      device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
      

七、数据处理与加载

  1. 数据集导入与预处理

    • 使用torchvision.datasets加载MNIST手写数字数据集,包含训练集(6万张)和测试集(1万张)。
    • 数据维度调整:将原始图像(28×28)展平为一维向量(28×28=784),并添加批次维度:
      x = x.view(x.size(0), -1)  # 展平为 [batch, 784]
      

  2. 数据打包与批处理

    • 使用DataLoader将数据集切分为小批量(batch size=64),提升训练效率:
      train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
      
    • 每次迭代提取64张图片及其标签,形成输入张量(形状:[64, 784])和标签张量(形状:[64])

八、模型设计与构建

  1. 网络架构

    • 继承nn.Module基类,定义多层全连接(Linear)结构:
      class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.flatten = nn.Flatten()self.fc1 = nn.Linear(784, 128)  # 输入层→隐藏层1(128神经元)self.fc2 = nn.Linear(128, 256)  # 隐藏层1→隐藏层2(256神经元)self.fc3 = nn.Linear(256, 10)   # 隐藏层2→输出层(10类别)def forward(self, x):x = self.flatten(x)x = F.relu(self.fc1(x))      # 隐藏层1激活(ReLU)x = F.relu(self.fc2(x))      # 隐藏层2激活(ReLU)x = self.fc3(x)              # 输出层无激活(线性输出)return x
      
  2. 前向传播逻辑

    • forward方法定义数据流向:输入→展平→隐藏层1→激活→隐藏层2→激活→输出层。
    • 注意:输出层不应用激活函数,直接输出线性结果以匹配多分类概率分布。

九、训练与优化

  1. 损失函数

    • 多分类任务采用交叉熵损失(CrossEntropyLoss):
      criterion = nn.CrossEntropyLoss()
      
  2. 优化器与参数更新

    • 使用SGD优化器调整模型权重:
      optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
      
  3. 训练循环

    • 遍历数据集,计算损失并反向传播更新参数:
      model.train()
      for inputs, labels in train_loader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
      

十、关键细节与注意事项

  1. 张量维度解析

    • 输入张量形状:[batch_size, channels, height, width] → 展平后为 [batch_size, 784]。
    • 输出张量形状:[batch_size, num_classes]。
  2. 设备管理

    • 将模型和数据移动至同一设备(CPU/GPU):
      model = model.to(device)
      inputs = inputs.to(device)
      
  3. 激活函数作用域

    • 仅在隐藏层应用ReLU激活,输出层保留线性输出以生成类别概率。

十一、常见问题与调试

  • 梯度消失问题:通过合理设置学习率(如0.01)和激活函数缓解。
  • 设备冲突:确保模型与数据在同一设备上运行,避免类型错误。
  • 批次大小调整:根据GPU内存动态调整batch size以平衡速度与稳定性。

十二、神经网络架构设计

  1. 类继承机制

    • 继承nn.Module基类实现模型定义,需重写__init__初始化网络层结构,并在forward方法中定义前向传播逻辑
    • 示例:class MyModel(nn.Module): def __init__(self): super().__init__(); self.fc1 = nn.Linear(...)
  2. 网络层配置

    • 定义各层神经元数量及连接关系(如全连接层nn.Linear),通过forward自动管理数据流动
    • 激活函数(如nn.Sigmoid)可直接嵌入前向传播流程,或封装为独立模块(如nn.ReLU

十三、损失函数选择与应用

  1. 常用损失函数

    • 交叉熵损失(nn.CrossEntropyLoss):适用于分类任务,结合Softmax与NLLLoss
    • 其他类型:二元交叉熵(BCELoss)、均方误差(MSELoss)、绝对误差(L1Loss
    • 扩展能力:通过源码查找特定损失函数(如高斯损失)
  2. 损失计算流程

    • 前向传播输出预测结果predict与真实标签y传入损失函数,得到标量损失值

十四、优化器配置与参数更新

  1. 优化器选择

    • 使用torch.optim.SGD实现随机梯度下降(SGD),需传递两个参数:
      • 模型参数(model.parameters()
      • 学习率(控制参数更新步长)
  2. 训练与测试模式

    • model.train()启用参数可更新状态
    • model.eval()冻结参数(防止意外修改),常用于推理阶段
  3. 梯度更新流程

    • optimizer.zero_grad()清空历史梯度
    • loss.backward()反向传播计算梯度
    • optimizer.step()根据梯度更新参数

十五、训练过程实现

  1. 数据加载与批次处理

    • 使用DataLoader打包数据集,设置batch_size=64控制每批次数据量
    • 循环遍历DataLoader提取批次数据,执行前向传播与损失计算
  2. 设备分配与并行计算

    • 通过x.to(device)将数据/模型移动至GPU(如device = torch.device("cuda:0")
    • 多GPU支持:通过修改device属性指定GPU索引(如device="cuda:1"
  3. 训练监控

    • 每批次记录损失值(loss.item()转换Tensor为Python浮点数)
    • 每100批次打印训练进度,观察损失是否稳定下降以判断模型收敛性

十六、前向传播细节

  1. 数据维度变换

    • 输入图片(28x28)展平为784维向量(nn.Flatten()
    • 全连接层输出维度动态计算:如输入64x784经128神经元层后输出64x128
  2. 非线性映射

    • 激活函数(如ReLU)仅修改数值范围(如负数转为0),不改变数据维度

十七、关键代码片段

 1. 神经网络模型搭建
  • 继承nn.Module类:所有自定义神经网络需继承PyTorch的nn.Module基类,实现__init__forward方法
    class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.flatten = nn.Flatten()self.fc1 = nn.Linear(784, 128)self.sigmoid = nn.Sigmoid()self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.flatten(x)x = self.fc1(x)x = self.sigmoid(x)x = self.fc2(x)return x
    

  • 层初始化:定义每层的神经元数量(如nn.Linear(784, 128))和激活函数(如nn.Sigmoid()
  • 前向传播流程:数据依次经过展平(Flatten)、全连接层(FC)和激活函数,最终输出预测结果
2. 损失函数与优化器
  • 交叉熵损失函数:适用于多分类任务,结合LogSoftmax和NLLLoss
    criterion = nn.CrossEntropyLoss()
    outputs = model(inputs)  # (batch_size, num_classes)
    loss = criterion(outputs, labels)  # labels为整数张量
    
  • 优化器配置:使用SGD优化器,设置学习率
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    
  • 参数更新步骤:清零梯度→反向传播→更新参数
    optimizer.zero_grad()  # 清零梯度
    loss.backward()        # 反向传播计算梯度
    optimizer.step()       # 根据梯度更新参数
    
3. 训练循环与数据加载
  • 批量处理:使用DataLoader按批次加载数据,提升训练效率
    train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
    
  • 训练循环逻辑
    • 数据与模型移动至同一设备(CPU/GPU)
    • 执行前向传播计算预测值
    • 计算损失并反向传播更新参数
    • 定期打印损失值监控收敛情况
      for inputs, labels in train_loader:inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Loss: {loss.item()}, Batch: {batch_idx}')
      
  • 模型模式切换:训练时启用model.train()允许参数更新,评估时用model.eval()冻结参数
4. 关键概念解析
  • 前向传播:数据从输入层到输出层的计算过程,不涉及梯度更新
  • 反向传播:根据损失函数计算梯度,用于优化参数
  • 批量大小(Batch Size):控制每次训练的样本数,影响收敛速度和内存占用
  • 设备管理:确保数据与模型在同一计算设备(如GPU)上运行,避免跨设备通信开销
5. 调试与验证
  • 损失值监控:打印每个批次的损失值,观察是否逐渐降低(模型收敛的标志)
  • 梯度清零:每次迭代前调用optimizer.zero_grad(),防止梯度累积错误
  • 动态维度调整:理解输入数据维度变化(如64×28×28展平为64×784

 十八、训练过程

  1. 并行批量训练机制

    • 一次性输入64个批次数据,创建64个独立神经网络并行训练。
    • 所有网络共享参数(Ω),更新时计算64个批次的平均损失,统一更新全局参数。
  2. 梯度更新策略

    • 使用torch.no_grad()上下文管理器清理反向传播产生的临时数据,优化内存利用。
  3. 多轮训练重要性

    • 单轮训练(6万张图片)仅能获得19.22%正确率,需通过循环训练集(如10轮)提升模型收敛性。
    • model.train()模式确保参数持续更新,避免重复初始化。

十九、测试过程

  1. 测试集评估逻辑

    • 输入测试数据后,前向传播得到预测结果,通过argmax提取最大概率对应的类别。
    • 统计预测正确的数量,计算正确率(Correct / Total Test Samples)。
  2. 损失值与正确率的关系

    • 测试阶段仍会计算损失值,但非核心指标;正确率(如70.04%)为模型性能的关键衡量标准。
  3. 资源管理优化

    • 使用with torch.no_grad()减少冗余计算,提升测试效率。

二十、关键实现细节

  1. 数据预处理

    • 测试数据需明确设备(GPU/CPU),通过to(device)确保设备一致性。
  2. 预测结果处理

    • 将预测概率转换为类别标签,对比真实标签统计正确率。
  3. 训练效率优化

    • 设置打印间隔(如每100批次输出一次损失值),平衡调试需求与训练速度。

二十一、实践要点

  • 超参数调整:通过增加训练轮数(如从10轮扩展至50轮)可显著提升模型性能。
  • 验证集作用:测试集主要用于评估最终模型效果,而非实时调参。
  • 竞赛策略:合理分配训练时间,确保比赛前完成高效模型迭代。

二十二、关键代码片段

1. 批量梯度下降训练核心代码

# 初始化模型参数 Ω
model = MyNeuralNetwork().to(device)  # device为'cuda'或'cpu'
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = torch.nn.CrossEntropyLoss()  # 分类任务损失函数# 训练循环
for epoch in range(num_epochs):for batch_idx, (inputs, labels) in enumerate(train_loader):# 前向传播outputs = model(inputs)loss = criterion(outputs, labels)# 反向传播 + 参数更新optimizer.zero_grad()  # 清空梯度缓存loss.backward()        # 反向传播计算梯度optimizer.step()       # 更新参数 Ω# 每100批次打印一次损失值if batch_idx % 100 == 0:print(f"Epoch {epoch}, Batch {batch_idx}: Loss = {loss.item()}")

2. 多轮训练扩展

# 外层循环控制训练轮数
for epoch in range(num_epochs):# 内层循环执行单轮训练(6万张图片)for inputs, labels in train_loader:# ...(同上训练逻辑)...# 每轮结束后测试模型test_accuracy = evaluate_model(model, test_loader)print(f"Epoch {epoch+1} Test Accuracy: {test_accuracy}")

3. 测试集评估代码

def evaluate_model(model, test_loader):correct = 0total = 0with torch.no_grad():  # 禁用梯度计算以节省内存for inputs, labels in test_loader:inputs = inputs.to(device)  # 确保数据在正确设备上labels = labels.to(device)outputs = model(inputs)     # 前向传播_, predicted = torch.max(outputs.data, 1)  # argmax获取预测类别total += labels.size(0)      # 统计总样本数correct += (predicted == labels).sum().item()  # 统计正确数return correct / total  # 返回准确率

4. 关键优化点说明

  • 设备兼容性:通过inputs.to(device)统一数据与模型的设备(CPU/GPU)
  • 资源管理with torch.no_grad()减少测试阶段的内存占用
  • 批量处理:64个批次并行训练加速收敛(需调整DataLoaderbatch_size

二十三、核心问题

  • 训练效率低:原模型使用随机梯度下降(SGD)优化器,需100轮训练才能达到98%正确率,耗时约10分钟;改用Adam优化器后,仅需10轮训练即可达到96.81%正确率。
  • 梯度消失问题:Sigmoid激活函数的导数范围(0~0.25)导致多层网络参数更新停滞,损失值在局部震荡无法收敛。


二十四、关键知识点

1. 优化器改进:从SGD到Adam

  • 原理
    • SGD每次用全部数据更新参数,易陷入局部最优且收敛慢;
    • Adam通过自适应学习率和动量机制加速收敛,避免SGD的“高方差”问题。

代码示例

# 原SGD优化器(需修改)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 改为Adam优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

2. 学习率影响

  • 现象:固定学习率(如0.01)导致训练后期损失值震荡,无法逼近全局最优;
  • 解决思路:动态调整学习率(如学习率衰减),但需后续章节展开。

3. 激活函数优化:Sigmoid → ReLU

  • 梯度消失原因
    • Sigmoid导数范围(0~0.25)导致多层网络参数更新时梯度逐层衰减至0;
    • 数学表达:
  • ReLU优势
    • 计算简单,加速训练

代码示例

# 原Sigmoid激活函数(需修改)
def sigmoid(x):return 1 / (1 + np.exp(-x))# 改为ReLU激活函数
def relu(x):return np.maximum(0, x)

二十五、实验结果对比


二十六、扩展思考

  • 深层网络适配性:ReLU在超过3层的网络中表现优异,是现代深度学习的基础激活函数
  • 优化器组合:AdamW(带权重衰减的Adam)可缓解过拟合,适合迁移学习场景

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

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

相关文章

Ubuntu Server 系统安装 Docker

文章目录简介Ubuntu Server 简介VirtualBox 安装 Ubuntu Server 系统安装 DockerDocker 配置重启 Docker验证镜像源把用户加入 docker 组开启 Docker Api卸载 Docker简介 本文详细介绍了在Ubuntu系统上安装和配置Docker的完整流程,包括Docker官方源添加、依赖包安装…

从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游

从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游 1. 背景 “技术不是替代旅行,而是让旅途更有把握,让每一次选择更符合你的期待。” 随着大模型与地图服务能力的成熟,围绕旅游场景的“智能行程助理”成为低门槛…

RabbitMQ--消费端异常处理与 Spring Retry

1. 消息确认机制(ack)RabbitMQ 消息投递到消费者后,必须确认(ack)才能从队列中移除:auto-ack true消息一投递就算消费成功。如果消费者宕机,消息会丢失。一般不用。manual-ack false&#xff…

eniac:世界上第一台通用电子计算机的传奇

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! ✨ 1. eniac概述:计算机时代的黎明 eniac(ele…

网络与信息安全有哪些岗位:(6)安全开发工程师

想知道网络与信息安全领域有哪些具体岗位吗? 网络与信息安全有哪些岗位:(1)网络安全工程师-CSDN博客 网络与信息安全有哪些岗位:(2)渗透测试工程师_网络安全渗透工程师-CSDN博客 网络与信息安…

C-JSON接口的使用

一、cJSON 核心数据结构cJSON 的所有操作都围绕 cJSON 结构体展开,它代表 JSON 中的一个节点(可以是对象、数组、字符串、数字等):typedef struct cJSON {struct cJSON *next, *prev; // 用于链表(数组/对象的子节点…

TypeScript 类型系统(二)

本文将简述类型系统中的类型联合,通俗的来说就是将一个变量规定为不是某一个类型,而是某些类型,我们在日常开发中很常见下面会给出例子。值类型在JavaScript中用const声明的变量是不可以再次赋值的,也就是常量。在TypeScript中也可…

无刷电机控制 - STM32F405+CubeMX+HAL库+SimpleFOC08,速度闭环控制(有电流环)

导言 《STM32F405CubeMXHAL库SimpleFOC07,ADC采样相电流,频率20KHz(TIM1触发Injected Sampling中断》,有了上一章节的电流采样后,可以完善速度闭环控制了。 有了电流环的速度闭环控制,电机的扭矩会显得大很…

【机械故障】共振峰

机械故障信号分析 提示:学习笔记 1、机械振动名词 2、共振峰 共振峰 机械故障信号分析 1、机械振动名词 [2、共振峰](https://editor.csdn.net/md/?not_checkout=1&activity_id=10937&spm=1057.2600.3001.10415) @[TOC](共振峰) `详细讲解共振峰、共振频率带、共振频…

力扣(用队列实现栈)

解析 LeetCode 225. 用队列实现栈:单队列的巧妙运用 一、题目分析(一)功能需求 实现 MyStack 类,支持栈的四种操作: push(int x):将元素压入栈顶。pop():移除并返回栈顶元素。top():…

服务器Docker 安装和常用命令总结

Docker 安装和常用命令总结Docker 是一种开源平台,用于自动化应用程序的部署、扩展和管理。通过将应用程序及其依赖打包到一个轻量级、可移植的容器中,Docker 能够在任何地方统一运行,解决了不同环境间的兼容性问题。本篇文章将介绍 Docker 的…

2025年广东省无线电管理普法宣传活动

一、无线电发射设备型号核准相关制度及要求1.型号核准设备类型:一、公众网移动通信设备二、专用通信设备三、无线接入设备四、广播发射设备五、雷达设备六、导航设备七、卫星通信设备(含终端地球站)无线电发射设备八、公众网移动通信模块九、无线接入模块十、其他设…

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究 原文:Speech transcription from South Tyrolean Dialect to Standard German with Whisper 本研究展示了首个经过微调的Whisper模型,用于将南蒂罗尔方言语音自动翻译为标准德语文本。为了满足字幕和翻译方面尚未被…

Nexus管理maven仓库和jar包的配置和使用

登录nexus以后点击Settings-Repository-Repositories-Create repository 选择maven2(hosted)创建两个仓库一个是Release叫做monitor-releases:一个是Snapshot叫做monitor-snapshots:在创建一个maven2(group)叫做monitor将maven-central(用于存…

疯狂星期四文案网第50天运营日记

网站运营第50天,点击观站: 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今天流量减了一些,我发现我的疯狂星期四的词没有排名第一了,感觉应该是抽象文案这个导致的,因为我发了…

计算机视觉学习路线:从入门到进阶的完整指南

计算机视觉学习路线:从入门到进阶的完整指南 计算机视觉(Computer Vision, CV)是人工智能领域最热门和最具前景的方向之一,它赋予机器“看”和“理解”图像与视频的能力。无论你是学生、工程师还是对AI感兴趣的爱好者&#xff0c…

移动应用抓包与调试实战 Charles工具在iOS和Android中的应用

随着移动互联网的发展,几乎所有应用都依赖API接口进行数据交互。无论是登录注册、支付功能,还是新闻资讯加载,背后都需要与服务器频繁通信。如何快速定位问题、验证数据传输、模拟弱网环境,成为移动端开发者日常工作中的关键任务。…

【Python NTLK自然语言处理库】

安装流程 import nltk nltk.download()运行后出现一个界面,然后按DownloadTokenize ###分词 from nltk.tokenize import word_tokenize text "The vendor paid $20,000,000." tokens word_tokenize(text) print(tokens)输出 [The, vendor, paid, $, 20,…

GitHub 热榜项目 - 日榜(2025-08-25)

GitHub 热榜项目 - 日榜(2025-08-25) 生成于:2025-08-25 统计摘要 共发现热门项目:20 个 榜单类型:日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术趋势:1)AI代理开发成主流,如moeru-ai/airi的虚拟伴…