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

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言

卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分割等任务的核心技术。
CNNs 的核心思想是利用卷积操作(convolution)来提取数据中的局部特征,并通过层次化的结构逐步学习更复杂的模式。

一、卷积神经网络

卷积神经网络,主要用于处理具有网格结构的数据,一般有以下几个关键组成部分:

1.1 输入

输入层是网络的初始数据入口点。在基于图像的任务中,输入层代表图像的像素值。在以下示例中,假设我们正在处理大小为 28x28 像素的灰度图像。

from tensorflow.keras.layers import Inputinput_layer = Input(shape=(28, 28, 1))

1.2 卷积层

卷积层是 CNNs 的核心构建块。这些层通过对输入数据应用卷积操作来提取特征,例如边缘、纹理和模式。

from tensorflow.keras.layers import Conv2Dconv_layer = Conv2D(filters=32, kernel_size=(3, 3),activation='relu')(input_layer)

在卷积神经网络(CNNs)中,“核”和“滤波器”这两个术语经常可以互换使用,它们指的是同一个概念。让我们来剖析一下这两个术语的含义:

2.1 :核是卷积操作中使用的一个小矩阵。它是一组可学习的权重,应用于输入数据以生成输出特征图。核是使 CNNs 能够自动学习输入数据中空间层次特征的关键元素。在图像处理中,核可能是一个 3x3 或 5x5 的小矩阵。

2.2 滤波器:另一方面,滤波器是一组多个核。在大多数情况下,卷积层使用多个滤波器来捕获输入数据中的不同特征。每个滤波器都与输入进行卷积以生成特征图,网络通过在训练过程中调整这些滤波器的权重(参数)来学习提取各种模式。

在这个示例中,我们定义了一个具有 32 个滤波器的卷积层,每个滤波器的大小为 3x3。在训练过程中,神经网络会调整这 32 个滤波器的权重(参数),以从输入数据中学习不同的特征。让我们通过一个图像示例来看一下:

卷积机制

卷积机制。核形状(3x3)。图片来源:OpenGenus

总之,核是滑动或卷积穿过输入数据的小矩阵,而滤波器是一组这样的核,用于从输入中提取各种特征,从而使神经网络能够学习层次化的表示。

1.3 激活层(ReLU)

在卷积操作之后,通常会应用激活函数,通常是修正线性单元(ReLU),以逐元素地引入非线性。ReLU 有助于网络学习复杂的关系,并使模型更具表现力。完全取决于你的用例,你将使用哪种激活函数。在大多数情况下,研究人员使用 ReLU,也有一些其他激活函数可以使用,例如 Leaky ReLU、ELU。

ReLU 激活

ReLU 激活。来源:ResearchGate

在 Python 中实现修正线性单元(ReLU)函数非常简单。ReLU 是一种常用于神经网络的激活函数,用于引入非线性。以下是一个简单的 Python 实现:

def relu(x):return max(0, x)

1.4 池化层

池化层(例如 最大池化平均池化)会降低由卷积层生成的特征图的空间维度。例如,最大池化会从一组值中选择最大值,专注于最显著的特征。

最大池化 — 平均池化

最大池化 — 平均池化。来源:ResearchGate

池化层可以降低空间维度。最大池化通常被使用:

from tensorflow.keras.layers import MaxPooling2Dpooling_layer = MaxPooling2D(pool_size=(2, 2))(conv_layer)

1.5 全连接(密集)层

全连接层将一层中的每个神经元连接到下一层中的每个神经元。这些层通常位于网络的末端,将学到的特征转换为预测或类别概率。全连接层通常用于分类任务:

from tensorflow.keras.layers import Dense, Flattenflatten_layer = Flatten()(pooling_layer)
dense_layer = Dense(units=128, activation='relu')(flatten_layer)

1.6 Dropout 层

Dropout 层用于正则化,以防止过拟合。在训练过程中,随机神经元会被“丢弃”,即忽略它们,迫使网络学习更健壮和泛化的特征。它通过在训练过程中随机忽略输入单元的一部分来帮助防止过拟合:

