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

【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(2/2)

 一、说明

在本文中,讨论了深度学习中使用的所有常见损失函数,并在NumPy,PyTorch和TensorFlow中实现了它们。

(二-五)见

六、稀疏分类交叉熵损失

        稀疏分类交叉熵损失类似于分类交叉熵损失,但在真实标签作为整数而不是独热编码提供时使用。它通常用作多类分类问题中的损失函数。

稀疏分类交叉熵损失的公式为:

L = -1/N * sum(log(Y_hat_i))

        其中 是每个样本的真实类标签的预测概率,是样本数。Y_hat_iiN

        换句话说,该公式计算每个样本的真实类标签的预测概率的负对数,然后对所有样本的这些值求平均值。

        与对真实标签使用独热编码的分类交叉熵损失不同,稀疏分类交叉熵损失直接使用整数标签。每个样本的真实标签表示为 0 到 之间的单个整数值,其中 是类的数量。iC-1C

6.1 在 NumPy 中的实现

import numpy as npdef sparse_categorical_crossentropy(y_true, y_pred):# convert true labels to one-hot encodingy_true_onehot = np.zeros_like(y_pred)y_true_onehot[np.arange(len(y_true)), y_true] = 1# calculate lossloss = -np.mean(np.sum(y_true_onehot * np.log(y_pred), axis=-1))return loss

        在此实现中, 是整数标签数组,是每个样本的预测概率数组。该函数首先使用 NumPy 的高级索引功能将真实标签转换为独热编码格式,以创建一个形状数组,其中是样本数和类数,每行对应于单个样本的真实标签分布。y_truey_pred(N, C)NC

然后,该函数使用上一个答案中描述的公式计算损失:。这是使用 NumPy 的广播实现的,其中创建一个形状数组,其中每个元素表示 和 中相应元素的乘积。然后,该函数用于对维度求和,并用于对维度求平均值。-1/N * sum(log(Y_hat_i))y_true_onehot * np.log(y_pred)(N, C)y_true_onehotnp.log(y_pred)sumCmeanN

下面是如何使用该函数的示例:

