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

Python----神经网络(基于Alex Net的花卉分类项目)

一、基于Alex Net的花卉分类

1.1、项目背景

        在当今快速发展的科技领域,计算机视觉已成为一个备受关注的研究方向。随着深度学习技术的不断进步,图像识别技术得到了显著提升,广泛应用于医疗、安防、自动驾驶等多个领域。其中,花卉分类作为计算机视觉中的一个重要应用,不仅能帮助园艺师和农业生产者优化作物管理,还能在生态研究、植物保护等方面发挥重要作用。

        传统的花卉分类方法依赖于人工特征提取和机器学习算法,虽然在特定条件下能够取得较好效果,但在面对复杂的自然环境和大量不同花卉品种时,仍显得力不从心。而深度学习,尤其是卷积神经网络(CNN),凭借其强大的特征学习能力和卓越的表现,逐渐取代了传统方法。其中,AlexNet作为第一款在大规模图像分类竞赛中获得突破性成果的深度学习模型,广泛应用于各类图像识别任务,受到高度重视。

1.2、项目目的

        在本项目中,我们的目标是构建一个深度学习模型,能够有效地识别和分类花卉的图像。通过使用卷积神经网络(CNN),尤其是著名的AlexNet架构,我们希望实现高精度的图像分类。完成该项目后,用户能够方便地将图像上传至应用程序,并获得该图像是何种花卉的预测结果。

1.3、网络描述

        AlexNet 是由Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在2012年提出的深度学习模型。它在ImageNet大规模视觉识别挑战赛中取得了显著的成功,显著提高了图像分类的准确率。该模型采用了多个卷积层、ReLU激活函数、全连接层和Dropout正则化方法,以有效防止过拟合。AlexNet的成功不仅证明了深度学习在计算机视觉领域的潜力,还推动了后续更多深度学习模型的研究和应用。

1.4、数据集

examples = enumerate(val_loader)
batch_idx, (imgs, labels) = next(examples)
for i in range(4):mean = np.array([0.5, 0.5, 0.5])std = np.array([0.5, 0.5, 0.5])image = imgs[i].numpy() * std[:, None, None] + mean[:, None, None]# 将图片转成numpy数组,主要是转换通道和宽高位置image = np.transpose(image, (1, 2, 0))plt.subplot(2, 2, i+1)plt.imshow(image)plt.title(f"Truth: {labels[i]}")
plt.show()

二、设计思路

import os
import random
import numpy as np
import torch
from torch import nn
from torchvision import datasets,transforms
from torch.utils.data import DataLoader

2.1、构建随机种子

# 设置随机种子以保证结果的可重复性
def setup_seed(seed):np.random.seed(seed)  # 设置 Numpy 随机种子random.seed(seed)  # 设置 Python 内置随机种子os.environ['PYTHONHASHSEED'] = str(seed)  # 设置 Python 哈希种子torch.manual_seed(seed)  # 设置 PyTorch 随机种子if torch.cuda.is_available():torch.cuda.manual_seed(seed)  # 设置 CUDA 随机种子torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark = False  # 关闭 cudnn 加速torch.backends.cudnn.deterministic = True  # 设置 cudnn 为确定性算法
# 设置随机种子
setup_seed(0)

2.2、检测显卡还是cpu

# 检查是否有可用的 GPU,如果有则使用 GPU,否则使用 CPU
if torch.cuda.is_available():device = torch.device("cuda")  # 使用 GPUprint("CUDA is available. Using GPU.")
else:device = torch.device("cpu")  # 使用 CPUprint("CUDA is not available. Using CPU.")

2.3、数据预处理和加载数据集

transform={'train':transforms.Compose([transforms.RandomResizedCrop(244),transforms.RandomVerticalFlip(p=0.5),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]),'val':transforms.Compose([transforms.Resize((224,224)),transforms.RandomVerticalFlip(p=0.5),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])
}
train_loader=DataLoader(train_dataset,batch_size=32,shuffle=True)
val_loader=DataLoader(val_dataset,batch_size=32,shuffle=False)

2.4、构建Alex Net网络

