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

【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践

深度神经网络系列文章

  • 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进
  • 【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践

引言

在深度学习的广阔天地中,卷积神经网络(CNN)是计算机视觉领域的经典模型,卷积神经网络(CNN)凭借其强大的特征提取能力,成为了图像识别领域的中流砥柱。今天,就带大家深入剖析一个基于TensorFlow/Keras实现的简单CNN模型,看看它是如何在手写数字识别任务(MNIST数据集)中大显身手的。

本文以MNIST手写数字识别任务为例,演示如何通过TensorFlow/Keras工程化实现一个轻量级CNN,代码包含完整的数据处理、模型训练与推理流程,并特别注重实际开发中的可维护性设计。

一、环境与工具

好的工程始于好的框架。在这个项目中,我们使用Python作为编程语言,借助TensorFlow/Keras库来构建CNN模型。

环境与工具

  • Python 3.8+
  • TensorFlow 2.10+
  • Matplotlib(可视化支持)

为了使整个工程结构清晰、易于维护,我们将代码划分为多个功能模块。

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
import builtins
import datetime

以上是项目的基本信息和依赖库的导入。

二、数据预处理

数据是模型的粮食,高质量的数据预处理是模型成功的关键。MNIST数据集是一个经典的手写数字数据集,包含了60000张训练图像和10000张测试图像,每张图像的大小为28x28像素。

def main():"""主函数:return:"""# 1. 加载并预处理数据print('加载并预处理数据')(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()# 归一化并调整形状(添加通道维度)train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255# 转换标签为one-hot编码train_labels = tf.keras.utils.to_categorical(train_labels)test_labels = tf.keras.utils.to_categorical(test_labels)

在这里,我们首先加载了MNIST数据集,并对图像数据进行了归一化处理,将像素值从0-255的范围缩放到0-1之间。这样做的目的是为了加速模型的收敛。同时,我们还调整了图像的形状,添加了一个通道维度,以满足CNN模型的输入要求。对于标签数据,我们将其转换为one-hot编码格式,以便于模型的分类任务。

MNIST加载的数据集的train_images为60000张像素大小为28x28,内容如下:
MNIST数据集

其中to_categorical 用于将整数类别标签转换为 one-hot 编码,而one-hot编码是一种方便计算机处理的二元编码,适用于多分类任务中标签的格式化处理。

  • 输入:一维整数数组(如 [0, 2, 1, 2])。
  • 输出:二维矩阵,每一行对应一个样本的 one-hot 向量(如 [[1,0,0], [0,0,1], [0,1,0], [0,0,1]])。
  • 入参y:待转换的整数标签数组。
  • 入参num_classes(可选):总类别数。若不指定,自动根据标签最大值推断(max(y) + 1)。

三、模型构建

接下来,我们开始构建CNN模型。这个模型由几个基本的层组成:卷积层、池化层、展平层和全连接层。

    # 2. 构建CNN模型print('构建CNN模型')model = models.Sequential([# 卷积层:32个3x3滤波器,激活函数ReLUlayers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),# 最大池化层:2x2窗口layers.MaxPooling2D((2, 2)),# 展平层:将3D特征转换为1D向量layers.Flatten(),# 全连接层:128个神经元layers.Dense(128, activation='relu'),# 输出层:10个类别(数字0-9)layers.Dense(10, activation='softmax')])

卷积层使用了32个3x3的滤波器,激活函数采用了ReLU(Rectified Linear Unit,修正线性单元,f(x)=max(0,x)),它能够有效地解决梯度消失问题,加速模型的训练。最大池化层使用2x2的窗口,对特征图进行下采样,减少参数数量,提高模型的计算效率。展平层将三维的特征图转换为一维向量,以便于全连接层的处理。全连接层包含了128个神经元,最后的输出层有10个神经元,对应着10个数字类别,激活函数使用了softmax,用于多分类任务。

四、模型编译

在模型构建完成后,我们需要对其进行编译,指定优化器、损失函数以及评估指标。

    # 3. 编译模型print('编译模型')model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

这里我们选择了Adam优化器,它是一种自适应学习率的优化算法,能够根据模型的训练情况自动调整学习率。损失函数选择了 categorical_crossentropy,它适用于多分类问题。评估指标我们选择了准确率(accuracy),用于衡量模型的分类性能。

五、模型训练