# define true labels as integers and predicted probabilities as an array
y_true = np.array([1, 2, 0])
y_pred = np.array([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss)

        这将输出给定输入的稀疏分类交叉熵损失的值。

6.2 TensorFlow 中的实现

import tensorflow as tfdef sparse_categorical_crossentropy(y_true, y_pred):loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False)return loss# define true labels as integers and predicted probabilities as a tensor
y_true = tf.constant([1, 2, 0])
y_pred = tf.constant([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss.numpy())

在此实现中, 是整数标签数组,是每个样本的预测概率数组。该函数使用 TensorFlow 提供的函数来计算损失。设置该参数以确保 表示概率而不是对数值。y_truey_predtf.keras.losses.sparse_categorical_crossentropyfrom_logitsFalsey_pred

6.3 在 PyTorch 中的实现

import torch.nn.functional as F
import torchdef sparse_categorical_crossentropy(y_true, y_pred):loss = F.cross_entropy(y_pred, y_true)return loss# define true labels as integers and predicted logits as a tensor
y_true = torch.tensor([1, 2, 0])
y_pred = torch.tensor([[0.1, 0.8, 0.1], [0.3, 0.2, 0.5], [0.4, 0.3, 0.3]])# calculate the loss
loss = sparse_categorical_crossentropy(y_true, y_pred)# print the loss
print(loss.item())

        在此实现中, 是一个整数标签数组,并且是每个样本的预测对数数组。该函数使用 PyTorch 的函数来计算损失。张量应该具有形状,其中是样本的数量,是类的数量。y_truey_predF.cross_entropyy_pred(N, C)NC

七、骰子损失

        骰子损失,也称为索伦森-骰子系数或 F1 分数,是图像分割任务中使用的损失函数,用于测量预测分割与地面实况之间的重叠。骰子损失范围从 0 到 1,其中 0 表示没有重叠,1 表示完全重叠。

骰子损失定义为:

Dice Loss = 1 - (2 * intersection + smooth) / (sum of squares of prediction + sum of squares of ground truth + smooth)

        其中 是预测和地面真实掩码的元素乘积,是一个平滑常数(通常是一个较小的值,例如 1e-5),以防止除以零,并且总和将覆盖掩码的所有元素。intersectionsmooth

        骰子损失可以在各种深度学习框架中实现,如TensorFlow,PyTorch和NumPy。该实现涉及使用框架中可用的逐元素乘积和求和运算计算交集和平方和。

7.1 在 NumPy 中的实现

import numpy as npdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = np.sum(y_true * y_pred, axis=(1,2,3))sum_of_squares_pred = np.sum(np.square(y_pred), axis=(1,2,3))sum_of_squares_true = np.sum(np.square(y_true), axis=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,分别是基本事实和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothsumsquare

        请注意,此实现假定 和 是具有维度的 4D 数组。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, height, width, num_classes)

7.2 TensorFlow 中的实现

import tensorflow as tfdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = tf.reduce_sum(y_true * y_pred, axis=(1,2,3))sum_of_squares_pred = tf.reduce_sum(tf.square(y_pred), axis=(1,2,3))sum_of_squares_true = tf.reduce_sum(tf.square(y_true), axis=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,和 是 TensorFlow 张量分别表示地面真相和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothreduce_sumsquare

请注意,此实现假定 和 是具有维度的 4D 张量。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, height, width, num_classes)

7.3 在 PyTorch 中的实现

import torchdef dice_loss(y_true, y_pred, smooth=1e-5):intersection = torch.sum(y_true * y_pred, dim=(1,2,3))sum_of_squares_pred = torch.sum(torch.square(y_pred), dim=(1,2,3))sum_of_squares_true = torch.sum(torch.square(y_true), dim=(1,2,3))dice = 1 - (2 * intersection + smooth) / (sum_of_squares_pred + sum_of_squares_true + smooth)return dice

        在此实现中,和 是 PyTorch 张量分别表示基本事实和预测掩码。该参数用于防止被零除。和函数分别用于计算交集和平方和。最后,使用上一个答案中描述的公式计算骰子损失。y_truey_predsmoothsumsquare

请注意,此实现假定 和 是具有维度的 4D 张量。如果您的掩码具有不同的形状,则可能需要相应地修改实现。y_truey_pred(batch_size, num_classes, height, width)

八、KL散度损失

        KL(Kullback-Leibler)散度损失是两个概率分布彼此差异程度的度量。在机器学习的上下文中,它通常用作损失函数来训练从给定分布生成新样本的模型。

        两个概率分布 p 和 q 之间的 KL 散度定义为:

        KL(p||q) = sum(p(x) * log(p(x) / q(x)))

        在机器学习的上下文中,p 表示真实分布,q 表示预测分布。KL 散度损失衡量预测分布与真实分布的匹配程度。

        KL 散度损失可用于各种任务,例如图像生成、文本生成和强化学习。但是,由于它具有非凸形式,因此可能很难优化。

        在实践中,KL散度损失通常与其他损失函数(如交叉熵损失)结合使用。通过将KL散度损失添加到交叉熵损失中,鼓励模型生成不仅与目标分布匹配,而且与训练数据具有相似分布的样本。

8.1 在 NumPy 中的实现

import numpy as npdef kl_divergence_loss(p, q):return np.sum(p * np.log(p / q))

在此实现中,和 是分别表示真实分布和预测分布的 numpy 数组。KL 背离损失使用上述公式计算。pq

请注意,此实现假定并具有相同的形状。如果它们具有不同的形状,则可能需要相应地修改实现。pq

8.2 TensorFlow 中的实现

   tf.keras.losses.KLDivergence()是 TensorFlow 中的一个内置函数,用于计算两个概率分布之间的 KL 背离损失。它可以用作各种机器学习任务中的损失函数,例如图像生成、文本生成和强化学习。

        下面是一个用法示例:tf.keras.losses.KLDivergence()

import tensorflow as tf# define true distribution and predicted distribution
p = tf.constant([0.2, 0.3, 0.5])
q = tf.constant([0.4, 0.3, 0.3])# compute KL divergence loss
kl_loss = tf.keras.losses.KLDivergence()(p, q)print(kl_loss.numpy())

        在此示例中,和 是 TensorFlow 张量分别表示真实分布和预测分布。该函数用于计算 和 之间的 KL 散度损失。结果是一个表示损失值的标量张量。pqtf.keras.losses.KLDivergence()pq

        请注意,通过将 和 具有不同形状的情况广播到通用形状,自动处理这些情况。此外,您还可以通过设置函数的参数来调整 KL 散度损失相对于模型中其他损失的权重,该参数控制损失的聚合方式。tf.keras.losses.KLDivergence()pqreduction

8.3 在 PyTorch 中的实现

        在 PyTorch 中,KL 散度损失可以使用模块计算。下面是一个示例实现:torch.nn.KLDivLoss

import torchdef kl_divergence_loss(p, q):criterion = torch.nn.KLDivLoss(reduction='batchmean')loss = criterion(torch.log(p), q)return lossIn this implementation, p and q are PyTorch tensors representing the true distribution and predicted distribution, respectively. The torch.nn.KLDivLoss module is used to compute the KL divergence loss between p and q. The reduction parameter is set to 'batchmean' to compute the mean loss over the batch.

        请注意,和 应该是概率,沿最后一个维度的总和为 1。该函数用于在将 的对数传递给模块之前获取对数。这是因为模块期望输入是对数概率。pqtorch.logptorch.nn.KLDivLoss

九、平均绝对误差 (MAE) 损耗 / L1 损耗

        L1 损失,也称为平均绝对误差 (MAE) 损失,是深度学习中用于回归任务的常见损失函数。它测量目标变量的预测值和真实值之间的绝对差异。

        L1损失的公式为:

        L1 LOSS = 1/n * Σ|y_pred — y_true|

        其中 n 是样本数,y_pred 是预测值,y_true 是真实值。

        简单来说,L1 损失是预测值和真实值之间绝对差值的平均值。它对异常值的敏感度低于均方误差 (MSE) 损失,因此对于可能受异常值影响的模型来说,它是一个不错的选择。

9.1 在 Numpy 中的实现

import numpy as npdef l1_loss(y_pred, y_true):loss = np.mean(np.abs(y_pred - y_true))return loss

L1 损失的 NumPy 实现与公式非常相似,其中您从真实值中减去预测值并取绝对值。然后,取所有样本中这些绝对差异的平均值,以获得平均 L1 损失。

9.2 TensorFlow 中的实现

import tensorflow as tfdef l1_loss(y_pred, y_true):loss = tf.reduce_mean(tf.abs(y_pred - y_true))return loss

在 TensorFlow 中,您可以使用该函数计算所有样本中预测值和真实值之间的绝对差值的平均值。tf.reduce_mean()

9.3 在 PyTorch 中的实现

import torchdef l1_loss(y_pred, y_true):loss = torch.mean(torch.abs(y_pred - y_true))return loss

在 PyTorch 中,您可以使用该函数计算所有样本中预测值和真实值之间的绝对差值的平均值。torch.mean()

十、Huber 胡贝尔损失

        Huber 损失是回归任务中使用的损失函数,它对异常值的敏感度低于均方误差 (MSE) 损失。它被定义为MSE损失和平均绝对误差(MAE)损失的组合,其中损失函数是MSE表示小误差,MAE表示较大误差。这使得Huber损失比MSE损失对异常值更稳健。

        Huber 损失函数定义如下:

L(y_pred, y_true) = 1/n * sum(0.5 * (y_pred - y_true)^2)   if |y_pred - y_true| <= delta1/n * sum(delta * |y_pred - y_true| - 0.5 * delta^2)   otherwise

        其中 是样本数,是预测值,是真实值,并且是确定在 MSE 和 MAE 损失之间切换的阈值的超参数。ny_predy_truedelta

        当 ,损失函数是 MSE 损失。当 时,损失函数是斜率为 的 MAE 损失。|y_pred - y_true| <= delta|y_pred - y_true| > deltadelta

        在实践中,通常设置为平衡 MSE 和 MAE 损耗的值,例如 。delta1.0

10.1 在 Numpy 中的实现

import numpy as npdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = np.abs(error)quadratic = np.minimum(abs_error, delta)linear = (abs_error - quadratic)return np.mean(0.5 * quadratic ** 2 + delta * linear)

        此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

        该函数首先计算预测值和真值之间的绝对误差,然后根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数返回所有样本的平均Huber损失。deltaabs_error <= deltaabs_error > delta

        您可以在基于 numpy 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

10.2 TensorFlow 中的实现

import tensorflow as tfdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = tf.abs(error)quadratic = tf.minimum(abs_error, delta)linear = (abs_error - quadratic)return tf.reduce_mean(0.5 * quadratic ** 2 + delta * linear)

此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

该函数首先使用该函数计算预测值和真值之间的绝对误差,然后使用 and 运算符根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数使用该函数返回所有样本的平均Huber损失。tf.absdeltatf.minimum-abs_error <= deltaabs_error > deltatf.reduce_mean

您可以在基于 TensorFlow 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

10.3 在 PyTorch 中的实现

import torch.nn.functional as Fdef huber_loss(y_pred, y_true, delta=1.0):error = y_pred - y_trueabs_error = torch.abs(error)quadratic = torch.min(abs_error, delta)linear = (abs_error - quadratic)return 0.5 * quadratic ** 2 + delta * linear

        此函数将预测值、真值和超参数作为输入,并返回 Huber 损失。y_predy_truedelta

        该函数首先使用该函数计算预测值和真值之间的绝对误差,然后使用 and 运算符根据超参数将误差拆分为两个分量。二次分量是 时的 MSE 损耗,线性分量是 时的 MAE 损耗。最后,该函数使用公式返回 Huber 损失。torch.absdeltatorch.min-abs_error <= deltaabs_error > delta0.5 * quadratic ** 2 + delta * linear

        您可以在基于 PyTorch 的回归任务中使用此函数,方法是使用预测值和真实值以及所需值调用它。delta

相关文章:

【深度学习所有损失函数】在 NumPy、TensorFlow 和 PyTorch 中实现(2/2)

一、说明 在本文中&#xff0c;讨论了深度学习中使用的所有常见损失函数&#xff0c;并在NumPy&#xff0c;PyTorch和TensorFlow中实现了它们。 (二-五)见 六、稀疏分类交叉熵损失 稀疏分类交叉熵损失类似于分类交叉熵损失&#xff0c;但在真实标签作为整数而不是独热编码提…...

Hazel 引擎学习笔记

目录 Hazel 引擎学习笔记学习方法思考引擎结构创建工程程序入口点日志系统Premake\MD没有 cpp 文件的项目会出错include 到某个库就要包含这个库的路径&#xff0c;注意头文件展开 事件系统 获取和利用派生类信息预编译头文件抽象窗口类和 GLFWgit submodule addpremake 脚本禁…...

Linux系统下Redis3.2集群

本节主要学习reids主从复制的概念&#xff0c;作用&#xff0c;缺点&#xff0c;流程&#xff0c;搭建&#xff0c;验证&#xff0c;reids哨兵模式的概念&#xff0c;作用&#xff0c;缺点&#xff0c;结构&#xff0c;搭建&#xff0c;验证等。 文章目录 一、redis主从复制 …...

Android图形-合成与显示-SurfaceTestDemo

目录 引言&#xff1a; 主程序代码&#xff1a; 结果呈现&#xff1a; 小结&#xff1a; 引言&#xff1a; 通过一个最简单的测试程序直观Android系统的native层Surface的渲染显示过程。 主程序代码&#xff1a; #include <cutils/memory.h> #include <utils/L…...

高压放大器怎么设计(高压放大器设计方案)

高压放大器是一种用于将低电压信号转换成高电压信号的电子设备&#xff0c;广泛应用于通信、雷达、医疗设备等领域。在设计高压放大器时&#xff0c;需要考虑多种因素&#xff0c;如输入输出信号的特性、电路结构的选择、电源和负载匹配等。本文将介绍高压放大器的设计方法和注…...

SpringBoot yml配置注入

yaml语法学习 1、配置文件 SpringBoot使用一个全局的配置文件 &#xff0c; 配置文件名称是固定的 application.properties 语法结构 &#xff1a;keyvalue application.yml 语法结构 &#xff1a;key&#xff1a;空格 value 配置文件的作用&#xff1a;修改SpringBoot自动…...

中科亿海微乘法器(LPMMULT)

引言 FPGA&#xff08;可编程逻辑门阵列&#xff09;是一种可在硬件级别上重新配置的集成电路。它具有灵活性和可重构性&#xff0c;使其成为处理各种应用的理想选择&#xff0c;包括数字信号处理、图像处理、通信、嵌入式系统等。在FPGA中&#xff0c;乘法器是一种重要的硬件资…...

Redis_持久化(AOF、RDB)

6. Redis AOF 6.1 简介 目前&#xff0c;redis的持久化主要应用AOF&#xff08;Append Only File&#xff09;和RDF两大机制&#xff0c;AOF以日志的形式来记录每个写操作&#xff08;增量保存&#xff09;&#xff0c;将redis执行过的所有指令全部安全记录下来&#xff08;读…...

开源数据库Mysql_DBA运维实战 (部署服务篇)

前言❀ 1.数据库能做什么 2.数据库的由来 数据库的系统结构❀ 1.数据库系统DBS 2.SQL语言(结构化查询语言) 3.数据访问技术 部署Mysql❀ 1.通过rpm安装部署Mysql 2.通过源码包安装部署Mysql 前言❀ 1.数据库能做什么 a.不论是淘宝&#xff0c;吃鸡&#xff0c;爱奇艺…...

【Java学习】System.Console使用

背景 在自学《Java核心技术卷1》的过程中看到了对System.Console的介绍&#xff0c;编写下列测试代码&#xff0c; public class ConsoleTest {public static void main(String[] args) {Console cs System.console();String name cs.readLine("AccountInfo: ");…...

从零学算法154

154.已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,4] 若旋转 7 次&#…...