Dropout 机制

Dropout 机制。来源:nagadakos

from tensorflow.keras.layers import Dropoutdropout_layer = Dropout(rate=0.5)(dense_layer)

1.7 批量归一化层

批量归一化(BN)是一种用于神经网络的技术,用于稳定和加速训练过程。它通过在训练过程中调整和缩放输入来归一化输入。批量归一化的数学细节涉及归一化、缩放和移动操作。让我们深入探讨批量归一化的数学原理。

假设我们有一个大小为 m 的小批量,包含 n 个特征。批量归一化的输入可以总结如下:

7.1. 计算均值:计算每个特征的小批量的均值 μ

均值计算

数组 X 的均值

这里,_xi_​ 表示小批量中第 i 个特征的值。

7.2. 计算方差:计算每个特征的小批量的方差 σ²

方差计算

方差计算

7.3. 归一化:通过减去均值并除以标准差 (σ) 来归一化输入:

归一化范围

这里,ϵ 是一个很小的常数,用于避免除以零。

7.4. 缩放和移动:引入可学习的参数 (γβ) 来缩放和移动归一化的值:

每个批次的缩放

这里,γ 是缩放参数,β 是移动参数。

批量归一化操作通常插入在神经网络层的激活函数之前。它已被证明具有正则化效果,并可以减轻内部协变量偏移等问题,使训练更稳定、更快。以下是一个简单的批量归一化代码,用于 CNN 或任何深度神经网络:

from tensorflow.keras.layers import BatchNormalizationbatch_norm_layer = BatchNormalization()(dropout_layer)

总之,批量归一化归一化输入,缩放和移动归一化的值,并引入可学习的参数,以便网络在训练过程中进行调整。批量归一化的使用已成为深度学习架构的标准实践。

1.8 展平层

展平层将多维特征图转换为一维向量,为输入到全连接层做准备。

flatten_layer = Flatten()(batch_norm_layer)

1.9 上采样层

上采样是一种用于深度学习的技术,用于增加特征图的空间分辨率。它通常用于图像分割和生成等任务。以下是常见上采样方法的简要描述:

9.1. 最近邻(NN)上采样:最近邻(NN)上采样,也称为通过复制或重复进行上采样,是一种简单直观的方法。在这种方法中,输入中的每个像素都会被复制或重复以生成更大的输出。虽然简单,但 NN 上采样可能会导致块状伪影和细节丢失,因为它不会在相邻像素之间进行插值。

最近邻上采样

9.2. 转置卷积(反卷积)上采样:转置卷积通常称为反卷积,是一种可学习的上采样方法。它涉及使用具有可学习参数的卷积操作来增加输入的空间维度。转置卷积层中的权重在优化过程中进行训练,允许网络学习特定于任务的上采样模式。

转置卷积上采样

import tensorflow as tf
from tensorflow.keras.layers import Conv2DTranspose# 转置卷积上采样
transposed_conv_upsampling = Conv2DTranspose(filters=32, kernel_size=(3, 3), strides=(2, 2), padding='same')

每种上采样方法都有其优势和权衡,选择取决于任务的具体需求和数据的特性。

二、填充和步长

填充和步长是卷积神经网络(CNNs)中的关键概念,它们会影响卷积操作后输出特征图的大小。让我们讨论三种类型的填充,并解释步长的概念。

2.1 有效填充(无填充)

在有效填充中,也称为无填充,输入在应用卷积操作之前不会添加任何额外的填充。因此,卷积操作仅在滤波器与输入完全重叠的地方进行。这通常会导致输出特征图的空间维度减小。

有效填充

from tensorflow.keras.layers import Conv2D# 有效填充
valid_padding_conv = Conv2D(filters=32, kernel_size=(3, 3),strides=(1, 1), padding='valid')

2.2 相同填充

相同填充确保输出特征图具有与输入相同的空间维度。它通过向输入添加零填充来实现,使得滤波器可以在输入上滑动而不会超出其边界。填充量会计算以保持维度相同。

相同填充