现在,我们开始对模型进行训练。在训练过程中,我们指定了训练数据、标签、训练轮数(epochs)、批量大小(batch_size)以及验证集的比例。

    # 4. 训练模型print('训练模型...')history = model.fit(train_images, train_labels,epochs=2,batch_size=64,validation_split=0.2)

在这里,我们设置了训练轮数为2,批量大小为64,验证集的比例为0.2,即从训练数据中划分出20%的数据作为验证集,用于在训练过程中评估模型的性能,防止过拟合。

参数选择依据

  • epochs=2:MNIST数据简单,2轮即可快速验证流程正确性
  • batch_size=64:在GPU显存允许范围内最大化批次提升训练速度

六、模型评估

训练完成后,我们需要对模型在测试集上的性能进行评估。

    # 5. 评估模型print('评估模型...')test_loss, test_acc = model.evaluate(test_images, test_labels)print(f'\n测试准确率: {test_acc:.4f}')

通过 model.evaluate 方法,我们可以得到测试集上的损失值和准确率。这能够让我们直观地了解模型在未见过的数据上的表现。

七、模型预测与可视化

最后,我们使用模型对测试集中的第一个样本进行预测,并将预测结果与真实标签进行比较,同时绘制图像。

    # 取测试集第一个样本test_image = test_images[0]true_label = test_labels[0].argmax()prediction = model.predict(test_image.reshape(1, 28, 28, 1)).argmax()plot_prediction(test_image, true_label, prediction)def plot_prediction(image, true_label, prediction):plt.figure()plt.imshow(image.squeeze(), cmap='gray')# 设置字体,支持中文显示plt.rcParams["font.sans-serif"] = ["SimHei"]plt.title(f'真实: {true_label}, 预测: {prediction}')plt.axis('off')plt.show()

通过这个过程,我们可以直观地看到模型的预测结果是否正确,同时也能对模型的性能有一个更直观的感受。

八、完整代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @ProjectName: Ai
# @Name: 20250305-CNN.py
# @Auth: arbboter
# @Date: 2025/3/5-9:44
# @Desc: 使用Python和TensorFlow/Keras实现的简单卷积神经网络(CNN),用于手写数字识别(MNIST数据集),代码包含训练、评估和预测示例。
# @Ver : 0.0.0.1
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
import builtins
import datetimedef main():"""主函数:return:"""# 1. 加载并预处理数据print('加载并预处理数据')(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()# 归一化并调整形状(添加通道维度)train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255# 转换标签为one-hot编码train_labels = tf.keras.utils.to_categorical(train_labels)test_labels = tf.keras.utils.to_categorical(test_labels)# 2. 构建CNN模型print('构建CNN模型')model = models.Sequential([# 卷积层:32个3x3滤波器,激活函数ReLUlayers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),# 最大池化层:2x2窗口layers.MaxPooling2D((2, 2)),# 展平层:将3D特征转换为1D向量layers.Flatten(),# 全连接层:128个神经元layers.Dense(128, activation='relu'),# 输出层:10个类别(数字0-9)layers.Dense(10, activation='softmax')])# 3. 编译模型print('编译模型')model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 4. 训练模型print('训练模型...')history = model.fit(train_images, train_labels,epochs=2,batch_size=64,validation_split=0.2)# 5. 评估模型print('评估模型...')test_loss, test_acc = model.evaluate(test_images, test_labels)print(f'\n测试准确率: {test_acc:.4f}')# 取测试集第一个样本test_image = test_images[0]true_label = test_labels[0].argmax()prediction = model.predict(test_image.reshape(1, 28, 28, 1)).argmax()plot_prediction(test_image, true_label, prediction)def plot_prediction(image, true_label, prediction):plt.figure()plt.imshow(image.squeeze(), cmap='gray')# 设置字体,支持中文显示plt.rcParams["font.sans-serif"] = ["SimHei"]plt.title(f'真实: {true_label}, 预测: {prediction}')plt.axis('off')plt.show()def hook_print():def my_print(*args, **kwargs):old_print('[', datetime.datetime.now(), end="] ")old_print(*args, **kwargs)old_print = builtins.printbuiltins.print = my_printif __name__ == '__main__':hook_print()main()

九、运作结果

结果输出
注意:首次运行程序会自动下载训练和测试数据集,比较费时间。

十、工程实践中的注意事项