95 | Python 设计模式 —— 策略模式

策略模式(Strategy Pattern) 引言 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装在独立的策略类中,使得这些算法可以相互替换,而不影响客户端的使用。策略模式可以让客户端根据不同的需求选择不同的算法,从而使得系统更加灵活和可扩展。 在本…...

【BASH】回顾与知识点梳理(十九)

【BASH】回顾与知识点梳理 十九 十九. 循环 (loop)19.1 while do done, until do done (不定循环)19.2 for...do...done (固定循环)19.3 for...do...done 的数值处理(C写法)19.4 搭配随机数与数组的实验19.5 shell script 的追踪与 debug19.6 what_to_eat-2.sh debug结果解析 该…...

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里&#xff0c;但是我却定位不到&#xff01;&#xff01; Selenium定位元素的方法有很多种&#xff0c;像是通过id、name、class_name、tag_name、link_text等等&#xff0c;但是这些方法局限性太大&#xff0c; 随着自动…...

计算机基础之RAID技术

概述 RAID&#xff0c;Redundant Array of Independent Disks&#xff0c;独立磁盘冗余阵列&#xff0c;一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组&#xff08;逻辑硬盘&#xff09;&#xff0c;从而提供比单个硬盘更高的存储…...

辽宁线上3D三维虚拟工厂生产仿真系统应用场景及优势

