PyTorch 激活函数及非线性变换详解

激活函数是深度学习模型的重要组成部分,它们引入非线性,从而使模型能够更好地拟合复杂的数据模式。本文将详细介绍激活函数的作用、常见类型、经典应用示例,并比较它们的优缺点。

激活函数的作用

激活函数的主要作用是引入非线性变换,使神经网络能够拟合复杂的数据模式。为了理解这句话的含义,我们需要详细探讨以下几个方面:

  1. 线性变换的局限性
  2. 非线性变换的必要性
  3. 激活函数的作用
  4. 实际应用中的激活函数
1. 线性变换的局限性

线性变换是指一种保持向量加法和标量乘法的运算。在几何上,线性变换通常包括旋转、缩放、平移等操作。线性变换可以用矩阵乘法来表示。对于一个输入向量 x \mathbf{x} x 和一个线性变换矩阵 A \mathbf{A} A,线性变换的输出 y \mathbf{y} y 可以表示为:

y = A x + b \mathbf{y} = \mathbf{A} \mathbf{x} + \mathbf{b} y=Ax+b

其中, A \mathbf{A} A 是一个矩阵, b \mathbf{b} b 是一个偏置向量。

特性

  • 线性变换的输出是输入的线性组合。
  • 线性变换不会改变输入数据的线性关系。
  • 线性变换的图形表示通常是直线或平面。

示例
假设我们有一个向量 x = [ x 1 , x 2 ] T \mathbf{x} = [x_1, x_2]^T x=[x1,x2]T,一个线性变换矩阵 A = [ a 11 a 12 a 21 a 22 ] \mathbf{A} = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix} A=[a11a21a12a22] 和一个偏置向量 b = [ b 1 , b 2 ] T \mathbf{b} = [b_1, b_2]^T b=[b1,b2]T,线性变换的结果是:

y = A x + b = [ a 11 a 12 a 21 a 22 ] [ x 1 x 2 ] + [ b 1 b 2 ] \mathbf{y} = \mathbf{A} \mathbf{x} + \mathbf{b} = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \end{bmatrix} y=Ax+b=[a11a21a12a22][x1x2]+[b1b2]

2. 非线性变换的必要性

现实世界中的数据往往具有复杂的非线性关系。例如,图像中的物体识别、语音识别和自然语言处理等任务,数据的模式通常是高度非线性的。为了捕捉这些复杂的关系,我们需要引入非线性变换。

非线性变换是指一种不保持向量加法和标量乘法的运算。非线性变换可以引入复杂的关系,使得模型能够拟合复杂的数据模式。在神经网络中,非线性变换通常由激活函数实现。

特性

  • 非线性变换的输出不是输入的线性组合。
  • 非线性变换可以改变输入数据的线性关系,捕捉到更复杂的模式。
  • 非线性变换的图形表示通常是曲线或复杂的几何形状。

示例
假设我们有一个输入向量 x = [ x 1 , x 2 ] T \mathbf{x} = [x_1, x_2]^T x=[x1,x2]T 和一个非线性变换函数 f f f,非线性变换的结果是:

y = f ( x ) \mathbf{y} = f(\mathbf{x}) y=f(x)

如果 f f f 是 ReLU 激活函数,那么非线性变换可以表示为:

y = max ⁡ ( 0 , x ) \mathbf{y} = \max(0, \mathbf{x}) y=max(0,x)

3. 激活函数的作用

激活函数的主要作用是引入非线性变换,从而使神经网络能够拟合复杂的数据模式。激活函数在每个神经元的输出上进行非线性变换,使得整个网络能够学习和表示复杂的非线性关系。

在没有激活函数的情况下,神经网络的每一层都只是对上一层的线性变换。无论网络有多少层,这种线性组合的结果仍然是线性的。因此,没有激活函数的深度网络实际上等价于一个线性模型,无法有效地处理复杂的非线性关系。

通过在每一层之间引入激活函数,神经网络能够在每一层进行非线性变换,使得整个网络可以表示高度复杂的非线性函数。这种非线性变换赋予了神经网络强大的表达能力,使其能够拟合复杂的数据模式。

常见的激活函数
1. ReLU(Rectified Linear Unit)

数学表达式
ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

