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

基于MNIST数据集的手写数字识别(CNN)

目录

一,模型训练

1.1 数据集介绍

1.2 CNN模型层结构

1.3 定义CNN模型

1.4 神经网络的前向传播过程

1.5 数据预处理

1.6 加载数据

1.7 初始化

1.8 模型训练过程

1.9 保存模型

二,模型测试

2.1 定义与训练时相同的CNN模型架构

2.2 图像的预处理

2.3 预测

三,测试

3.1 测试方法

3.2 测试结果

四 ,总结

五,完整代码

5.1 模型训练部分代码

5.2 模型测试部分代码


本实验直观地体现了CNN对比全连接对于图像处理的优势

全连接网络实现MNIST数字识别实验如下链接:

基于MNIST数据集的手写数字识别(简单全连接网络)-CSDN博客


一,模型训练

1.1 数据集介绍

        MNIST 数据集由 60,000 张图像构成的训练集和 10,000 张图像组成的测试集构成,其中的图像均为 28×28 像素的灰度图,涵盖 0 - 9 这 10 个阿拉伯数字,且数字书写风格、大小、位置多样。它源于美国国家标准与技术研究所(NIST)的数据集,经过归一化和中心化处理。MNIST 数据集是图像识别研究领域的经典数据集,常用于开发和评估图像识别算法与模型,也是机器学习课程中常用的教学案例,许多高性能卷积神经网络模型在该数据集测试集上准确率可达 99% 以上,充分展现出其在机器学习领域的重要价值和广泛应用。

1.2 CNN模型层结构

1.3 定义CNN模型

def __init__(self):super(CNN, self).__init__()  # 调用父类的初始化方法self.conv1 = nn.Conv2d(1, 32, kernel_size=3)  # 定义第一个卷积层,输入通道1,输出通道32,卷积核大小3x3self.conv2 = nn.Conv2d(32, 64, kernel_size=3)  # 定义第二个卷积层,输入通道32,输出通道64,卷积核大小3x3self.pool = nn.MaxPool2d(2, 2)  # 定义最大池化层,池化核大小2x2self.dropout1 = nn.Dropout2d(0.25)  # 定义第一个Dropout层,随机丢弃25%的神经元self.fc1 = nn.Linear(64 * 12 * 12, 128)  # 定义第一个全连接层,输入维度64*12*12,输出维度128self.dropout2 = nn.Dropout(0.5)  # 定义第二个Dropout层,随机丢弃50%的神经元self.fc2 = nn.Linear(128, 10)  # 定义输出层,输入维度128,输出维度10(对应10个数字类别)

        定义了一个用于手写数字识别的卷积神经网络(CNN)架构,专为 MNIST 等单通道图像分类任务设计。网络包含两个卷积层(Conv1 和 Conv2)进行特征提取,每个卷积层后接 ReLU 激活函数和最大池化层(MaxPool2d)进行下采样,逐步将 28×28 的输入图像转换为更高层次的抽象特征。为防止过拟合,在卷积层后添加了 Dropout2d (0.25),在全连接层前使用 Dropout (0.5) 增强模型泛化能力。特征提取完成后,通过两次全连接层(FC1 和 FC2)将卷积输出的多维特征映射到 10 个类别,最终输出对应 0-9 数字的分类得分。

1.4 神经网络的前向传播过程

    def forward(self, x):# 第一层卷积+ReLU激活x = torch.relu(self.conv1(x))# 第二层卷积+ReLU激活+池化x = self.pool(torch.relu(self.conv2(x)))# 应用Dropoutx = self.dropout1(x)# 将多维张量展平为一维向量(64*12*12)x = x.view(-1, 64 * 12 * 12)# 第一个全连接层+ReLU激活x = torch.relu(self.fc1(x))# 应用Dropoutx = self.dropout2(x)# 输出层,得到未归一化的预测分数x = self.fc2(x)return x

1.5 数据预处理

transform = transforms.Compose([transforms.ToTensor(),  # 将图像转换为张量transforms.Normalize((0.1307,), (0.3081,))  # 使用MNIST数据集的均值和标准差进行归一化
])

1.6 加载数据

train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)  # 加载MNIST训练数据集
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)  # 创建数据加载器,批次大小为64,打乱数据

1.7 初始化

model = CNN()  # 创建CNN模型实例
criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 定义Adam优化器,学习率为0.001

1.8 模型训练过程