在实际的工程实践中,我们需要注意以下几个方面:

  1. 数据预处理:数据的质量直接影响模型的性能。除了归一化和one-hot编码外,还可以考虑对数据进行增强,如旋转、平移、缩放等操作,以增加模型的泛化能力。

  2. 模型结构:根据实际任务的需求,合理设计模型的结构。可以尝试增加卷积层的数量、调整滤波器的大小和数量,以及改变全连接层的神经元数量,以提高模型的性能。

  3. 模型训练:选择合适的优化器、学习率和训练轮数。可以使用早停(early stopping)、学习率衰减等技巧,防止过拟合,提高模型的泛化能力。

  4. 模型评估:除了准确率外,还可以考虑使用其他评估指标,如精确率(precision)、召回率(recall)、F1值等,从多个角度评估模型的性能。

  5. 模型部署:在模型训练完成后,需要将其部署到实际的应用场景中。可以使用TensorFlow Serving等工具,将模型封装为API,供其他应用程序调用。

总之,基于TensorFlow/Keras实现的简单CNN模型,为我们提供了一种高效、便捷的手写数字识别解决方案。在实际的工程实践中,我们需要根据具体的需求和数据特点,灵活调整模型的结构和训练策略,以实现最佳的性能。

结语

本实现仅用35行核心代码完成端到端的CNN训练与验证,准确率达98%+。通过模块化设计、日志增强和可视化组件,展现了工业级代码的雏形。读者可在此基础上扩展更复杂的网络结构或部署功能。

相关文章:

【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践

深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在深度…...

深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势

首先,让我们一起回顾运维的进化之路,然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前,我们称之为传统运维,其主要特点是: 人工驱动…...

2025年全球生成式AI消费应用发展趋势报告

原文链接:The Top 100 Gen AI Consumer Apps - 4th Edition | Andreessen Horowitz 核心要点:本报告由a16z发布,深度解析了2025年全球生成式AI消费应用的发展格局,揭示了技术迭代与商业化加速的双重趋势。 报告显示,A…...

VBA 列方向合并单元格,左侧范围大于右侧范围

实现功能如下: excel指定行列范围内的所有单元格 规则1:每一列的连续相同的值合并单元格 规则2:每一列的第一个非空单元格与其下方的所有空白单元格合并单元 规则3:优先左侧列合并单元格,合并后,右侧的单元…...

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…...

【弹性计算】异构计算云服务和 AI 加速器(二):适用场景

异构计算云服务和 AI 加速器(二):适用场景 1.图形处理2.视频处理3.计算4.人工智能 异构计算 目前已经被广泛地应用于生产和生活当中,主要应用场景如下图所示。 1.图形处理 GPU 云服务器在传统的图形处理领域具有强大的优势&…...

JVM常用概念之移动GC和局部性

问题 非移动GC一定比移动GC好吗? 基础知识 移动GC和非移动GC 移动GC 在进行垃圾回收时,为了减少碎片而移动对象来顺利完成垃圾回收的GC。 Serial GC 在单线程环境下,它在标记-清除(Mark-Sweep)算法的基础上进行…...

微服务保护:Sentinel

home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多,比如: 请求限流 线程隔离 服务熔断 服务故障最重要原因,就是并发太高!解决了这个问题,就能避免大部分故障。当然,接口的并发…...

使用Wireshark截取并解密摄像头画面

在物联网(IoT)设备普及的今天,安全摄像头等智能设备在追求便捷的同时,往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据,而非加密的 HTTPS,从而给潜在攻击者留下了可乘之机。本文…...

IDEA 基础配置: maven配置 | 服务窗口配置

文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...

20250-3-8 树的存储结构

一、树的逻辑结构回顾 树:一个分支结点可以有多课子树 如果按照二叉树的存储来实现树的存储,则只依靠数组下标,无法反映结点之间的逻辑关系。 二、双亲表示法(顺序存储) 1.因此:我们可以用链式存储的方法&…...

Visual-RFT视觉强化微调:用「试错学习」教会AI看图说话

📜 文献卡 英文题目: Visual-RFT: Visual Reinforcement Fine-Tuning;作者: Ziyu Liu; Zeyi Sun; Yuhang Zang; Xiaoyi Dong; Yuhang Cao; Haodong Duan; Dahua Lin; Jiaqi WangDOI: 10.48550/arXiv.2503.01785摘要翻译: 像OpenAI o1这样的大型推理模型中的强化微调…...

PDF处理控件Aspose.PDF,如何实现企业级PDF处理