工厂虚拟仿真是一种基于计算机技术和虚拟现实技术的数字化解决方案&#xff0c;它可以通过模拟工厂中的设备、流程和操作&#xff0c;来为工程师和操作人员提供了一个沉浸式的虚拟环境&#xff0c;帮助他们更好地了解和优化工厂生产过程。 工厂VR三维可视化技术为工业生产提供了…...

csrf跨站请求的相关装饰器、Auth模块(模块的使用、相关方法、退出系统、修改密码功能、注册功能)、扩展默认的auth_user表

一、csrf跨站请求的相关装饰器 django.middleware.csrf.CsrfViewMiddlewareDjango中有一个中间件对csrf跨站做了验证&#xff0c;我只要把csrf的这个中间件打开&#xff0c; 那就意味着所有的方法都要被验证 在所有的视图函数中&#xff1a;只有几个视图函数做验证只有几个函数…...

(WWW2023)论文阅读-Detecting Social Media Manipulation in Low-ResourceLanguages

论文链接&#xff1a;https://arxiv.org/pdf/2011.05367.pdf 摘要 社交媒体被故意用于恶意目的&#xff0c;包括政治操纵和虚假信息。大多数研究都集中在高资源语言上。然而&#xff0c;恶意行为者会跨国家/地区和语言共享内容&#xff0c;包括资源匮乏的语言。 在这里&#xf…...

centos-stream-9 centos9 配置国内yum源 阿里云源

源配置 tips: yum配置文件路径 /etc/yum.repos.d/centos.repo 1.备份源配置 [Very Important!]mv /etc/yum.repos.d/centos.repo /etc/yum.repos.d/centos.repo.backup2.Clean Cache: yum clean all3.Backup the Old CentOS-Base.repo If exist this file.cd /etc/yum.repos.…...

查看单元测试用例覆盖率新姿势:IDEA 集成 JaCoCo

1、什么是 IDEA IDEA 全称 IntelliJ IDEA&#xff0c;是 Java 编程语言开发的集成环境。IntelliJ 在业界被公认为最好的 Java 开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE 支持、各类版本工具(git、SVN 等)、JUnit、CVS 整合、代码分析、 创新的 GUI…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...