from tensorflow.keras.layers import Conv2D# 填充在 Keras 中
same_padding_conv = Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='same')

2.4 步长

步长定义了滤波器在卷积过程中跨输入移动的步长。较大的步长会导致输出特征图的空间维度减小。步长可以调整以控制网络中的下采样程度。

from tensorflow.keras.layers import Conv2D# 示例:在 Keras 中带有步长的卷积
conv_with_stride = Conv2D(filters=32, kernel_size=(3, 3), strides=(2, 2), padding='same')

在这个示例中,步长设置为 (2, 2),表示滤波器在水平和垂直方向上每次移动两个像素。步长是一个关键参数,用于控制特征图的空间分辨率并影响网络的感受野。

三、图像分类

下面从头开始构建一个简单的卷积神经网络。来进行计算机视觉中最流行的分类任务之一:猫与狗分类

3.1 导入库

import tensorflow_datasets as tfds
import tensorflow as tf
from tensorflow.keras import layersimport keras
from keras.models import Sequential, Model
from keras.layers import Dense, Conv2D, Flatten, MaxPooling2D, GlobalAveragePooling2D
from keras.utils import plot_modelimport numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import cv2

3.2 加载数据:猫与狗数据集

!curl -O https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_5340.zip
!unzip -q kagglecatsanddogs_5340.zip
!ls

下面的单元格将对图像进行预处理,并在输入到我们的模型之前创建批次。

def augment_images(image, label):# 转换为浮点数image = tf.cast(image, tf.float32)# 归一化像素值image = (image/255)# 调整大小为 300 x 300image = tf.image.resize(image, (300, 300))return image, label# 使用上述工具函数对图像进行预处理
augmented_training_data = train_data.map(augment_images)# 在训练前打乱并创建批次
train_batches = augmented_training_data.shuffle(1024).batch(32)

3.3 过滤损坏的图像

在处理大量真实世界的图像数据时,损坏的图像很常见。让我们过滤掉不包含“JFIF”字符串的损坏图像。

import osnum_skipped = 0
for folder_name in ("Cat", "Dog"):folder_path = os.path.join("PetImages", folder_name)for fname in os.listdir(folder_path):fpath = os.path.join(folder_path, fname)try:fobj = open(fpath, "rb")is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)finally:fobj.close()if not is_jfif:num_skipped += 1# 删除损坏的图像os.remove(fpath)print("Deleted %d images" % num_skipped)

3.4 生成 Dataset

image_size = (300, 300)
batch_size = 128train_ds, val_ds = tf.keras.utils.image_dataset_from_directory("PetImages",validation_split=0.2,subset="both",seed=1337,image_size=image_size,batch_size=batch_size,
)

3.5 可视化数据

以下是训练数据集中的前 9 张图像。正如你所看到的,标签 1 是“狗”,标签 0 是“猫”。

import matplotlib.pyplot as pltplt.figure(figsize=(6, 6))
for images, labels in train_ds.take(1):for i in range(9):ax = plt.subplot(3, 3, i + 1)plt.imshow(images[i].numpy().astype("uint8"))plt.title(int(labels[i]))plt.axis("off")

标注数据集

狗:1,猫:0

3.6 使用图像数据增强

当你没有一个大型图像数据集时,通过应用随机但现实的变换(如随机水平翻转或小随机旋转)来人为地引入样本多样性是一种很好的做法。这有助于让模型接触到训练数据的不同方面,同时减缓过拟合。

data_augmentation = keras.Sequential([layers.RandomFlip("horizontal"),layers.RandomRotation(0.1),]
)

让我们通过反复将 data_augmentation 应用于数据集中的第一张图像,来看看增强后的样本是什么样的:

plt.figure(figsize=(6, 6))
for images, _ in train_ds.take(1):for i in range(9):augmented_images = data_augmentation(images)ax = plt.subplot(3, 3, i + 1)plt.imshow(augmented_images[0].numpy().astype("uint8"))plt.axis("off")

图像增强

图像增强。(示例:翻转、旋转)

3.7 配置数据集以提高性能

