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

news2024/12/29 8:08:10

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

激活函数的作用

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

  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 F

class 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 nn

class SimpleRNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleRNN, self).__init__()
        self.hidden_size = hidden_size
        self.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, hidden

    def 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 nn

class 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 x

class 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 nn

class 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.coloradmin.cn/o/2143549.html

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

相关文章

12 Java文件处理之写入、读取:IO流(中):高级流(缓冲流、转换流、序列化流和反序列化流、打印流)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、缓冲流1 字节缓冲流(1)BufferedInputStream:字节缓冲输入流构造方法---- BufferedInputStream(InputStream in):创建一个使用默认缓冲区大小的缓冲输入流。---- BufferedInputStream(In…

算法题目复习(0909-0917)

1. 连续子序列和 pdd的算法题&#xff0c;根本不记得怎么做 给一个数组&#xff0c;有正数和负数&#xff0c;算出连续子序列的和最大为多少 int maxSubArraySum(vector<int>& nums) {int maxSoFar nums[0];int maxEndingHere nums[0];for (size_t i 1; i <…

说说几款耳机

从前&#xff0c;大约在戴森推出他们那款奇特的发明——戴森耳机与空气净化器组合一年后&#xff0c;人们仍对这个奇怪的产品感到困惑。这款穿戴式空气净化耳机更像是一个实验&#xff0c;缺乏实际用途。回想起那时的评测&#xff0c;大家一致认为这是有史以来最无意义的产品之…

IDEA 2024.3 EAP新特征早览!

0 前言 IntelliJ IDEA 2024.3 第一个 EAP 版本已发布&#xff0c;提前体验 下一个重大版本的一部分改进。 持续关注 EAP 更新&#xff0c;未来几周内将推出更多 IntelliJ IDEA 新功能。尝试这些新功能&#xff0c;分享您的反馈&#xff0c;共同完善 IDE。 1 AI 助手 1.1 内…

Web3入门指南:从基础概念到实际应用

Web3&#xff0c;即“去中心化的第三代互联网”&#xff0c;正在逐步改变我们对互联网的传统认知。从最初的静态网页&#xff08;Web1.0&#xff09;到互动平台和社交媒体为主的互联网&#xff08;Web2.0&#xff09;&#xff0c;Web3的目标是让用户重新掌握对数据和数字资产的…

比特币10年价格数据(2014-2024)分析(基础)

数据入口&#xff1a;【每周挑战】比特币10年价格数据可视化和量化分析 - Heywhale.com 本数据集包含 2014 - 2024 的比特币美元价格数据&#xff0c;具体包含比特币每日的开盘价、最高价、最低价、收盘价以及成交量等关键信息。数据说明如下&#xff1a; 字段说明Date日期&a…

PMP--一模--解题--151-160

文章目录 11.风险管理--规划风险应对--机会应对策略--上报151、 [单选] 早在执行阶段&#xff0c;项目经理就发现&#xff0c;事业环境因素&#xff08;EEF&#xff09;最近发生的变化将使实施成本大幅减少&#xff0c;而且还将缩减项目进度计划&#xff0c;项目经理该如何应对…

《沈阳体育学院学报》

《沈阳体育学院学报》创刊于1982年&#xff0c;是由沈阳体育学院主办&#xff0c;面向国内外公开发行的体育类学术期刊&#xff1b;国际标准刊号为ISSN 1004-0560&#xff0c;国内刊号为CN 21-1081/G8&#xff1b;双月刊&#xff0c;单月中旬出版。 《沈阳体育学院学报》是中文…

Django_Vue3_ElementUI_Release_004_使用nginx部署

1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…

java进销存系统源码:管店云进销存解决方案

在当今数字化转型的大背景下&#xff0c;企业对高效、可靠的进销存管理系统的需求日益增长。Java作为一种广泛使用的编程语言&#xff0c;以其成熟的技术栈和强大的生态系统&#xff0c;成为了开发高性能进销存系统的首选语言之一。本文将介绍一款基于Java进销存系统源码的“管…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

AG32 MCU与内置FPGA的FLASH空间如何划分

AG32与内置FPGA的FLASH空间如何划分 关于芯片flash 大小&#xff1a; 不管所选型号的flash 是多大&#xff0c;请注意最后100K 是留给fpga 使用的。 如果使用的芯片是256K 的flash 空间&#xff0c;那么就是156K 程序100K fpga&#xff0c;用户程序不能 超过156K。如果超过1…

网络流之最大流(dinic算法模板+模板题)

dinic算法&#xff1a;时间复杂度O(), n 代表点的个数&#xff0c;m 代表边的个数。 const int N1e55; struct Edge{int to,w,next; }edge[N*2];//双向边 int head[N],d[N],cur[N]; int n,m,s,t,cnt1;// 从 2 , 3 开始配对 void add(int u,int v,int w){edge[cnt]{v,w,head[…

VirtualBox 7.1.0 发布下载 - 开源跨平台虚拟化软件

VirtualBox 7.1.0 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接&#xff1a;https://sysin.org/blog/virtualbox-7/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2024 年 9 月 …

软考中级软件设计师——数据结构与算法基础学习笔记

软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构&#xff08;存储结构&#xff09; 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所…

树莓派提示:error: externally-managed-environment 树莓派安装虚拟环境,树莓派flask报错

错误信息 raspberryraspberrypi:~ $ pip install flask error: externally-managed-environment脳 This environment is externally managed 鈺扳攢> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to i…

C语言 | Leetcode C语言接雨水II

题目&#xff1a; 题解&#xff1a; typedef struct{int row;int column;int height; } Element;struct Pri_Queue; typedef struct Pri_Queue *P_Pri_Queue; typedef Element Datatype;struct Pri_Queue{int n;Datatype *pri_qu; };/*优先队列插入*/ P_Pri_Queue add_pri_que…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

自己建网站怎么建

自己建立一个网站可能听起来有点复杂&#xff0c;但实际上&#xff0c;有很多简单且免费的方法可以实现。下面将介绍一些基本步骤&#xff0c;帮助你开始自己建立一个网站。 首先&#xff0c;你需要明确你的网站目的是什么。是个人博客、商业网站&#xff0c;还是其他类型的网…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…