def train(epochs):model.train()  # 设置模型为训练模式for epoch in range(epochs):  # 进行指定轮数的训练running_loss = 0.0  # 初始化本轮的损失累加器for batch_idx, (data, target) in enumerate(train_loader):  # 遍历数据加载器中的每个批次optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向传播,计算模型输出loss = criterion(output, target)  # 计算损失loss.backward()  # 反向传播,计算梯度optimizer.step()  # 更新模型参数running_loss += loss.item()  # 累加当前批次的损失if batch_idx % 100 == 0:  # 每100个批次打印一次损失print(f'Epoch {epoch + 1}, Batch {batch_idx}, Loss: {loss.item():.6f}')print(f'Epoch {epoch + 1} completed, Average Loss: {running_loss / len(train_loader):.6f}')  # 打印本轮平均损失

1.9 保存模型

if __name__ == '__main__':train(epochs=5)  # 调用训练函数,训练5轮torch.save(model.state_dict(),'mnist_cnn_model.pth')  # 保存模型的参数print("模型已保存为: mnist_cnn_model.pth")  # 打印保存模型的信息

二,模型测试

2.1 定义与训练时相同的CNN模型架构

class CNN(nn.Module):def __init__(self):# 调用父类初始化方法super(CNN, self).__init__()# 第一个卷积层:输入1通道(灰度图),输出32通道,卷积核3x3self.conv1 = nn.Conv2d(1, 32, kernel_size=3)# 第二个卷积层:输入32通道,输出64通道,卷积核3x3self.conv2 = nn.Conv2d(32, 64, kernel_size=3)# 最大池化层:核大小2x2,步长2self.pool = nn.MaxPool2d(2, 2)# Dropout层:训练时随机丢弃25%的神经元,防止过拟合self.dropout1 = nn.Dropout2d(0.25)# 第一个全连接层:输入维度64*12*12,输出128self.fc1 = nn.Linear(64 * 12 * 12, 128)# Dropout层:训练时随机丢弃50%的神经元self.dropout2 = nn.Dropout(0.5)# 输出层:输入128,输出10个类别(对应0-9数字)self.fc2 = nn.Linear(128, 10)def forward(self, x):# 第一层卷积+ReLU激活x = torch.relu(self.conv1(x))# 第二层卷积+ReLU激活+池化x = self.pool(torch.relu(self.conv2(x)))# 应用Dropoutx = self.dropout1(x)# 将多维张量展平为一维向量(64*12*12)x = x.view(-1, 64 * 12 * 12)# 第一个全连接层+ReLU激活x = torch.relu(self.fc1(x))# 应用Dropoutx = self.dropout2(x)# 输出层,得到未归一化的预测分数x = self.fc2(x)return x

2.2 图像的预处理

def preprocess_image(image_path):"""预处理自定义图像,使其符合模型输入要求"""# 打开图像并转换为灰度图(单通道)image = Image.open(image_path).convert('L')# 调整图像大小为28x28像素(如果不是)if image.size != (28, 28):image = image.resize((28, 28), Image.Resampling.LANCZOS)# 将PIL图像转换为numpy数组以便处理img_array = np.array(image)# 预处理:二值化和颜色反转# MNIST数据集中数字为白色(255),背景为黑色(0)if img_array.mean() > 127:  # 如果平均像素值大于127,说明可能是黑底白字img_array = 255 - img_array  # 颜色反转# 将numpy数组转换为PyTorch张量并添加批次维度img_tensor = transforms.ToTensor()(img_array).unsqueeze(0)# 使用MNIST数据集的均值和标准差进行归一化img_tensor = transforms.Normalize((0.1307,), (0.3081,))(img_tensor)return image, img_tensor  # 返回原始图像和处理后的张量

2.3 预测

def predict_digit(image_path):"""预测自定义图像中的数字"""# 创建模型实例model = CNN()# 加载预训练模型权重model.load_state_dict(torch.load('mnist_cnn_model.pth'))# 设置模型为评估模式(关闭Dropout等训练特有的层)model.eval()# 预处理输入图像original_img, img_tensor = preprocess_image(image_path)# 预测过程,不计算梯度以提高效率with torch.no_grad():# 前向传播,得到模型输出output = model(img_tensor)# 应用softmax将输出转换为概率分布probabilities = torch.softmax(output, dim=1)# 获取最高概率及其对应的数字类别confidence, predicted = torch.max(probabilities, 1)