让我们将数据增强应用于我们的训练数据集,并确保使用缓冲预取,以便我们可以在不阻塞 I/O 的情况下从磁盘获取数据。

# 将 `data_augmentation` 应用于训练图像。
train_ds = train_ds.map(lambda img, label: (data_augmentation(img), label),num_parallel_calls=tf.data.AUTOTUNE,
)
# 在 GPU 内存中预取样本有助于最大化 GPU 利用率。
train_ds = train_ds.prefetch(tf.data.AUTOTUNE)
val_ds = val_ds.prefetch(tf.data.AUTOTUNE)

3.8 构建分类器

这将看起来很熟悉,因为它几乎与我们之前构建的模型相同。关键区别在于输出只是一个单位,使用 Sigmoid 激活。这是因为我们只处理两个类别。

class CustomModel(Sequential):def __init__(self):super(CustomModel, self).__```pythonsuper(CustomModel, self).__init__()self.add(Conv2D(16, input_shape=(300, 300, 3), kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(32, kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(64, kernel_size=(3, 3), activation='relu', padding='same'))self.add(MaxPooling2D(pool_size=(2, 2)))self.add(Conv2D(128, kernel_size=(3, 3), activation='relu', padding='same'))self.add(GlobalAveragePooling2D())self.add(Dense(1, activation='sigmoid'))# 实例化自定义模型
model = CustomModel()# 显示模型摘要
model.summary()

模型的损失函数可以根据之前的设置进行调整,以适应两个类别的分类任务。为此,我们选择 binary_crossentropy

# 训练大约需要 30 分钟才能完成,如果使用 GPU 的话。
# 如果你的本地机器没有 GPU,可以免费使用 Google Colab 来获取 GPU 访问权限。model.compile(loss='binary_crossentropy',metrics=['accuracy'],optimizer=tf.keras.optimizers.RMSprop(lr=0.001))
model.fit(train_ds,epochs=25,validation_data=val_ds,)

3.9 测试模型

让我们下载一些图像,看看分类激活图是什么样子的。

!wget -O cat1.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/cat1.jpg
!wget -O cat2.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/cat2.jpg
!wget -O catanddog.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/catanddog.jpg
!wget -O dog1.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/dog1.jpg
!wget -O dog2.jpg https://storage.googleapis.com/laurencemoroney-blog.appspot.com/MLColabImages/dog2.jpg
# 工具函数,用于预处理图像并显示分类激活图
def convert_and_classify(image):# 加载图像img = cv2.imread(image)# 在输入到模型之前对图像进行预处理img = cv2.resize(img, (300, 300)) / 255.0# 添加一个批次维度,因为模型需要它tensor_image = np.expand_dims(img, axis=0)# 获取特征和预测结果features, results = cam_model.predict(tensor_image)# 生成分类激活图show_cam(tensor_image, features, results)convert_and_classify('cat1.jpg')
convert_and_classify('cat2.jpg')
convert_and_classify('catanddog.jpg')
convert_and_classify('dog1.jpg')
convert_and_classify('dog2.jpg')

3.10 输出

在这里插入图片描述

相关文章:

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络(Convolutional Neural Networks,简称 CNNs)是一种深度学习架构,专门用于处理具有网格结构的数据,如图像、视频等。它们在计算机视觉领域取得了巨大成功,成为图像分类、目标检测、图像分…...

永磁同步电机无速度算法--拓展卡尔曼滤波器

一、原理介绍 以扩展卡尔曼滤波算法为基础,建立基于EKF算法的估算转子位置和转速的离散模型。 实时性是扩展卡尔曼滤波器的一种特征,所以它可实时跟踪系统的状态并进行有效的输出,同时,它可以减少干扰、抑制噪声,其效…...

电机控制常见面试问题(十五)

文章目录 一、电机气隙二、电气时间三.电机三环控制详解四.驱动板跳线意义 一、电机气隙 电机气隙是定子和转子之间的空隙,防止钉子转子运转时物理接触,此外,气隙是磁路的重要环节,磁场需通过气隙传递能量,但其较高的…...

a2字幕分享

1. 沟通communication Hey everybody Welcome to this A2 English listening practice video. You can use this video to practice your listening and comprehension as I speak. Before we start, remember to download the Listening Time podcast and become a member a…...

基于cat1的多传感器融合的贵重资产管理解决方案项目说明书

一、产品需求 在物流运输中,搭载 Cat 1 模块的贵重货物跟踪设备,可将货物的位置、震动、温湿度等数据及时传输给物流调度中心,以便及时应对运输途中可能出现的问题,如路线偏离、货物受损风险等 。而且,Cat 1 依托成熟的…...

deepseek使用记录23——我们的遭遇

世界观设定 时间:近未来2035年,全球进入"数字绩效社会"地点:重庆赛博朋克风格的"云端之城",外卖骑手被称为"数据蜂鸟"核心科技:情感区块链系统,人类情绪波动可转化为能量币…...

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目: 思路: 被标签害了,用什么二分( 很简单的思维题,首先如果a > b,那么全选a就行了,还搞啥活动 否则就选 b - a 天来搞活动,为什么? 首先如果我…...

PEFT简介

以下是关于 PEFT(Parameter-Efficient Fine-tuning) 的简介,涵盖其定义、核心思想、常见方法及应用场景: 1. 什么是PEFT? PEFT(参数高效微调)是机器学习领域的一种技术,专为预训练大…...

harmonyOS NEXT开发与前端开发深度对比分析

文章目录 1. 技术体系概览1.1 技术栈对比1.2 生态对比 2. 开发范式比较2.1 鸿蒙开发范式2.2 前端开发范式 3. 框架特性对比3.1 鸿蒙 Next 框架特性3.2 前端框架特性 4. 性能优化对比4.1 鸿蒙性能优化4.2 前端性能优化 5. 开发工具对比5.1 鸿蒙开发工具5.2 前端开发工具 6. 学习…...

Unity小框架之单例模式基类

单例模式(Singleton Pattern)是一种常用的创建型设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点。它常用于需要控制资源访问、共享配置或管理全局状态的场景(如数据库连接池、日志管理器、应用配置…...

随机过程的基本概念机有限维分布的数字特征

随机过程的基本概念及有限维分布的数字特征:从理论到应用 在现代科学与技术的众多领域中,随机过程的身影无处不在,它如同一位神秘的幕后操纵者,影响着我们生活的方方面面。今天,咱们就一起来深入探究随机过程的基本概…...

langchain如何并行调用运行接口

文章目录 概要并行化步骤 概要 RunnableParallel 原语本质上是一个字典,其值是运行接口(或可以被强制转换为运行接口的事物,如函数)。它并行运行所有值,并且每个值都使用 RunnableParallel 的整体输入进行调用。最终返…...

如何理解语义web中提到本体的概念

在语义Web(Semantic Web)中,“本体”(Ontology)是一个核心概念,它源自哲学中的“存在论”,但在计算机科学中被重新定义为一种形式化的、共享的领域知识模型。本体的核心目标是解决数据之间的语义…...

基于大模型的声带息肉预测及诊疗方案优化研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义与创新点 二、大模型预测原理与方法 2.1 大模型技术概述 2.2 数据收集与处理 2.3 模型构建与训练 2.4 模型评估指标 三、术前预测与评估 3.1 息肉特征预测 3.1.1 大小与位置预测 3.1.2 形态与性质预测 3.2 患者身体…...

cesium 实现万级管网数据渲染,及pickImageryLayerFeatures原生方法改写

需求背景解决效果getFeatureInfo 需求背景 在用 geoserver 渲染图层时,会自动触发 GetFeatureInfo ,与服务器通信,在万级海量数据渲染下,这个性能消耗就可以感受到了 需要考虑的点: 1.通过enablePickFeatures&#xf…...

基于金融产品深度学习推荐算法详解【附源码】

深度学习算法说明 1、简介 神经网络协同过滤模型(NCF) 为了解决启发式推荐算法的问题,基于神经网络的协同过滤算法诞生了,神经网络的协同过滤算法可以 通过将用户和物品的特征向量作为输入,来预测用户对新物品的评分,从而解决…...

【Linux】centos配置可用的yum源

在 CentOS 系统中配置可用的 YUM 源(仓库)是保持系统更新和软件包管理的重要步骤。下面是一些步骤和示例,帮助你配置可用的 YUM 源: 1. 备份当前 YUM 仓库配置 首先,备份你当前的 YUM 仓库配置文件,以防万…...

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS(Linux Virtual Server)是一种基于 Linux 内核的负载均衡技术,它通过 IPVS(IP Virtual Server)模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…...

PHP与数据库连接常见问题及解决办法

PHP与数据库连接常见问题及解决办法 在现代Web开发中,PHP与数据库的连接是不可或缺的一部分。无论是构建动态网站、内容管理系统(CMS)还是电子商务平台,PHP与数据库的交互都是核心功能之一。然而,在实际开发过程中&am…...

HarmonyOS-应用程序框架基础

应用程序框架与应用模型的区别 应用框架可以看做是应用模型的一种实现方式,开发人员可以用应用模型来描述应用程序的结构和行为的描述,然后使用应用程序框架来实现这些描述。 应用模型 应用模型是一个应用程序的模型,它是一种抽象的描述&a…...

使用 Doris 和 LakeSoul

作为一种全新的开放式的数据管理架构,湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求,在企业的大数据体系中已经得到越来越…...

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用:开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明(游戏规则)1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…...

国内Mac,nimi安装homebrew完整过程

安装命令: 常规安装脚本: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 极速安装脚本: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.…...

C++基础——从C语言快速入门

目录 输入输出 标准输出流 ( cout ) 标准输入流 ( cin ) 标准错误流 ( cerr ) 和标准日志流 ( clog ) 编程示例 基本变量类型 宽字符的用法 climits 如何使用 编程示例 注意事项 流程控制 条件语句 循环语句 跳转语句 函数 函数的基本结构 编程示例 函数的组成…...

玩转python:通俗易懂掌握高级数据结构-collections模块之Counter

引言 Counter是Python中collections模块提供的一个强大工具,用于统计可哈希对象的出现次数。它非常适合用于频率统计、词频分析、数据聚合等场景。本文将详细介绍Counter的关键用法和特性,并通过8个丰富的案例帮助读者掌握其应用。 关键用法和特性表格 …...

Windows远程桌面黑屏怎么办?

在使用Windows远程桌面连接另一台电脑时,用户经常会遇到Windows远程桌面黑屏的问题。那么,该如何有效地解决Windows远程桌面黑屏的问题呢?遇到远程桌面连接黑屏的问题时,可以通过在本地组策略编辑器中禁用WDDM图形显示驱动来解决。…...

82.HarmonyOS NEXT 性能优化指南:从理论到实践

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 性能优化指南:从理论到实践 文章目录 HarmonyOS NEXT 性能优化指南:从理论到实践1. 性能优化概述1.1 性能指…...

python笔记2

变量:含义 一个容器,计算机当中的存储空间。 可以理解为一个用于标识或引用数据的名字或标签。 作用: 可以通过定义一个变量来给需要使用多次的数据命名,就像一个标签一样。下次需要使用这个数据时,只需要通过这个变…...

深度学习 Deep Learning 第1章 深度学习简介

第1章 深度学习简介 概述 本章介绍人工智能(AI)和深度学习领域,讨论其历史发展、关键概念和应用。解释深度学习如何从早期的AI和机器学习方法演变而来,以及如何有效解决之前方法无法应对的挑战。 关键概念 1. 人工智能的演变 …...

Nest系列:NestJS 中 Logger 完全指南:从基础到企业级实践-04

一、Logger 的核心价值 在服务端应用中,日志系统承担着三大核心职责: 系统监控:实时反馈应用健康状态问题追踪:快速定位异常根源行为审计:记录关键业务操作NestJS 内置的日志系统提供了开箱即用的解决方案,支持: ✅ 多日志级别管理 ✅ 上下文感知日志 ✅ 自定义输出格式…...