class AlexNet(nn.Module):def __init__(self, num_classes=1000):super(AlexNet, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 96, 11, 4, 2),nn.ReLU(inplace=True),nn.MaxPool2d(3, 2),nn.Conv2d(96, 256, 5, 1, 2),nn.ReLU(inplace=True),nn.MaxPool2d(3, 2),nn.Conv2d(256, 384, 3, 1, 1),nn.ReLU(inplace=True),nn.Conv2d(384, 384, 3, 1, 1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, 3, 1, 1),nn.ReLU(inplace=True),nn.MaxPool2d(3, 2),)self.classifier = nn.Sequential(nn.Dropout(p=0.5),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(p=0.5),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = self.classifier(x)return x
model=AlexNet().to(device)

2.5、损失函数优化器

cri=torch.nn.CrossEntropyLoss()
optim=torch.optim.Adam(model.parameters(),lr=0.001)

2.6、训练模型

epoches = 100
for epoch in range(epoches):model.train()total_loss = 0for i, (images, labels) in enumerate(train_loader):# 数据放在设备上images = images.to(device)labels = labels.to(device)# 前向传播outputs = model(images)loss = cri(outputs, labels)# 反向传播optim.zero_grad()loss.backward()optim.step()total_loss += lossprint(f"Epoch [{epoch + 1}/{epoches}], Iter [{i}/{len(train_loader)}], Loss {loss:.4f}")avg_loss = total_loss / len(train_loader)print(f"Epoch [{epoch + 1}/{epoches}], Loss {avg_loss:.4f}")if (epoch+1) % 10 == 0:torch.save(model.state_dict(), f"./model/model_{epoch}.pth")

2.7、验证模型

model.load_state_dict(torch.load("model_best.pth"))
model.eval()
total = 0
correct = 0
predicted_labels = []
true_labels = []
with torch.no_grad():for images, labels in val_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()predicted_labels.extend(predicted.cpu().numpy())true_labels.extend(labels.cpu().numpy())print(f"ACC {correct / total * 100}%")# 生成混淆矩阵
conf = confusion_matrix(true_labels, predicted_labels)
# 可视化
sns.heatmap(conf, annot=True, fmt="d", cmap="Blues")
plt.xlabel("predict")
plt.ylabel("true")
plt.show()

2.8、完整代码

import os
import random
import numpy as np
import torch
from torch import nn
from torchvision import datasets,transforms
from torch.utils.data import DataLoader# 设置随机种子,保证实验的可重复性
def setup_seed(seed):np.random.seed(seed)random.seed(seed)os.environ['PYTHONHASHSEED']=str(seed)torch.manual_seed(seed)if torch.cuda.is_available():torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark=False # 关闭cudnn的benchmark模式,保证每次运行结果一致torch.backends.cudnn.deterministic=True # 使cudnn的卷积计算具有确定性setup_seed(42) # 设置随机种子为42# 判断是否有CUDA可用,并设置设备
if torch.cuda.is_available():device=torch.device('cuda')print('cuda is available')
else:device=torch.device('cpu')print('cuda is not available')# 定义数据预处理的转换
transform={'train':transforms.Compose([transforms.RandomResizedCrop(224), # 随机裁剪到224x224transforms.RandomHorizontalFlip(p=0.5), # 以0.5的概率进行水平翻转transforms.ToTensor(), # 将PIL图像或NumPy数组转换为Tensortransforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)) # 对图像进行标准化,均值为0.5,标准差为0.5]),'val':transforms.Compose([transforms.Resize((224,224)), # 调整图像大小到224x224transforms.RandomHorizontalFlip(p=0.5), # 以0.5的概率进行水平翻转transforms.ToTensor(), # 将PIL图像或NumPy数组转换为Tensortransforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)) # 对图像进行标准化,均值为0.5,标准差为0.5])
}# 加载训练数据集
train_dataset=datasets.ImageFolder('./flower_data/train', # 训练数据文件夹路径transform=transform['train'] # 应用训练集的数据预处理
)# 加载验证数据集
val_dataset=datasets.ImageFolder('./flower_data/val', # 验证数据文件夹路径transform=transform['val'] # 应用验证集的数据预处理
)# 创建训练数据加载器
train_loader=DataLoader(train_dataset,batch_size=32,shuffle=True) # 批量大小为32,打乱数据# 创建验证数据加载器
val_loader=DataLoader(val_dataset,batch_size=32,shuffle=False) # 批量大小为32,不打乱数据# 定义AlexNet模型
class AlexNet(nn.Module):def __init__(self,num_classes=1000): # num_classes为分类的类别数,默认为1000super().__init__()self.features=nn.Sequential(nn.Conv2d(3,48*2,kernel_size=11,stride=4,padding=2), # 卷积层1:输入通道3,输出通道96,卷积核11x11,步长4,填充2nn.ReLU(inplace=True), # ReLU激活函数,inplace=True表示直接修改输入nn.MaxPool2d(kernel_size=3,stride=2), # 最大池化层1:池化窗口3x3,步长2nn.Conv2d(48*2,128*2,kernel_size=5,padding=2), # 卷积层2:输入通道96,输出通道256,卷积核5x5,填充2nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3,stride=2), # 最大池化层2:池化窗口3x3,步长2nn.Conv2d(128*2,192*2,kernel_size=3,padding=1), # 卷积层3:输入通道256,输出通道384,卷积核3x3,填充1nn.ReLU(inplace=True),nn.Conv2d(192*2,192*2,kernel_size=3,padding=1), # 卷积层4:输入通道384,输出通道384,卷积核3x3,填充1nn.ReLU(inplace=True),nn.Conv2d(192*2,128*2,kernel_size=3,padding=1), # 卷积层5:输入通道384,输出通道256,卷积核3x3,填充1nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3,stride=2) # 最大池化层3:池化窗口3x3,步长2)self.classifier=nn.Sequential(nn.Dropout(p=0.5), # Dropout层1:丢弃概率为0.5nn.Linear(128*2*6*6,2048*2), # 全连接层1:输入特征数量为最后一个卷积层的输出大小,输出特征数量为4096nn.ReLU(inplace=True),nn.Dropout(p=0.5), # Dropout层2:丢弃概率为0.5nn.Linear(4096,4096), # 全连接层2:输入特征数量为4096,输出特征数量为4096nn.ReLU(inplace=True),nn.Linear(4096,num_classes) # 全连接层3:输出层,输出特征数量为类别数)def forward(self,x):x=self.features(x) # 通过特征提取层x=torch.flatten(x,1) # 将多维特征展平成一维x=self.classifier(x) # 通过分类器层return  x# 实例化AlexNet模型并将其移动到指定的设备上
model=AlexNet(num_classes=len(train_dataset.classes)).to(device) # 根据训练集类别数设置输出类别数# 定义损失函数为交叉熵损失
cri=torch.nn.CrossEntropyLoss()# 定义优化器为Adam优化器,学习率为0.001
optim=torch.optim.Adam(model.parameters(),lr=0.001)# 设置训练的轮数
epoches=200# 开始训练循环
for epoch in range(epoches):most_acc = 0 # 初始化最佳验证集准确率model.train() # 设置模型为训练模式total_loss = 0 # 初始化训练总损失# 遍历训练数据加载器for i, (images, labels) in enumerate(train_loader):# 将数据移动到指定的设备上images = images.to(device)labels = labels.to(device)# 前向传播,计算模型输出outputs = model(images)# 计算损失loss = cri(outputs, labels)# 反向传播前清空梯度optim.zero_grad()# 反向传播,计算梯度loss.backward()# 更新模型参数optim.step()# 累加每个批次的损失total_loss += loss# 打印训练信息print(f"Epoch [{epoch + 1}/{epoches}], Iter [{i}/{len(train_loader)}], Loss {loss:.4f}")# 计算平均训练损失avg_loss = total_loss / len(train_loader)print(f"Train Data: Epoch [{epoch + 1}/{epoches}], Loss {avg_loss:.4f}")# 进入评估模式model.eval()total, correct, test_loss, total_loss= 0, 0, 0, 0# 在验证集上进行评估,禁用梯度计算with torch.no_grad():# 遍历验证数据加载器for images, labels in val_loader:# 将数据移动到指定的设备上images = images.to(device)labels = labels.to(device)# 前向传播,计算模型输出outputs = model(images)# 计算验证损失test_loss = cri(outputs, labels)# 累加每个批次的验证损失total_loss += test_loss# 获取预测结果_, predicted = torch.max(outputs.data, 1)# 统计总样本数total += labels.size(0)# 统计预测正确的样本数correct += (predicted == labels).sum().item()# 计算平均验证损失avg_test_loss = total_loss / len(val_loader)# 计算验证准确率acc = correct / totalprint(f"Test Data: Epoch [{epoch+1}/{epoches}], Loss {avg_test_loss:.4f}, Accuracy {acc * 100}%")# 如果当前验证准确率是最高的,则保存模型if acc > most_acc:torch.save(model.state_dict(), f"model_best.pth")most_acc = acc# 每隔10个epoch保存一次模型if (epoch+1) % 10 == 0:torch.save(model.state_dict(), f"model_{epoch+1}.pth")

相关文章:

Python----神经网络(基于Alex Net的花卉分类项目)

一、基于Alex Net的花卉分类 1.1、项目背景 在当今快速发展的科技领域,计算机视觉已成为一个备受关注的研究方向。随着深度学习技术的不断进步,图像识别技术得到了显著提升,广泛应用于医疗、安防、自动驾驶等多个领域。其中,花卉…...

影刀RPA开发-魔法指令-玩转图片识别

聊聊天,就能生成指令! 1. 影刀RPA提取图片内容的方式 官方AI识别 集成的第三方识别指令 免费的识别指令 使用python自己编写识别代码,自己安装第三方库 import easyocr# 创建一个 EasyOCR 识别器,指定同时识别中文(简…...

从零开始开发纯血鸿蒙应用之XML解析

从零开始开发纯血鸿蒙应用 〇、前言一、鸿蒙SDK中的 XML API1、ohos.xml2、ohos.convertxml 三、XML 解析实践1、源数据结构2、定义映射关系3、定义接收对象4、获取文章信息 四、总结 〇、前言 在前后端的数据传输方面,论格式化形式,JSON格式自然是首选…...

运算放大器稳定性分析

我们常见的运放电路大多是在闭环状态。那么就必然遵循闭环控制系统的基本原理。闭环控制系统的核心是通过反馈来调节系统的输出,使其更接近期望值。 本文从闭环控制系统的角度,画出同相、反相差分电路的经典控制框图。有了控制框图就可以利用经典控制理论…...

python【扩展库】websockets

文章目录 介绍基础教程安装websockets接收与发送消息介绍 websockets基于python构建websocket服务、客户端的扩展库;官方文档;优点是正确性(严格测试,100%分支覆盖)、简单性(自管理连接)、健壮性、高性能(C扩展加速内存操作),双向通信;基于(python标准异步io框架)…...

leetcode 454. 4Sum II

题目描述 代码&#xff1a; class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int,int> table;int temp 0;for(auto n1:nums1){fo…...

MCP 传输层代码分析

MCP 传输层代码分析 MCP 整体架构说明 引用官方文档原文&#xff1a;Model Context Protocol (MCP) 构建在一个灵活且可扩展的架构上&#xff0c;使 LLM 应用和集成之间的无缝通信成为可能。具体架构细节可以参考文档&#xff08;核心架构 - MCP 中文文档&#xff09;。MCP 采…...

OBS studio 减少音频中的杂音(噪音)

1. 在混音器中关闭除 麦克风 之外的所有的音频输入设备 2.在滤镜中增加“噪声抑制”和“噪声门限”...

java的Stream流处理

Java Stream 流处理详解 Stream 是 Java 8 引入的一个强大的数据处理抽象&#xff0c;它允许你以声明式方式处理数据集合&#xff08;类似于 SQL 语句&#xff09;&#xff0c;支持并行操作&#xff0c;提高了代码的可读性和处理效率。 一、Stream 的核心概念 1. 什么是 Str…...

Windows使用虚拟环境执行sh脚本

在代码文件夹git bash here echo ‘export PATH“/f/anaconda/Scripts:$PATH”’ >> ~/.bashrc echo ‘source /f/anaconda/etc/profile.d/conda.sh’ >> ~/.bashrc source ~/.bashrc conda路径确认 where conda conda activate mmt bash ./online.sh感谢gpt记录…...

Transformer Decoder-Only 算力FLOPs估计

FLOPs和FLOPS的区别 FLOPs &#xff08;Floating Point Operations&#xff09;是指模型或算法执行过程中总的浮点运算次数&#xff0c;单位是“次”FLOPS &#xff08;Floating Point Operations Per Second&#xff09;是指硬件设备&#xff08;如 GPU 或 CPU&#xff09;每…...

数字电子技术基础(五十七)——边沿触发器

目录 1 边沿触发器 1.1 边沿触发器简介 1.1.1 边沿触发器的电路结构 1.3 边沿触发的D触发器和JK触发器 1.3.1 边沿触发的D型触发器 1.3.2 边沿触发的JK触发器 1 边沿触发器 1.1 边沿触发器简介 对于时钟触发的触发器来说&#xff0c;始终都存在空翻的现象&#xff0c;抗…...

05.three官方示例+编辑器+AI快速学习three.js webgl - animation - skinning - ik

本实例主要讲解内容 这个Three.js示例展示了**反向运动学(Inverse Kinematics, IK)**在3D角色动画中的应用。通过加载一个角色模型&#xff0c;演示了如何使用IK技术实现自然的肢体运动控制&#xff0c;如手部抓取物体的动作。 核心技术包括&#xff1a; CCD反向运动学求解器…...

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP&#xff1a;192.168.12.200 cpu:1颗2核 内 存&#xff1a;2GB HDD&#xff1a;20GB 网 络&#xff1a;NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…...

《异常链机制详解:如何优雅地传递Java中的错误信息?》

大家好呀&#xff01;&#x1f44b; 作为一名Java开发者&#xff0c;相信你一定见过各种奇奇怪怪的异常报错。但有没有遇到过这样的情况&#xff1a;明明只调用了一个方法&#xff0c;却看到异常信息像俄罗斯套娃一样一层层展开&#xff1f;&#x1f914; 这就是我们今天要讲的…...

MySQL 数据库集群部署、性能优化及高可用架构设计

MySQL 数据库集群部署、性能优化及高可用架构设计 集群部署方案 1. 主从复制架构 传统主从复制&#xff1a;配置一个主库(Master)和多个从库(Slave)GTID复制&#xff1a;基于全局事务标识符的复制&#xff0c;简化故障转移半同步复制&#xff1a;确保至少一个从库接收到数据…...

什么是深度神经网络

深度神经网络(DNN)详细介绍 1. 定义与核心原理 深度神经网络(Deep Neural Network, DNN)是一种具有多个隐藏层的人工神经网络模型,其核心在于通过层次化的非线性变换逐步提取输入数据的高层次抽象特征。与浅层神经网络相比,DNN的隐藏层数量通常超过三层,例如VGGNet、R…...

深入解析PyTorch中MultiheadAttention的隐藏参数add_bias_kv与add_zero_attn

关键背景 最近在学习pytorch中的源码尤其是nn.modules下算子的实现&#xff0c;针对activation.py下MultiheadAttention下有两个不常见的参数的使用比较有趣&#xff0c;因为时序领域很少使用这两个参数&#xff08;add_bias_kv和add_zero_attn&#xff09;&#xff0c;但是其…...

最大化效率和性能:AKS 中节点池的强大功能

什么是节点池 在 Azure Kubernetes 服务 (AKS) 中&#xff0c;相同配置的节点会被分组到节点池中。这些节点池包含运行应用程序的底层虚拟机。创建 AKS 集群时&#xff0c;您需要定义初始节点数及其大小 (SKU)。随着应用程序需求的变化&#xff0c;您可能需要更改节点池的设置…...

用户态到内核态:Linux信号传递的九重门(一)

1. 信号的认识 1.1. 信号的特点 异步通知&#xff1a;信号是异步的&#xff0c;发送信号的进程无需等待接收进程的响应。预定义事件&#xff1a;每个信号对应一个预定义的事件&#xff08;如终止、中断、段错误等&#xff09;。 轻量级&#xff1a;信号不携带大量数据&#xf…...

c语言第一个小游戏:贪吃蛇小游戏01

hello啊大家好 今天我们用一个小游戏来增强我们的c语言&#xff01; 那就是贪吃蛇 为什么要做一个贪吃蛇小游戏呢&#xff1f; 因为这个小游戏所涉及到的知识有c语言的指针、数组、链表、函数等等可以让我们通过这个游戏来巩固c语言&#xff0c;进一步认识c语言。 一.我们先…...

JAVA EE_网络原理_网络层

晨雾散尽&#xff0c;花影清晰。 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ----------陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;数据库Mysql_联…...

前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读

按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述&#xff1a; 在现代 Web 开发中&#xff0c;性能不再是锦上添花&#xff0c;而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能&#xff0c;我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…...

Flink 系列之十五 - 高级概念 - 窗口

之前做过数据平台&#xff0c;对于实时数据采集&#xff0c;使用了Flink。现在想想&#xff0c;在数据开发平台中&#xff0c;Flink的身影几乎无处不在&#xff0c;由于之前是边用边学&#xff0c;总体有点混乱&#xff0c;借此空隙&#xff0c;整理一下Flink的内容&#xff0c…...

控制台打印带格式内容

1. 场景 很多软件会在控制台打印带颜色和格式的文字&#xff0c;需要使用转义符实现这个功能。 2. 详细说明 2.1.转义符说明 样式开始&#xff1a;\033[参数1;参数2;参数3m 可以多个参数叠加&#xff0c;若同一类型的参数&#xff08;如字体颜色&#xff09;设置了多个&…...

Linux为啥会重新设置中断请求号与中断向量号之间的关系?

Linux内核重新设置中断请求号&#xff08;IRQ&#xff09;与中断向量号之间的关系&#xff0c;主要出于以下核心原因和设计考量&#xff1a; ​1. 硬件多样性与抽象需求​ ​硬件中断号&#xff08;HW Interrupt ID&#xff09;的差异​ 不同处理器架构的中断控制器&#xff08…...

自然语言处理NLP中的连续词袋(Continuous bag of words,CBOW)方法、优势、作用和程序举例

自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例 目录 自然语言处理NLP中的连续词袋&#xff08;Continuous bag of words&#xff0c;CBOW&#xff09;方法、优势、作用和程序举例一、连续词袋( Cont…...

计算机网络笔记(二十二)——4.4网际控制报文协议ICMP

4.4.1ICMP报文的种类 ICMP&#xff08;Internet Control Message Protocol&#xff09;是IP协议的辅助协议&#xff0c;主要用于传递控制消息、错误报告和诊断信息。其报文分为两大类&#xff1a;查询报文和错误报告报文。 1. 错误报告报文&#xff08;Error Messages&#x…...

【AI论文】作为评判者的感知代理:评估大型语言模型中的高阶社会认知

摘要&#xff1a;评估大型语言模型&#xff08;LLM&#xff09;对人类的理解程度&#xff0c;而不仅仅是文本&#xff0c;仍然是一个开放的挑战。 为了弥合这一差距&#xff0c;我们引入了Sentient Agent作为评判者&#xff08;SAGE&#xff09;&#xff0c;这是一个自动评估框…...

Kubernetes生产实战(二十七):精准追踪Pod数据存储位置

在生产环境中&#xff0c;快速定位Pod数据的物理存储位置是运维人员的基本功。本文将揭秘Kubernetes存储系统的核心原理&#xff0c;并提供一套经过实战检验的定位方法体系。 一、存储架构全景图 K8S存储架构 Pod --> Volume Mount --> PVC --> PV --> Storage P…...

极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎

在生成式AI与行业大模型的双重驱动下&#xff0c;人工智能正以前所未有的速度重构互联网产业生态。从内容创作、用户交互到商业决策&#xff0c;AI技术渗透至产品研发、运营的全链条&#xff0c;推动效率跃升与创新模式变革。然而&#xff0c;面对AI技术迭代的爆发期&#xff0…...

[SIGPIPE 错误] 一个 Linux socket 程序,没有任何报错打印直接退出程序

1. 问题 在编写一个程序的时候&#xff0c;当然程序很复杂&#xff0c;遇到了一个 Linux socket 程序&#xff0c;没有任何报错打印直接退出程序&#xff0c;但是在程序里面我有很多 error log &#xff0c;在程序退出的时候完全没有打印。为了说明问题&#xff0c;我编写了一…...

Qt 界面优化(绘图)

目录 1. 绘图基本概念2. 绘制各种形状2.1 绘制线段2.2 绘制矩形2.3 绘制圆形2.4 绘制文本2.5 设置画笔2.6 设置画刷 3. 绘制图片3.1 绘制简单图片3.2 平移图片3.3 缩放图片3.4 旋转图片 4. 其他设置4.1 移动画家位置4.2 保存/加载画家的状态 5. 特殊的绘图设备5.1 QPixmap5.2 Q…...

AQS(AbstractQueuedSynchronizer)解析

文章目录 一、AQS简介二、核心设计思想2.1 核心设计思想回顾2.2 CLH锁队列简介2.3 AQS对CLH队列的改动及其原因 三、核心组件详解3.1 state 状态变量3.2 同步队列 (FIFO双向链表) 四、核心方法深度解析4.1 获取同步状态 (独占模式) - acquire(int arg)4.2 释放同步状态 (独占模…...

Java并发编程常见问题与陷阱解析

引言 随着计算机硬件技术的飞速发展&#xff0c;多核处理器已经变得普遍&#xff0c;Java并发编程的重要性也日益凸显。然而&#xff0c;多线程编程并非易事&#xff0c;其中充满了许多潜在的问题和陷阱。作为一名Java开发工程师&#xff0c;掌握并发编程的常见问题及其解决方案…...

DEEPPOLAR:通过深度学习发明非线性大核极坐标码(1)

原文&#xff1a;《DEEPPOLAR: Inventing Nonlinear Large-Kernel Polar Codes via Deep Learning》 摘要 信道编码设计的进步是由人类的创造力推动的&#xff0c;而且恰如其分地说&#xff0c;这种进步是零星的。极性码是在Arikan极化核的基础上开发的&#xff0c;代表了编码…...

Java多态详解

Java多态详解 什么是多态&#xff1f; 比如我们说&#xff1a;“驾驶一辆车”&#xff0c;有人开的是自行车&#xff0c;有人开的是摩托车&#xff0c;有人开的是汽车。虽然我们都说“开车”&#xff0c;但“怎么开”是由具体的车类型决定的&#xff1a;“开”是统一的动作&a…...

go程序编译成动态库,使用c进行调用

以下是使用 Go 语言打包成 .so 库并使用 C 语言调用的完整步骤&#xff1a; 1. Go 语言打包成 .so 库 &#xff08;1&#xff09;编写 Go 代码 创建一个 Go 文件&#xff08;如 calculator.go&#xff09;&#xff0c;并定义需要导出的函数。导出的函数名必须以大写字母开头…...

iVX:图形化编程与组件化的强强联合

在数字化浪潮中&#xff0c;软件开发范式正经历着从文本到图形的革命性转变。iVX 作为国产可视化编程领域的领军者&#xff0c;以 “图形化逻辑 组件化架构” 的双重创新&#xff0c;重新定义了软件开发的效率边界。其技术突破不仅体现在开发方式的革新&#xff0c;更通过一系…...

华为配置篇-RSTP/MSTP实验

MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP&#xff08;快速生成树协议&#xff09;​ RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改进版本&#xff0c;基于 ​​IEEE 802.1w 标准​​&#xff0c;核心目标是解决传统 STP 收敛速度慢的问…...

端口号被占用怎么解决

windows环境下端口号被占用怎么解决 win r 快捷键打开cmd输入netstat -ano|findstr 端口号 通过这个命令找到pidtaskkill /pid pid端口号 /t /f 如下图所示 命令解读 netstat 是一个网络统计工具&#xff0c;它可以显示协议统计信息和当前的TCP/IP网络连接。 -a 参数告诉 nets…...

GO语言-导入自定义包

文章目录 1. 项目目录结构2. 创建自定义包3. 初始化模块4. 导入自定义包5. 相对路径导入 在Go语言中导入自定义包需要遵循一定的目录结构和导入规则。以下是详细指南&#xff08;包含两种方式&#xff09;&#xff1a; 1. 项目目录结构 方法1&#xff1a;适用于Go 1.11 &#…...

ES常识5:主分词器、子字段分词器

文章目录 一、主分词器&#xff1a;最基础的文本处理单元主分词器的作用典型主分词器示例 二、其他类型的分词器&#xff1a;解决主分词器的局限性1. 子字段分词器&#xff08;Multi-fields&#xff09;2. 搜索分词器&#xff08;Search Analyzer&#xff09;3. 自定义分词器&a…...

NoSQL数据库技术与应用复习总结【看到最后】

第1章 初识NoSQL 1.1 大数据时代对数据存储的挑战 1.高并发读写需求 2.高效率存储与访问需求 3.高扩展性 1.2 认识NoSQL NoSQL--非关系型、分布式、不提供ACID的数据库设计模式 NoSQL特点 1.易扩展 2.高性能 3.灵活的数据模型 4.高可用 NoSQL拥有一个共同的特点&am…...

单片机-STM32部分:12、I2C

飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议&#xff0c;又称I2C协议&#xff0c;是由PHILP公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;IIC属于半双工同步通信方式。 IIC是一种同步…...

【英语笔记(四)】诠释所有16种英语时态,介绍每种时态下的动词变形!!含有所有时态的的动词变形汇总表格

1 时态的单词构成 1.1 现在 1.1.1 一般现在时态 动词原形动词原形s&#xff08;第三人称单数&#xff09; 1.1.1.1 表达事实 I eat carrots. 我吃胡萝卜&#xff1a;我是吃胡萝卜这种食物的.&#xff08;这个是事实陈述&#xff09; The rabbit eats carrots. 兔子吃胡萝卜…...

【质量管理】什么是过程?

在文章【质量管理】谁是顾客&#xff1f;什么是质量链&#xff1f;-CSDN博客 中我们了解了什么是顾客&#xff0c;顾客不仅仅是企业以外的人&#xff0c;在企业的内部我们也有大大小小的顾客。并且我们了解了什么是质量链&#xff0c;企业内部的各种供给方和客户形成了质量链。…...

效率办公新工具:PDF Reader Pro V5.0功能解析与使用体验

在日常文档处理与数字办公的场景中&#xff0c;PDF 文件依然是主流格式之一。从合同审批、项目文档、财务报表&#xff0c;到技术方案和用户手册&#xff0c;PDF 的编辑、转换、标注、归档需求始终存在。 面对这些需求&#xff0c;越来越多用户希望有一款功能完整、跨平台、智…...

Java对象内存布局和对象头

1、面试题 1&#xff09;说下JUC&#xff0c;AQS的大致流程 CAS自旋锁&#xff0c;是获取不到锁就一直自旋吗&#xff1f; 2&#xff09;CAS和synchronized区别在哪里&#xff0c;为什么CAS好&#xff0c;具体优势在哪里&#xff1f; 3&#xff09;sychro…...

Vue 跨域解决方案及其原理剖析

在现代 Web 开发中&#xff0c;跨域问题是前端开发者经常面临的挑战之一。当使用 Vue.js 构建应用时&#xff0c;跨域请求的处理尤为重要。本文将深入探讨 Vue 解决跨域的多种方法及其背后的原理&#xff0c;帮助开发者更好地理解和应对这一常见问题。 一、跨域问题概述 1. 同…...