三,测试

3.1 测试方法

如上文代码所示,我这里用的测试图片是自己定义图片,使用电脑自带的paint绘图软件,设置画布为28*28像素,黑底白字,手动写入一个字进行预测

3.2 测试结果

        预测5的置信度为99.94%

        预测0的置信度为99.99%

        预测7的置信度为92.33%(尽管这个“7”写的很不好但是并不影响预测结果)


四 ,总结

        卷积神经网络(CNN)在图像分类中相比全连接网络(FNN)具有显著优势:通过局部连接权重共享机制,CNN 大幅减少参数量,避免全连接网络因输入维度高导致的参数爆炸问题,计算效率更高且不易过拟合;CNN 通过卷积核逐层提取图像的局部特征(如边缘、纹理),结合池化层的平移不变性,能自动学习从低级到高级的层级化语义特征,而全连接网络将图像展平为向量,完全忽略像素空间关系,需依赖人工特征或大量数据学习;此外,CNN 的卷积结构天然具备正则化效果,对数据量需求更低,训练速度更快,且通过可视化卷积核和特征图可直观解释其对图像模式的捕捉过程,而全连接网络的特征表示缺乏可解释性。


五,完整代码

5.1 模型训练部分代码

import torch  # 导入PyTorch库,用于深度学习
import torch.nn as nn  # 导入PyTorch的神经网络模块
import torch.optim as optim  # 导入PyTorch的优化器模块
from torchvision import datasets, transforms  # 从torchvision导入数据集和数据变换模块
from torch.utils.data import DataLoader  # 导入数据加载器模块# 定义CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()  # 调用父类的初始化方法self.conv1 = nn.Conv2d(1, 32, kernel_size=3)  # 定义第一个卷积层,输入通道1,输出通道32,卷积核大小3x3self.conv2 = nn.Conv2d(32, 64, kernel_size=3)  # 定义第二个卷积层,输入通道32,输出通道64,卷积核大小3x3self.pool = nn.MaxPool2d(2, 2)  # 定义最大池化层,池化核大小2x2self.dropout1 = nn.Dropout2d(0.25)  # 定义第一个Dropout层,随机丢弃25%的神经元self.fc1 = nn.Linear(64 * 12 * 12, 128)  # 定义第一个全连接层,输入维度64*12*12,输出维度128self.dropout2 = nn.Dropout(0.5)  # 定义第二个Dropout层,随机丢弃50%的神经元self.fc2 = nn.Linear(128, 10)  # 定义输出层,输入维度128,输出维度10(对应10个数字类别)def forward(self, x):x = torch.relu(self.conv1(x))  # 对第一个卷积层的输出应用ReLU激活函数x = self.pool(torch.relu(self.conv2(x)))  # 对第二个卷积层的输出应用ReLU激活函数,然后进行最大池化x = self.dropout1(x)  # 应用第一个Dropout层x = x.view(-1, 64 * 12 * 12)  # 将张量展平为一维向量,-1表示自动推断批次维度x = torch.relu(self.fc1(x))  # 对第一个全连接层的输出应用ReLU激活函数x = self.dropout2(x)  # 应用第二个Dropout层x = self.fc2(x)  # 通过输出层return x  # 返回模型的输出# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),  # 将图像转换为张量transforms.Normalize((0.1307,), (0.3081,))  # 使用MNIST数据集的均值和标准差进行归一化
])# 加载数据
train_dataset = datasets.MNIST('data', train=True, download=True, transform=transform)  # 加载MNIST训练数据集
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)  # 创建数据加载器,批次大小为64,打乱数据# 初始化模型、损失函数和优化器
model = CNN()  # 创建CNN模型实例
criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)  # 定义Adam优化器,学习率为0.001# 训练模型
def train(epochs):model.train()  # 设置模型为训练模式for epoch in range(epochs):  # 进行指定轮数的训练running_loss = 0.0  # 初始化本轮的损失累加器for batch_idx, (data, target) in enumerate(train_loader):  # 遍历数据加载器中的每个批次optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向传播,计算模型输出loss = criterion(output, target)  # 计算损失loss.backward()  # 反向传播,计算梯度optimizer.step()  # 更新模型参数running_loss += loss.item()  # 累加当前批次的损失if batch_idx % 100 == 0:  # 每100个批次打印一次损失print(f'Epoch {epoch + 1}, Batch {batch_idx}, Loss: {loss.item():.6f}')print(f'Epoch {epoch + 1} completed, Average Loss: {running_loss / len(train_loader):.6f}')  # 打印本轮平均损失# 执行训练并保存模型
if __name__ == '__main__':train(epochs=5)  # 调用训练函数,训练5轮torch.save(model.state_dict(),'mnist_cnn_model.pth')  # 保存模型的参数print("模型已保存为: mnist_cnn_model.pth")  # 打印保存模型的信息