优点

  • 计算简单,速度快。
  • 缓解梯度消失问题,尤其在深层网络中表现良好。
  • 稀疏激活:大部分神经元的输出为零,有助于网络的稀疏性。

缺点

  • “神经元死亡”问题:在训练过程中,如果神经元的输出一直为零,那么这个神经元将永远不会激活。
  • 负值部分梯度为零,可能导致部分神经元无法更新。

适用场景

  • 广泛应用于各种深度学习模型,尤其是卷积神经网络(CNN)。

代码示例

import torch
import torch.nn as nn# 定义 ReLU 激活函数
relu = nn.ReLU()# 示例输入张量
input_tensor = torch.tensor([-1.0, 0.0, 1.0, 2.0])# 应用 ReLU 激活函数
output_tensor = relu(input_tensor)
print(output_tensor)
2. Sigmoid

数学表达式
Sigmoid ( x ) = 1 1 + e − x \text{Sigmoid}(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=1+ex1

优点

  • 输出范围在 (0, 1) 之间,适用于输出概率的场景。
  • 平滑且连续,适用于某些需要概率输出的任务。

缺点

  • 容易导致梯度消失问题,尤其在深层网络中。
  • 输出不以零为中心,可能导致训练过程中的梯度不平衡。

适用场景

  • 适用于二分类问题的输出层。

代码示例

import torch
import torch.nn as nn# 定义 Sigmoid 激活函数
sigmoid = nn.Sigmoid()# 示例输入张量
input_tensor = torch.tensor([-1.0, 0.0, 1.0, 2.0])# 应用 Sigmoid 激活函数
output_tensor = sigmoid(input_tensor)
print(output_tensor)
3. Tanh(Hyperbolic Tangent)

数学表达式
Tanh ( x ) = e x − e − x e x + e − x \text{Tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} Tanh(x)=ex+exexex

优点

  • 输出范围在 (-1, 1) 之间,输出以零为中心,有助于梯度的平衡。
  • 平滑且连续,能够捕捉到输入的细微变化。

缺点

  • 容易导致梯度消失问题,尤其在深层网络中。

适用场景

  • 适用于需要对称输出的场景,如生成对抗网络(GAN)中的生成器。

代码示例

import torch
import torch.nn as nn# 定义 Tanh 激活函数
tanh = nn.Tanh()# 示例输入张量
input_tensor = torch.tensor([-1.0, 0.0, 1.0, 2.0])# 应用 Tanh 激活函数
output_tensor = tanh(input_tensor)
print(output_tensor)
4. LeakyReLU

数学表达式
LeakyReLU ( x ) = { x if  x ≥ 0 α x if  x < 0 \text{LeakyReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{if } x < 0 \end{cases} LeakyReLU(x)={xαxif x0if x<0

其中, α \alpha α 是一个小的常数,通常取值为 0.01。

优点

  • 缓解了 ReLU 的“神经元死亡”问题。
  • 保持了 ReLU 的大部分优点,如计算简单和稀疏激活。

缺点

  • 需要额外的超参数 α \alpha α,可能需要进行调优。

适用场景

  • 适用于需要避免“神经元死亡”问题的场景。

代码示例

import torch
import torch.nn as nn# 定义 LeakyReLU 激活函数,负斜率为 0.01
leaky_relu = nn.LeakyReLU(negative_slope=0.01)# 示例输入张量
input_tensor = torch.tensor([-1.0, 0.0, 1.0, 2.0])# 应用 LeakyReLU 激活函数
output_tensor = leaky_relu(input_tensor)
print(output_tensor)
激活函数的比较
特性ReLUSigmoidTanhLeakyReLU
数学表达式 max ⁡ ( 0 , x ) \max(0, x) max(0,x) 1 1 + e − x \frac{1}{1 + e^{-x}} 1+ex1 e x − e − x e x + e − x \frac{e^x - e^{-x}}{e^x + e^{-x}} ex+exexex { x if  x ≥ 0 α x if  x < 0 \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{if } x < 0 \end{cases} {xαxif x0if x<0
输出范围 [ 0 , ∞ ) [0, \infty) [0,) ( 0 , 1 ) (0, 1) (0,1) ( − 1 , 1 ) (-1, 1) (1,1) ( − ∞ , ∞ ) (-\infty, \infty) (,)
优点计算简单,缓解梯度消失问题输出范围固定,适合概率输出输出以零为中心,梯度平衡缓解“神经元死亡”问题
缺点“神经元死亡”问题梯度消失,输出不以零为中心梯度消失需要调优超参数 α \alpha α
适用场景广泛应用于各种模型二分类问题的输出层对称输出的场景避免“神经元死亡”的场景

请添加图片描述

激活函数的经典应用示例

激活函数在深度学习中的应用非常广泛。下面介绍几个经典的应用示例,包括卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)和全连接神经网络(FCNN)中的激活函数应用。

1. 卷积神经网络(CNN)

卷积神经网络广泛应用于图像分类、目标检测等任务中。ReLU 激活函数是 CNN 中最常用的激活函数。

示例:使用 ReLU 激活函数的简单 CNN

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1)self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(in_features=64*7*7, out_features=128)self.fc2 = nn.Linear(in_features=128, out_features=10)def forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool2d(x, 2)x = F.relu(self.conv2(x))x = F.max_pool2d(x, 2)x = x.view(-1, 64*7*7)x = F.relu(self.fc1(x))x = self.fc2(x)return x# 创建模型实例
model = SimpleCNN()
print(model)
2. 循环神经网络(RNN)

循环神经网络广泛应用于序列数据,如自然语言处理和时间序列预测。Tanh 和 Sigmoid 激活函数常用于 RNN 的隐藏层和输出层。

示例:使用 Tanh 和 Sigmoid 激活函数的简单 RNN

import torch
import torch.nn as nnclass SimpleRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleRNN, self).__init__()self.hidden_size = hidden_sizeself.i2h = nn.Linear(input_size + hidden_size, hidden_size)self.i2o = nn.Linear(input_size + hidden_size, output_size)self.sigmoid = nn.Sigmoid()self.tanh = nn.Tanh()def forward(self, input, hidden):combined = torch.cat((input, hidden), 1)hidden = self.tanh(self.i2h(combined))output = self.sigmoid(self.i2o(combined))return output, hiddendef init_hidden(self):return torch.zeros(1, self.hidden_size)# 创建模型实例
input_size = 10
hidden_size = 20
output_size = 1
model = SimpleRNN(input_size, hidden_size, output_size)
print(model)
3. 生成对抗网络(GAN)

生成对抗网络由生成器和判别器组成,用于生成高质量的图像。生成器通常使用 Tanh 激活函数,而判别器使用 LeakyReLU 激活函数。

示例:使用 Tanh 和 LeakyReLU 激活函数的简单 GAN

import torch
import torch.nn as nnclass Generator(nn.Module):def __init__(self, input_size, output_size):super(Generator, self).__init__()self.fc1 = nn.Linear(input_size, 128)self.fc2 = nn.Linear(128, 256)self.fc3 = nn.Linear(256, output_size)self.tanh = nn.Tanh()def forward(self, x):x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.tanh(self.fc3(x))return xclass Discriminator(nn.Module):def __init__(self, input_size):super(Discriminator, self).__init__()self.fc1 = nn.Linear(input_size, 256)self.fc2 = nn.Linear(256, 128)self.fc3 = nn.Linear(128, 1)self.leaky_relu = nn.LeakyReLU(0.2)self.sigmoid = nn.Sigmoid()def forward(self, x):x = self.leaky_relu(self.fc1(x))x = self.leaky_relu(self.fc2(x))x = self.sigmoid(self.fc3(x))return x# 创建生成器和判别器实例
input_size = 100
output_size = 28*28
generator = Generator(input_size, output_size)
discriminator = Discriminator(output_size)
print(generator)
print(discriminator)
4. 全连接神经网络(FCNN)

全连接神经网络广泛应用于各种分类和回归任务中。不同的激活函数可以在不同的层中使用,具体取决于任务的需求。

示例:使用 ReLU 和 Sigmoid 激活函数的简单 FCNN

import torch
import torch.nn as nnclass SimpleFCNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleFCNN, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.fc2 = nn.Linear(hidden_size, hidden_size)self.fc3 = nn.Linear(hidden_size, output_size)self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self, x):x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.sigmoid(self.fc3(x))return x# 创建模型实例
input_size = 784  # 28x28 图像展平后的尺寸
hidden_size = 128
output_size = 10  # 10 个类别
model = SimpleFCNN(input_size, hidden_size, output_size)
print(model)

线性变换与非线性变换在神经网络中的应用

线性变换在神经网络中的应用

线性变换在神经网络中的应用主要体现在每一层的加权求和操作。对于一个输入向量 x \mathbf{x} x 和权重矩阵 W \mathbf{W} W,线性变换的输出 z \mathbf{z} z 可以表示为:

z = W x + b \mathbf{z} = \mathbf{W} \mathbf{x} + \mathbf{b} z=Wx+b

非线性变换在神经网络中的应用

非线性变换在神经网络中的应用主要体现在激活函数的使用。激活函数对每一个神经元的输出进行非线性变换,使得整个网络能够表示复杂的非线性关系。

示例
假设我们有一个简单的前馈神经网络,包含一个输入层、一个隐藏层和一个输出层。隐藏层的输出 h \mathbf{h} h 可以表示为:

h = f ( W 1 x + b 1 ) \mathbf{h} = f(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1) h=f(W1x+b1)

其中, W 1 \mathbf{W}_1 W1 是输入层到隐藏层的权重矩阵, b 1 \mathbf{b}_1 b1 是偏置向量, f f f 是激活函数(如 ReLU)。

输出层的输出 y \mathbf{y} y 可以表示为:

y = g ( W 2 h + b 2 ) \mathbf{y} = g(\mathbf{W}_2 \mathbf{h} + \mathbf{b}_2) y=g(W2h+b2)

其中, W 2 \mathbf{W}_2 W2 是隐藏层到输出层的权重矩阵, b 2 \mathbf{b}_2 b2 是偏置向量, g g g 是激活函数(如 Sigmoid)。

多次函数与神经网络中的非线性变换

多次函数(多项式函数)确实是非线性的,它们可以表示为变量的多次幂及其线性组合的形式。例如,一个二次函数可以表示为:

y = a x 2 + b x + c y = ax^2 + bx + c y=ax2+bx+c

尽管多次函数是非线性的,但在神经网络中并不常用来实现非线性变换。下面我们详细讨论为什么在神经网络中更常用激活函数(如 ReLU、Sigmoid、Tanh 等)来实现非线性,而不是多次函数。

多次函数的局限性
  1. 计算复杂度
    多次函数的计算复杂度较高,尤其是高次多项式。每个神经元需要计算输入的多次幂,这在计算上会非常耗时,尤其是对于大规模神经网络。

  2. 梯度爆炸和梯度消失
    多次函数的导数是幂函数的形式,高次幂函数的导数在输入较大或较小时会导致梯度爆炸或梯度消失。这使得训练深度神经网络变得非常困难。

  3. 参数量和过拟合
    多次函数需要更多的参数来表示复杂的非线性关系。这增加了模型的复杂度,容易导致过拟合,尤其是在训练数据量较少的情况下。

  4. 表达能力有限
    尽管多次函数可以表示某些非线性关系,但它们的表达能力在高维空间中受到限制。激活函数如 ReLU、Sigmoid 和 Tanh 可以通过简单的非线性变换实现更强的表达能力,适用于更广泛的非线性模式。

为什么选择常用的激活函数
  1. 计算简单
    常用的激活函数(如 ReLU、Sigmoid、Tanh)计算简单,计算开销较低,适合大规模神经网络的训练和推理。

  2. 缓解梯度消失和梯度爆炸
    激活函数如 ReLU 在输入大于 0 时的导数恒为 1,有效缓解了梯度消失问题。LeakyReLU 等变种激活函数通过在负值区域引入小斜率,进一步缓解了梯度消失问题。

  3. 通用性强
    常用的激活函数在各种任务和网络结构中表现良好,具有广泛的适用性。它们能够通过简单的非线性变换实现复杂的非线性关系,增强神经网络的表达能力。

  4. 经验验证
    大量的研究和实践表明,常用的激活函数在训练深度神经网络时表现出色,能够有效提升模型的性能和稳定性。

结论

激活函数在深度学习模型中起着关键作用,通过引入非线性,使得模型能够更好地拟合复杂的数据模式。不同的激活函数适用于不同的任务和网络结构,选择合适的激活函数可以显著提升模型的性能。本文详细介绍了 ReLU、Sigmoid、Tanh 和 LeakyReLU 激活函数的作用、优缺点及其经典应用示例,希望能帮助读者更好地理解和应用这些激活函数。

线性变换和非线性变换在神经网络中扮演着不同但互补的角色。线性变换通过权重矩阵和偏置向量实现输入的加权求和,而非线性变换通过激活函数引入非线性,使得神经网络能够拟合复杂的数据模式。理解这两种变换的区别和应用,对于构建和优化神经网络至关重要。

尽管多次函数是非线性的,但由于其计算复杂度高、容易导致梯度爆炸或梯度消失、参数量大且容易过拟合等问题,它们在神经网络中并不常用。相反,常用的激活函数如 ReLU、Sigmoid 和 Tanh 计算简单、能够有效缓解梯度问题且具有强大的表达能力,因此在深度学习中得到了广泛应用。理解这些激活函数的优缺点和适用场景,有助于构建和优化高效的深度学习模型。

PyTorch概述
Pytorch :张量(Tensor)详解
PyTorch 卷积层详解
PyTorch 全连接层(Fully Connected Layer)详解
PyTorch 池化层详解
PyTorch 激活函数及非线性变换详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537279.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

理解高并发

文章目录 1、如何理解高并发2、高并发的关键指标3、高并发系统设计的目标是什么&#xff1f;1_宏观目标2_微观目标1.性能指标2.可用性指标3.可扩展性指标 4、高并发的实践方案有哪些&#xff1f;1_通用的设计方法1.纵向扩展&#xff08;scale-up&#xff09;2.横向扩展&#xf…

ROS组合导航笔记2:使用外部定位系统

在上一单元中&#xff0c;我们了解了如何合并不同传感器的数据以生成机器人的姿势估计。因此&#xff0c;基本上&#xff0c;我们介绍了图表的以下部分&#xff0c;其中向 robot_localization 节点提供了不同的传感器&#xff0c;以便通过卡尔曼滤波器进行合并。 但是...图表的…

背包问题 总结详解

就是感觉之前 dp 的 blog 太乱了整理一下。 0-1 背包 例题:P1048 朴素算法 思路 对于一个物品&#xff0c;我们可以选&#xff0c;也可以不选。 我们用表示第 i 件物品的重量&#xff0c;表示第 i 件物品的价值。 考虑表示前 i 件物品放入容量为j的背包中的最大价值。 如…

【图像匹配】基于Harris算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于Harris算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 …

Observability:日志管理的最佳实践 - 利用日志更快地解决问题

作者&#xff1a;来自 Elastic Luca Wintergerst•David Hope•Bahubali Shetti 在当今快速发展的软件开发环境中&#xff0c;高效的日志管理对于维护系统可靠性和性能至关重要。随着基础架构和应用程序组件的不断扩展和复杂化&#xff0c;运营和开发团队的职责也不断增加且越来…

yolov8区域入侵检测警报系统-pyside6可视化界面

yolov8区域入侵检测警报系统&#xff0c;是微智启软件工作室基于yolov8目标追踪和pyside6开发&#xff0c;在window的pycharm或者vscode里运行&#xff0c;可以应用于多个领域&#xff0c;检测统计物体个数以及入侵语音警报。 功能介绍 可以应用于 江河流域危险区域禁止游泳警…

利用AI技术提升ISP处理:图像质量的四大关键模块

随着智能手机和数码相机的飞速发展&#xff0c;图像质量成为了影响用户体验的关键因素之一。图像信号处理&#xff08;ISP&#xff0c;Image Signal Processing&#xff09;管道是将图像传感器捕捉到的原始数据转化为高质量输出的核心技术。然而&#xff0c;传统的ISP处理方法在…

螺丝、螺母、垫片等紧固件常用类型详细介绍

螺钉、螺母、垫片等紧固件介绍 螺钉 杯头内六角 首先介绍一下杯头内六角&#xff0c;杯头内六角是我们用的最常见的一种螺钉&#xff0c;如果你对选择螺钉没有什么想法&#xff0c;可以直接无脑选杯头内六角去使用。 比如说我们有一个零件加工了通孔&#xff0c;另一个零件加…

vmware,centos8(虚拟机) 的安装

安装vmware 点击下方网址 虚拟机安装地址https://www1.msc23.cn/vm/?bd_vid8829610582362807097选择VMware17 打开文件所在地&#xff0c;双击安装 同意条款 选择安装位置 不将VMware配置到环境变量path 不检查更新,不加入客户体验 创建桌面快捷方式 开始安装 安装完成…

CSP-J/S 考试介绍

CSP-J/S是由中国计算机学会&#xff08;CCF&#xff09;主办的非专业级别的软件能力认证考试。 CSP-J/S全称为CCF CSP-J/S&#xff0c;是CCF计算机软件能力认证&#xff08;简称CCFCSP认证&#xff09;中的一个部分&#xff0c;重点考察软件开发者实际编程能力。该项认证由CCF…

MTC完成右臂抓取放置任务\\放置姿态设置

#include "mtc_tutorial/mtc_glass_bottle.hpp" static const rclcpp::Logger LOGGER rclcpp::get_logger("mtc_glass_right"); // 获取节点基础接口的实现 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr MTCTaskNode_Right::getNodeBaseInterf…

棋盘格角点检测-libcbdetect

libcbdetect libcbdetect 是一个用于自动子像素级别的棋盘格&#xff08;checkerboard&#xff09;、棋盘&#xff08;chessboard&#xff09;以及 Deltille 图案检测的库。它主要由 C 编写&#xff0c;旨在提供高精度、高鲁棒性的角点检测和图案组合功能&#xff0c;是一种基…

使用HTML和CSS制作网页的全面指南

目录 引言 一、理解HTML 1. 什么是HTML&#xff1f; 2. HTML文档的基本结构 3. 常用的HTML标签 4. 示例&#xff1a;创建一个简单的HTML页面 二、理解CSS 1. 什么是CSS&#xff1f; 2. CSS的使用方式 3. CSS选择器和属性 4. 常用的CSS属性 三、创建网页的步骤 1. 规…

【Java数据结构】二叉树

目录 树树的特征树的概念 二叉树两种特殊的二叉树二叉树的性质二叉树的基本操作4 种遍历二叉树的方式判断一棵树是不是完全二叉树获取二叉树总共的节点个数获取叶子节点的个数获取第 k 层的节点个数获取二叉树的高度检测值为 value 的元素是否存在 二叉树基本操作完整代码 树 …

VS code 安装使用配置 Continue

Continue 插件介绍 Continue 是一款高效的 VS Code 插件&#xff0c;提供类似 GitHub Copilot 的功能&#xff0c;旨在提升开发者的编程效率。其配置简单&#xff0c;使用体验流畅&#xff0c;深受开发者喜爱。 主要功能特点 智能代码补全 Continue 能够基于当前代码上下文生…

年化60.7%,最大回撤-16.5%,RSRS标准分择时效果差不多

原创内容第653篇&#xff0c;专注量化投资、个人成长与财富自由。 中秋节&#xff0c;祝大家中秋快乐&#xff01; 人有悲欢离合&#xff0c;月有阴晴圆缺&#xff0c;此事古难全。但愿人长久&#xff0c;千里共婵娟。 今天引入RSRS来择时&#xff0c;看下策略效果。 年化60.7…

Python编码系列—Python代理模式:为对象赋予超能力的魔法

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

【例题】lanqiao549 扫雷

输入 3 4 0 1 0 0 1 0 1 0 0 0 1 0输出 2 9 2 1 9 4 9 2 1 3 9 2解题思路 分类讨论&#xff1a; 如果原来的方格整数为1&#xff0c;输出9如果原来的方格整数为0&#xff0c;输出周围8个&#xff08;最多八个&#xff09;的地雷数量和 代码 如何遍历一个方格mp[i][j]周围…

c++中引用是通过指针的方式实现

其实在汇编层面上&#xff0c;引用的代码和指针的代码是一致的。 先看指针情况下的代码分析&#xff0c;如下所示&#xff1a; #include <iostream>using namespace std;void fuzhi(int *x)//引用传参 {*x 10; }int main(int argc, char** argv) {int a 0;int b;a …