PDF处理为何成为开发者的“隐形雷区”? “手动调整200页PDF目录耗时3天,扫描件文字识别错误导致数据混乱,跨平台渲染格式崩坏引发客户投诉……” 作为开发者,你是否也在为PDF处理的复杂细节消耗大量精力?Aspose.PDF凭…...

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama,它能支持很多大模型。官方网站:https://ollama.com/ 点击 Download 即可,支持macOS,Linux 和 Windows;我下载的是 mac 版本,要求macOS 11 Big Sur or later,Ol…...

Swift Package Manager (SPM) 创建并集成本地库

在macOS 项目中,使用 Swift Package Manager (SPM) 创建并集成本地库的完整步骤。 创建一个macos应用程序,选择 swift、oc、swiftui都可以。 创建好应用之后,开始创建SPM本地库。 打开终端app,进入项目根目录,逐次输…...

分布式锁—6.Redisson的同步器组件

大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...

文献分享: ConstBERT固定数目向量编码文档

😂图放这了,大道至简的 idea \text{idea} idea不愧是 ECIR \text{ECIR} ECIR 👉原论文 1. ConstBERT \textbf{1. ConstBERT} 1. ConstBERT的原理 1️⃣模型的改进点:相较于 ColBERT \text{ColBERT} ColBERT为每个 Token \text{Tok…...

如何使用SSH命令安全连接并转发端口到远程服务器

ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令:用于登录远程服务器,进行交互式操作。第二条命令:用于建立 SSH 隧道,进行端口转…...

SolidWorks 转 PDF3D 技术详解

在现代工程设计与制造流程中,不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式,能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项,…...

9.2 EvictionManager源码解读

本节重点总结 : evictionManager初始化了两个相同的manager对象 evictionManager做本机驱逐pod的判定和厨房evictionAdmitHandler用来kubelet创建Pod前进依据本机的资源压力进行准入检查 evictionManager判断内存驱逐阈值有两种方法 第一种使用内核的memcg的通知机制&#xff…...

考研数一非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...

整理一下高级设施农业栽培学这门课程的所有知识点

整理一下高级设施农业栽培学这门课程的所有知识点 以下是高级设施农业栽培学这门课程从入门到精通需要学习的知识点: 一、设施农业概述 设施农业的概念与发展历程 了解设施农业的定义、特点及作用,掌握其发展历程、现状与未来趋势。熟悉国内外设施农业…...

2025最新软件测试面试八股文(含答案+文档)

1、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 参考答案: 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程…...

系统架构设计师—系统架构设计篇—基于体系结构的软件开发方法

文章目录 概述基于体系结构的开发模型-ABSDM体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构演化 概述 基于体系结构(架构)的软件设计(Architecture-Based Software Design,ABSD)方法。 AB…...

求最大公约数【C/C++】

大家好啊,欢迎来到本博客( •̀ ω •́ )✧,我将带领大家详细的了解最大公约数的思想与解法。 一、什么是公约数 公约数,也称为公因数,是指两个或多个整数共有的因数。具体来说,如果一个整数能被两个或多个整数整除&…...

Transformer 代码剖析16 - BLEU分数(pytorch实现)

一、BLEU算法全景图 #mermaid-svg-uwjb5mQ2KAC6Rqbp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-icon{fill:#552222;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-text{fill:#552222;stroke:…...

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...

labelimg标注的xml标签转换为yolo格式标签

本文不生产技术,只做技术的搬运工!!! 前言 在yolo训练时,我们需要对图像进行标注,而使用labelimg标注时如果直接选择输出yolo格式的数据集,则原始数据的很多信息无法被保存,因此一版…...

Linux云计算SRE-第十七周

1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...

K8S学习之基础十八:k8s的灰度发布和金丝雀部署

灰度发布 逐步扩大新版本的发布范围,从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器,观察其表现,再决定是否全面推广。 特点&…...

WSL with NVIDIA Container Toolkit

一、wsl 下安装 docker 会提示安装 docekr 桌面版,所以直接安装 docker 桌面版本即可 二、安装 NVIDIA Container Toolkit NVIDIA Container Toolkit仓库 https://github.com/NVIDIA/nvidia-container-toolkit​github.com/NVIDIA/nvidia-container-toolkit 安装…...

PAT线上考试 真题/注意细节(甲/乙级)

闲谈 从此以后!参加竞赛! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 重要的事情说三遍,毕竟这只是我参加各种竞赛的开始! \(&#xff…...

springcloud sentinel教程

‌QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...

摄相机标定的基本原理

【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型: 定义: 内参:就像相机的“眼睛”。它描述了相机内部的特性,比如焦距(镜头的放…...

HJ C++11 Day2

Initializer Lists 对于一个类P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…...

在 ASP.NET Core 中启用 Brotli 和 Gzip 响应压缩

在本文中&#xff0c;我们将探讨如何在 ASP.NET Core 应用程序中启用响应压缩&#xff0c;重点介绍 Brotli 和 Gzip 算法以及如何验证压缩是否有效。 什么是响应压缩&#xff1f; 响应压缩通过使用Brotli 或 Gzip等算法来最小化 HTTP 响应的大小。这些算法在传输文本资产&#…...

leetcode69.x 的平方根

题目&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。…...

第11章 web应用程序安全(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第11章开始学习利用web应用程序安全&#xff0c;主要讲信息收集、dns以及burpsuite&#xff0c;现在的资产测绘也…...

flac、kgg、kgma格式音频转换MP3

1. 选择需要转换的音频文件 2. 下载闪电音频格式转换器 闪电音频格式转换器-全面覆盖常见音乐格式_音频合并分割_音频压缩 3. 买会员有点贵&#xff0c;也没必要&#xff0c;偶尔转换一次的&#xff0c;就去闲鱼买&#xff0c;两天会员9块钱。 4. 闲鱼卖家给兑换码&#xff0c…...

macos 程序 运行

sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件...

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

HTML5 表单属性

HTML5 表单属性 引言 HTML5作为新一代的网页标准,带来了许多新的特性和改进。在表单处理方面,HTML5引入了一系列新的表单属性,这些属性使得表单的创建和使用更加灵活和强大。本文将详细介绍HTML5表单属性,包括其功能、使用方法和注意事项。 一、HTML5表单属性概述 HTML…...

从0开始,手搓Tomcat

一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器&#xff0c;它不仅能够提供 HTTP 服务&#xff0c;还能够运行 Java Servlet 和 JavaServer Pages&#xff08;JSP&#xff09;。对于许多开发者来说&#xff0c;理解 Tomcat 的目录结构以及如何在该结构中组织应用…...

数列分块入门2

题目描述 给出一个长为 n n n 的数列&#xff0c;以及 n n n 个操作&#xff0c;操作涉及区间加法&#xff0c;询问区间内小于某个值 x x x 的元素个数。 输入格式 第一行输入一个数字 n n n。 第二行输入 n n n 个数字&#xff0c;第 i i i 个数字为 a i a_i ai​&a…...

【ThreeJS Basics 06】Camera

文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动&#xff08;可以看到后面&#xff09; 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…...

postman接口请求中的 Raw是什么

前言 在现代的网络开发中&#xff0c;API 的使用已经成为数据交换的核心方式之一。然而&#xff0c;在与 API 打交道时&#xff0c;关于如何发送请求体&#xff08;body&#xff09;内容类型的问题常常困扰着开发者们&#xff0c;尤其是“raw”和“json”这两个术语之间的区别…...

docker1

前言 技术架构 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 写入主的时候&#xff0c;要同步Mysql从的数据才可以 冷热分离架构 写的时候要写入主和缓存数据库 读的时候先去缓存看有没有&#xff0c;没有的话就去从数据库读数据 主要就是看这个数据是…...

RocketMQ延迟消息深度解析:原理、实践与性能调优

RocketMQ延迟消息深度解析&#xff1a;原理、实践与性能调优 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 一、…...

RabbitMQ 高级特性解析:RabbitMQ 消息可靠性保障 (上)

RabbitMQ 核心功能 RabbitMQ 高级特性解析&#xff1a;RabbitMQ 消息可靠性保障 &#xff08;上&#xff09;-CSDN博客 RabbitMQ 高级特性&#xff1a;从 TTL 到消息分发的全面解析 &#xff08;下&#xff09;-CSDN博客 前言 最近再看 RabbitMQ&#xff0c;看了看自己之前写…...

大白话JavaScript实现一个函数,将数组中的元素进行去重

大白话JavaScript实现一个函数&#xff0c;将数组中的元素进行去重 答题思路 要实现数组元素去重的函数&#xff0c;核心思路是遍历数组&#xff0c;然后判断每个元素是否已经在新数组里存在&#xff0c;如果不存在就添加进去&#xff0c;存在则跳过。下面会介绍几种不同的实…...