5.2 模型测试部分代码

# 导入PyTorch深度学习框架及其神经网络模块
import torch
import torch.nn as nn
# 导入torchvision的图像变换工具
from torchvision import transforms
# 导入PIL库用于图像处理
from PIL import Image
# 导入matplotlib用于可视化
import matplotlib.pyplot as plt
# 导入numpy用于数值计算
import numpy as np
# 导入os模块用于文件和路径操作
import os# 设置matplotlib的字体,确保中文正常显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'WenQuanYi Micro Hei', 'Heiti TC']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 定义与训练时相同的CNN模型架构
class CNN(nn.Module):def __init__(self):# 调用父类初始化方法super(CNN, self).__init__()# 第一个卷积层:输入1通道(灰度图),输出32通道,卷积核3x3self.conv1 = nn.Conv2d(1, 32, kernel_size=3)# 第二个卷积层:输入32通道,输出64通道,卷积核3x3self.conv2 = nn.Conv2d(32, 64, kernel_size=3)# 最大池化层:核大小2x2,步长2self.pool = nn.MaxPool2d(2, 2)# Dropout层:训练时随机丢弃25%的神经元,防止过拟合self.dropout1 = nn.Dropout2d(0.25)# 第一个全连接层:输入维度64*12*12,输出128self.fc1 = nn.Linear(64 * 12 * 12, 128)# Dropout层:训练时随机丢弃50%的神经元self.dropout2 = nn.Dropout(0.5)# 输出层:输入128,输出10个类别(对应0-9数字)self.fc2 = nn.Linear(128, 10)def forward(self, x):# 第一层卷积+ReLU激活x = torch.relu(self.conv1(x))# 第二层卷积+ReLU激活+池化x = self.pool(torch.relu(self.conv2(x)))# 应用Dropoutx = self.dropout1(x)# 将多维张量展平为一维向量(64*12*12)x = x.view(-1, 64 * 12 * 12)# 第一个全连接层+ReLU激活x = torch.relu(self.fc1(x))# 应用Dropoutx = self.dropout2(x)# 输出层,得到未归一化的预测分数x = self.fc2(x)return xdef preprocess_image(image_path):"""预处理自定义图像,使其符合模型输入要求"""# 打开图像并转换为灰度图(单通道)image = Image.open(image_path).convert('L')# 调整图像大小为28x28像素(如果不是)if image.size != (28, 28):image = image.resize((28, 28), Image.Resampling.LANCZOS)# 将PIL图像转换为numpy数组以便处理img_array = np.array(image)# 预处理:二值化和颜色反转# MNIST数据集中数字为白色(255),背景为黑色(0)if img_array.mean() > 127:  # 如果平均像素值大于127,说明可能是黑底白字img_array = 255 - img_array  # 颜色反转# 将numpy数组转换为PyTorch张量并添加批次维度img_tensor = transforms.ToTensor()(img_array).unsqueeze(0)# 使用MNIST数据集的均值和标准差进行归一化img_tensor = transforms.Normalize((0.1307,), (0.3081,))(img_tensor)return image, img_tensor  # 返回原始图像和处理后的张量def predict_digit(image_path):"""预测自定义图像中的数字"""# 创建模型实例model = CNN()# 加载预训练模型权重model.load_state_dict(torch.load('mnist_cnn_model.pth'))# 设置模型为评估模式(关闭Dropout等训练特有的层)model.eval()# 预处理输入图像original_img, img_tensor = preprocess_image(image_path)# 预测过程,不计算梯度以提高效率with torch.no_grad():# 前向传播,得到模型输出output = model(img_tensor)# 应用softmax将输出转换为概率分布probabilities = torch.softmax(output, dim=1)# 获取最高概率及其对应的数字类别confidence, predicted = torch.max(probabilities, 1)# 创建可视化窗口plt.figure(figsize=(12, 4))# 子图1:显示原始输入图像plt.subplot(1, 3, 1)plt.imshow(original_img, cmap='gray')plt.title('原始图像')plt.axis('off')  # 关闭坐标轴显示# 子图2:显示模型实际输入(归一化后的图像)plt.subplot(1, 3, 2)plt.imshow(img_tensor[0][0], cmap='gray')plt.title('模型输入')plt.axis('off')# 子图3:显示预测结果和置信度条形图plt.subplot(1, 3, 3)plt.bar(range(10), probabilities[0].numpy())plt.xticks(range(10))  # 设置x轴刻度为0-9plt.title(f'预测结果: {predicted.item()} (置信度: {confidence.item() * 100:.2f}%)')plt.xlabel('数字')plt.ylabel('概率')# 自动调整子图布局plt.tight_layout()# 显示图像plt.show()# 返回预测结果和置信度return predicted.item(), confidence.item() * 100if __name__ == '__main__':# 指定要测试的图像路径,请替换为实际路径image_path = r"C:\Users\10532\Desktop\Study\test\Untitled.png"# 检查文件是否存在if not os.path.exists(image_path):print(f"错误:文件 '{image_path}' 不存在")else:# 执行预测digit, confidence = predict_digit(image_path)print(f"预测结果: {digit},置信度: {confidence:.2f}%")

相关文章:

基于MNIST数据集的手写数字识别(CNN)

目录 一,模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二,模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…...

QT6 源(103)篇三:阅读与注释 QPlainTextEdit,给出源代码

(10)关于文本处理的内容很多,来不及全面阅读、思考与整理。先给出类的继承图: (11)本源代码来自于头文件 qplaintextedit . h : #ifndef QPLAINTEXTEDIT_H #define QPLAINTEXTEDIT_H#include &…...

yocto5.2开发任务手册-7 升级配方

此文为机器辅助翻译,仅供个人学习使用,如有翻译不当之处欢迎指正 7 升级配方 随着时间的推移,上游开发者会为图层配方构建的软件发布新版本。建议使配方保持与上游版本发布同步更新。 虽然有多种升级配方的方法,但您可能需要先…...

LangPDF: Empowering Your PDFs with Intelligent Language Processing

LangPDF: Empowering Your PDFs with Intelligent Language Processing Unlock Global Communication: AI-Powered PDF Translation and Beyond In an interconnected world, seamless multilingual document management is not just an advantage—it’s a necessity. LangP…...

DDS(数据分发服务) 和 P2P(点对点网络) 的详细对比

1. 核心特性对比 维度 DDS P2P 实时性 微秒级延迟,支持硬实时(如自动驾驶) 毫秒至秒级,依赖网络环境(如文件传输) 架构 去中心化发布/订阅模型,节点自主发现 完全去中心化,节…...

TC8:SOMEIP_ETS_029-030

SOMEIP_ETS_029: echoUINT8Array16Bitlength 目的 检查当method echoUINT8Array16BitLength的参数中长度字段为16bit时,SOME/IP协议层是否能对参数进行序列化和反序列化。 对于可变长度的数组而言,必须用长度字段表示数组长度。否则接收方无法判断有效数据。 SOMEIP_ETS_02…...

Elasticsearch索引全生命周期管理指南之一

#作者:猎人 文章目录 一、索引常规操作二、索引mapping和别名管理 一、索引常规操作 索引数据特点: 索引中的数据随着时间,持续不断增长 按照时间序列划分索引的好处&挑战: 按照时间进行划分索引,会使得管理更加…...

本土DevOps革命:Gitee如何撬动中国企业的数字化转型新动能

在数字化浪潮席卷全球的背景下,中国企业正面临前所未有的转型压力与机遇。随着《数据安全法》和《个人信息保护法》的全面实施,以及信创产业政策的深入推进,研发工具链的自主可控已成为关乎企业核心竞争力的战略命题。在这一关键赛道上&#…...

ARM服务器解决方案

ARM服务器解决方案已成为异构计算领域的重要技术路径,其核心优势与多元化场景适配性正加速产业渗透。以下为关键要点分析: 一、核心优势与架构设计 能效比优化‌ ARM架构基于RISC指令集,单节点功耗可控制在15W以下,较x86架构能效…...

【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN

EEMEFN:Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN:基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术,旨在提升图像亮度…...

嵌入式EasyRTC音视频实时通话SDK在工业制造领域的智能巡检/AR协作等应用

一、背景 在数字化浪潮席卷全球的当下,远程监控与驾驶技术已深度渗透至工业巡检、智能交通等核心领域。然而,传统方案普遍面临实时性瓶颈、高延迟传输及交互体验匮乏等痛点,严重制约行业智能化转型。EasyRTC作为前沿的实时音视频通信技术&am…...

uniapp-商城-58-后台 新增商品(属性子级的添加和更新)

前面对父级属性的添加进行了分析,这里再来继续做属性子级的数据添加,包含页面逻辑以及后台处理的逻辑。当然这里还是在前面的云对象的方式进行的。 本文介绍了在云对象green-mall-sku中添加子级属性的实现过程。首先,通过updateChild接口处理…...

基于springboot+vue的机场乘客服务系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户管理 航班信…...

npm和nvm和nrm有什么区别

npm 全称:Node Package Manager。 作用: 包管理:用于安装、共享、分发代码,管理项目依赖关系。项目管理:创建和管理 package.json 文件,记录项目依赖和配置信息。脚本执行:运行项目中的脚本&…...

几种排序方式的C语言实现(冒泡、选择、插入、希尔等)

## 分类 存储器类型: - 内排序(数据规模小 内存) - 外排序(数据库 磁盘) 是否基于元素之间的比较 - 基数排序 - 其他排序:冒泡、选择、插入、快速、归并、希尔、堆…… 时间复杂度 - O&#…...

【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接

本文所述代码实现了一个 三维状态的扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 算法。通过生成过程噪声和观测噪声,对真实状态进行滤波估计,同时对比了滤波前后状态量的误差和误差累积分布曲线。 文章目录 简介运行结果MATLAB源代码 简介 代码分为以…...

芯片测试之X-ray测试

原理: X-ray是利用阴极射线管产生高能量电子与金属靶撞击,在撞击过程中,因电子突然减速,其损失的动能会以X-Ray形式放出。而对于样品无法以外观方式观测的位置,利用X-Ray穿透不同密度物质后其光强度的变化,…...

机器学习中的特征工程:解锁模型性能的关键

在机器学习领域,模型的性能往往取决于数据的质量和特征的有效性。尽管深度学习模型在某些任务中能够自动提取特征,但在大多数传统机器学习任务中,特征工程仍然是提升模型性能的关键环节。本文将深入探讨特征工程的重要性、常用方法以及在实际…...

【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(1)

机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 机器学习之深度学习神经网络入门一、神经网络的起源与发展二、神经元模型(…...

反向传播算法:神经网络的核心优化方法,一文打通任督二脉

搞神经网络训练,**反向传播(Backpropagation)**是最核心的算法。 没有它,模型就只能瞎猜参数,训练基本白搭。 这篇文章不整公式推导,不搞花架子,咱就把最关键的几个问题讲明白: 反向传播到底是干啥的? 它是怎么一步步更新参数的? 哪些坑你必须避免? 一、反向传播是…...

neo4j框架:java安装教程

安装使用neo4j需要事先安装好java,java版本的选择是一个犯难的问题。本文总结了在安装java和使用Java过程中遇到的问题以及相应的解决方法。 Java的安装包可以在java官方网站Java Downloads | Oracle 中国进行下载 以java 8为例,选择最后一行的x64 compr…...

基于React的高德地图api教程007:椭圆的绘制、编辑和删除

文章目录 7、椭圆绘制7.1 绘制椭圆7.1.1 设置圆心7.1.2 确定短半轴7.1.3 确定长半轴7.1.4 实时显示椭圆形状7.2 修改椭圆7.2.1 修改椭圆属性信息7.2.2 修改椭圆形状7.3 删除椭圆7.4 定位椭圆7.5 代码下载7.07、椭圆绘制 7.1 绘制椭圆 7.1.1 设置圆心 第一次点击地图设置圆心…...

Python多线程实战:提升并发效率的秘诀

一、前言:为什么需要多任务处理? 在实际开发中,我们经常需要让程序同时执行多个任务,例如: 同时下载多个文件;在后台运行耗时计算的同时保持界面响应;并发处理网络请求等。 Python 提供了多种…...

将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者: Andre Luiz 讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector,以及它们与嵌入生成的关系。 通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用,或者在本地机器上尝试 Elastic。 多年来…...

RabbitMQ 消息模式实战:从简单队列到复杂路由(四)

模式对比与选择 各模式特点对比 简单队列模式:结构最为简单,生产者直接将消息发送到队列,消费者从队列中获取消息,实现一对一的消息传递。其优势在于易于理解和实现,代码编写简单,适用于初学者和简单业务…...

OpenCV CUDA模块中矩阵操作------归一化与变换操作

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 OpenCV 的 CUDA 模块中,normalize 和 rectStdDev 函数用于对矩阵进行归一化处理和基于积分图计算矩形区域的标准差。 函数介绍 …...

1Panel应用推荐:Beszel轻量级服务器监控平台

1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...

谷歌地图代理 | 使用 HTML 和矢量模式 API 更轻松地创建 Web 地图

在过去的一年里,谷歌对 Maps JavaScript API 进行了两项重要更新,以便更轻松地采用我们最新、最好的地图:HTML 地图和矢量模式 API。今天谷歌地图亚太区最大代理商之一的 Cloud Ace云一 为大家介绍一下更新的具体内容。 联系我们 - Cloud Ac…...

最新开源 TEN VAD 与 Turn Detection 让 Voice Agent 对话更拟人 | 社区来稿

关键词:对话式 AI | 语音智能体 | Voice Agent | VAD | 轮次检测 | 声网 | TEN GPT-4o 所展示对话式 AI 的新高度,正一步步把我们在电影《Her》中看到的 AI 语音体验变成现实。AI 的语音交互正在变得更丰富、更流畅、更易用,成为构建多模态智…...

「Mac畅玩AIGC与多模态40」开发篇35 - 用 Python 开发服务对接 SearxNG 与本地知识库

一、概述 本篇介绍如何使用 Python 构建一个集成本地聚合搜索引擎 SearxNG 与本地知识库的双通道服务接口,返回标准结构化 JSON 数据,并用于对接智能体插件系统。该接口适用于本地 Agent 应用开发与 Dify 插件集成场景。 二、目标说明 使用 Flask 实现…...

【Boost搜索引擎】构建Boost站内搜索引擎实践

目录 1. 搜索引擎的相关宏观原理 2. 正排索引 vs 倒排索引 - 搜索引擎具体原理 3. 编写数据去标签与数据清洗的模块 Parser 去标签 编写parser 用boost枚举文件名 解析html 提取title ​编辑 去标签 构建URL 将解析内容写入文件中 4. 编写建立索引的模块 Index 建…...

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注:过程更新了很多文件,所有这里贴上的有些内容不是最新的(而是草稿)。 注:我们队伍并没有获奖,文章内容仅供一乐。 从这次比赛,给出以下赛前建议 …...

【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总

HTTP/2协议特点 gRPC基于HTTP/2协议,原因: 多路复用:允许在同一个TCP连接上并行传输多个请求和响应,即多个gRPC调用可以通过同一个连接同时进行,避免了HTTP/1.x中常见的线头阻塞问题,减少了连接建立和关闭…...

mac中加载C++动态库文件

前言 需要再mac系统下运行C开发的程序,通过摸索,初步实现了一版,大致记录下 1. 前提准备 安装OpenCV 使用Homebrew安装OpenCV: brew install opencv确认安装路径: brew --prefix opencv默认路径为/opt/homebrew/…...

Apollo Client 1.6.0 + @RefreshScope + @Value 刷新问题解析

问题描述 在使用 Apollo Client 1.6.0 结合 Spring Cloud 的 RefreshScope 和 Value 注解时,遇到以下问题: 项目启动时第一次属性注入成功后续配置变更时,Value 属性会刷新,但总是刷新为第一次的旧值,而不是最新的配…...

大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF

写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...

文本分类任务Qwen3-0.6B与Bert:实验见解

文本分类任务Qwen3-0.6B与Bert:实验见解 前言 最近在知乎上刷到一个很有意思的提问Qwen3-0.6B这种小模型有什么实际意义和用途。查看了所有回答,有人提到小尺寸模型在边缘设备场景中的优势(低延迟)、也有人提出小模型只是为了开…...

Mysql、Oracle、Sql Server、达梦之间sql的差异

1&#xff1a;分页查询 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…...

STM32外设AD-DMA+定时读取模板

STM32外设AD-DMA定时读取模板 一&#xff0c;方法引入二&#xff0c;CubeMX配置三&#xff0c;变量声明四&#xff0c;代码实现 (单通道) 一&#xff0c;方法引入 轮询法虽然简单&#xff0c;但 CPU 一直在忙着等待&#xff0c;效率太低。为了让 CPU 能在 ADC 转换的同时处理其…...

SQL里where条件的顺序影响索引使用吗?

大家好&#xff0c;我是锋哥。今天分享关于【SQL里where条件的顺序影响索引使用吗&#xff1f;】面试题。希望对大家有帮助&#xff1b; SQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 查询中&#xff0c;W…...

Java 接口中实现异步处理的方法

在Java中,接口本身不能直接实现逻辑(接口中的方法默认是抽象的,JDK 8+允许通过default方法提供非抽象实现,但通常不用于复杂的异步处理)。异步处理的逻辑需要在实现接口的类中通过多线程、异步框架或回调机制来实现。以下是几种常见的在接口实现类中实现异步处理<...

数值分析证明题

文章目录 第一题第二题第三题第四题第五题第六题第七题第八题第九题 第一题 例 给出 cos ⁡ x \cos x cosx&#xff0c; x ∈ [ 0 ∘ , 9 0 ∘ ] x\in[0^{\circ},90^{\circ}] x∈[0∘,90∘]的函数表&#xff0c;步长 h 1 ′ ( 1 60 ) ∘ h 1 (\frac{1}{60})^{\circ} h1′…...

深入理解二叉树:遍历、存储与算法实现

在之前的博客系列中&#xff0c;我们系统地探讨了多种线性表数据结构&#xff0c;包括顺序表、栈和队列等经典结构&#xff0c;并通过代码实现了它们的核心功能。从今天开始&#xff0c;我们将开启一个全新的数据结构篇章——树结构。与之前讨论的线性结构不同&#xff0c;树形…...

Python web 开发 Flask HTTP 服务

Flask 是一个轻量级的 Web 应用框架&#xff0c;它基于 Python 编写&#xff0c;特别适合构建简单的 Web 应用和 RESTful API。Flask 的设计理念是提供尽可能少的约定和配置&#xff0c;从而让开发者能够灵活地构建自己的 Web 应用。 https://andi.cn/page/622189.html...

【AI】用Dify实现一个模拟面试的功能

前言 Dify&#xff0c;一个将LLM转换为实际工作流的工具&#xff0c;以及火了一段时间了&#xff0c;但直到最近才开始研究它的使用&#xff08;主要前段时间在忙着自己的独立开发项目&#xff09;&#xff0c;我发现它的功能基本上满足了我对大语言模型&#xff0c;从仅对话转…...

研华服务器ASMB-825主板无法识别PCIE-USB卡(笔记本)

系统下无法识别到USB卡&#xff0c;排除硬件问题&#xff0c;系统问题。 最后在BIOS中更改此PCIE端口参数为X4X4X4X4&#xff0c;设置完成后可正常使用USB卡。 底部有问题详细解析。 针对研华主板ASMB-825安装绿联PCIE-USB卡无法识别的问题&#xff0c;结合BIOS设置调整的解决过…...

Redisson 四大核心机制实现原理详解

一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…...

云计算与大数据进阶 | 26、解锁云架构核心:深度解析可扩展数据库的5大策略与挑战(上)

在云应用/服务的 5 层架构里&#xff0c;数据库服务层稳坐第 4 把交椅&#xff0c;堪称其中的 “硬核担当”。它的复杂程度常常让人望而生畏&#xff0c;不少人都将它视为整个架构中的 “终极挑战”。 不过&#xff0c;也有人觉得可扩展存储系统才是最难啃的 “硬骨头”&#…...

Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系

从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭&#xff0c;代码耦合得跟一团麻线似的&#xff0c;改个小功能都能牵一发而动全身&#xff1b;也可能有些团队在协作时&#xff0c;经常因为代码冲突或者职责不清搞得焦头烂额。相信我&#xff0c;这些问题我…...

基于MATLAB的人脸识别,实现PCA降维,用PCA特征进行SVM训练

基于MATLAB的人脸识别完整流程&#xff0c;包含PCA降维和SVM分类的实现。我们以经典的ORL人脸数据库为例&#xff0c;演示从数据加载到结果评估的全过程。 1. 数据准备与预处理​ 1.1 下载数据集​ 下载ORL人脸数据库&#xff08;40人10张&#xff0c;共400张图像&#xff09…...