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

【激活函数:神经网络的“调味料】


1. 激活函数:神经网络的“调味料”

想象你在做菜:

  • 没有激活函数:就像只用水煮食材,味道单调(只能拟合线性关系)。
  • 加入激活函数:像加了盐、糖、辣椒,让菜有酸甜苦辣(非线性),味道丰富。

为什么需要它?
神经网络如果没有激活函数,无论多少层都只能解决“能用直线分割的问题”(比如区分“红苹果”和“青苹果”)。但现实问题更复杂(比如区分“猫”和“狗”),需要激活函数引入“弯弯绕绕”的决策边界。


2. Softmax:选秀节目的评委打分

场景设定
  • 节目规则:3位选手(猫、狗、鸟)比赛,评委(神经网络)要给每个选手打分(logits),最后根据分数决定冠军(预测类别)。
  • 原始分数(logits):[猫: 5分, 狗: 3分, 鸟: 1分](直接打分可能不公平,因为评委手松/手紧)。
Softmax的作用
  1. 指数放大差距(避免人情分):

    • 猫:( e^5 ≈ 148.4 )
    • 狗:( e^3 ≈ 20.1 )
    • 鸟:( e^1 ≈ 2.7 )
    • (分数差距被拉开,更突出优秀选手)
  2. 归一化成概率

    • 总分 = 148.4 + 20.1 + 2.7 = 171.2
    • 猫概率 = 148.4 / 171.2 ≈ 86.7%
    • 狗概率 = 20.1 / 171.2 ≈ 11.7%
    • 鸟概率 = 2.7 / 171.2 ≈ 1.6%
    • 结果:猫以86.7%的概率夺冠!
为什么用Softmax?
  • 公平性:无论评委打分偏高/偏低,最终概率只关注相对分数
  • 可解释性:输出是概率,比原始分数更直观(比如“猫有86%的可能性”)。

3. 其他激活函数的比喻

激活函数比喻适用场景例子
Sigmoid开关(0~1之间)二分类(如判断是否)“这封邮件是垃圾邮件吗?”
ReLU水管(负数流不走)隐藏层(快速计算)图像识别中提取边缘特征
Tanh双向开关(-1~1)需要负输出的隐藏层语音信号处理(有正有负)

4. 为什么Softmax只在最后一层?

继续选秀比喻:

  • 隐藏层:像海选阶段,评委只需粗暴淘汰(用ReLU快速过滤“明显不像猫的”)。
  • 输出层:像总决赛,需要精细评分(Softmax比较“猫/狗/鸟”的细微差别)。

如果中间层用Softmax
相当于每场海选都强制选手PK出唯一胜者,会丢失多样性(比如“猫”和“狗”可能同时值得晋级)。


5. 一张图理解所有激活函数

输入 → [隐藏层:ReLU][隐藏层:ReLU][输出层:Softmax] → 概率
  • 隐藏层:ReLU像“勤劳的工人”,快速筛选有用特征。
  • 输出层:Softmax像“严谨的法官”,给出最终判决。

6. 常见误区

(1) Softmax和Sigmoid都能做多分类?
  • Softmax:适合“单选”问题(如“图片是猫/狗/鸟?”)。
    # 输出总和=1
    [0.9, 0.1, 0.0]  # 判定为猫
    
  • Sigmoid:适合“多选”问题(如“图片是否有猫、是否有狗?”)。
    # 每个类别独立判断
    [0.9, 0.8, 0.1]  # 有猫、有狗、无鸟
    
(2) 为什么不用原始分数直接当概率?
  • 原始分数可能为负数(如猫: -2,狗: 3),无法直接解释为概率。
  • 分数范围不固定(有的评委打分010,有的打分-100100),Softmax能统一标准。

总结

  • 激活函数是神经网络的“调味料”,让模型能解决复杂问题。
  • Softmax是“多分类裁判”,把分数变成概率,保证公平和可解释性。
  • 记住
    • 隐藏层用 ReLU(高效)。
    • 多分类输出用 Softmax(单选)。
    • 多标签输出用 Sigmoid(多选)。

下次看到Softmax,就想想选秀节目的评委打分!

以下是使用Mermaid语法绘制的CNN结构框图,明确标注了隐藏层非隐藏层,并用不同样式区分:

在这里插入图片描述

框图说明

  1. 隐藏层(蓝色节点):

    • 所有带【】的层(卷积层、ReLU、池化层、全连接层)
    • 共同特点:内部特征变换,输出不直接暴露
  2. 非隐藏层(紫色/虚线节点):

    • 输入图像:原始数据入口
    • 展平层:无参数的固定操作
    • Softmax输出:最终预测结果
  3. 箭头方向

    • 表示数据流动方向(前向传播路径)

关键点强调

  • 虽然ReLU和池化层没有可训练参数,但因为它们是特征处理的关键环节,仍属于隐藏层
  • 展平层是结构转换层(多维→一维),不属于隐藏层
  • 输出层永远是非隐藏层(网络与外界交互的接口)

好的!我用更直观的方式解释 ReLU(Rectified Linear Unit),保证你彻底明白它的作用和“水管比喻”的含义。


1. ReLU是什么?

ReLU是最常用的激活函数之一,定义超级简单:
[
\text{ReLU}(x) = \max(0, x)
]

  • 输入:任意数值 ( x )(正数、负数、零)。
  • 输出
    • 如果 ( x > 0 ),输出 ( x )(原样通过)。
    • 如果 ( x \leq 0 ),输出 ( 0 )(直接归零)。

2. “水管比喻”详解

想象ReLU是一根有阀门的水管

  • 正数输入(( x > 0 )):
    → 阀门打开,水流直接通过(输出=输入)。

  • 负数输入(( x \leq 0 )):
    → 阀门关闭,水流被阻断(输出=0)。

为什么叫“负数流不走”?
因为负数输入会被ReLU直接置零,就像水管不让逆流的水通过一样!


3. 为什么要用ReLU?

(1) 解决梯度消失问题
  • 传统激活函数(如Sigmoid)的缺陷
    当输入很大或很小时,梯度接近0,导致深层网络无法更新参数(“学不动”)。

  • ReLU的优势

    • 正数区域梯度恒为1,反向传播时梯度不会衰减。
    • 让深层网络(如ResNet)训练成为可能。
(2) 计算速度快
  • Sigmoid/Tanh:需要计算指数,速度慢。
  • ReLU:只需比较和取最大值(硬件友好)。
(3) 稀疏激活
  • 负数输入直接输出0,相当于关闭部分神经元,让网络更高效。
  • 像大脑一样,只有部分神经元被激活(生物合理性)。

4. 实际例子

假设某神经元的输入加权和是:
[
x = 2.5 \quad (\text{正数}) \quad \Rightarrow \text{ReLU}(2.5) = 2.5 \
x = -1.3 \quad (\text{负数}) \quad \Rightarrow \text{ReLU}(-1.3) = 0 \
]

在神经网络中的效果

  • 如果某个特征(如“边缘”)对任务无用,ReLU会将其输出置零,相当于忽略该特征。
  • 有用的特征(正数)则原样传递到下一层。

5. ReLU的局限性

  • 神经元死亡:如果某神经元始终输出0(因输入总为负),它将永远无法更新参数。
    解决方法:用 LeakyReLU(负数区给微小斜率,如0.01x)。

6. 对比其他激活函数

激活函数输出范围计算速度梯度消失风险适用场景
ReLU[0, +∞)⚡️ 超快隐藏层(默认首选)
Sigmoid(0, 1)🐢 慢输出层(二分类)
Tanh(-1, 1)🐢 慢隐藏层(RNN)
LeakyReLU(-∞, +∞)⚡️ 快替代ReLU

7. 一句话总结

ReLU就像一根“智能水管”:

  • 正数→畅通无阻,负数→直接截断。
  • 它的简单、高效、防梯度消失,让它成为深度学习时代的“万金油”激活函数。

下次看到ReLU,就想想水管阀门——“正通负断”

你提到的这个问题是深度学习中的核心痛点——梯度消失(Vanishing Gradients)。下面我用最直观的方式解释为什么Sigmoid会有这个问题,而ReLU如何解决它。


1. Sigmoid函数的缺陷

(1) Sigmoid的形状

Sigmoid函数公式:
[
\sigma(x) = \frac{1}{1 + e^{-x}}
]
它的图像是一条S形曲线,输出范围在(0,1):

(2) Sigmoid的导数

导数(梯度)公式:
[
\sigma’(x) = \sigma(x)(1 - \sigma(x))
]

  • 当输入 ( x ) 的绝对值很大时(如 ( x=10 ) 或 ( x=-10 )):
    • ( \sigma(10) ≈ 1 ),导数 ( ≈1×(1-1)=0 )。
    • ( \sigma(-10) ≈ 0 ),导数 ( ≈0×(1-0)=0 )。
  • 关键问题:梯度在两端几乎为0!
(3) 梯度消失的连锁反应

假设一个5层网络,每层用Sigmoid:

  1. 如果某一层的梯度是0.1,反向传播到第一层时:
    ( 0.1 \times 0.1 \times 0.1 \times 0.1 \times 0.1 = 0.00001 )
    (梯度几乎消失,参数无法有效更新)。
  2. 结果:深层网络的前几层“学不动”,性能停滞。

2. 为什么ReLU能解决这个问题?

(1) ReLU的导数

ReLU的导数超级简单:
[
\text{ReLU}'(x) =
\begin{cases}
1 & \text{if } x > 0 \
0 & \text{if } x \leq 0
\end{cases}
]

  • 正数区域:梯度恒为1,反向传播时梯度原样传递,不会衰减!
  • 负数区域:梯度为0(虽然也有“神经元死亡”风险,但实际中正数激活更常见)。
(2) 对比实验

假设同样5层网络,每层用ReLU:

  • 如果某层梯度是0.1,但其他层梯度为1(因ReLU的正数区):
    ( 0.1 \times 1 \times 1 \times 1 \times 1 = 0.1 )
    (梯度能有效传递到前几层)。
(3) 直观比喻
  • Sigmoid:像一条狭窄的山路,越往后走信号越弱(梯度衰减)。
  • ReLU:像高速公路,正数区域是直行道(梯度直达),负数区域是断路(截断)。

3. 数学例子对比

Sigmoid的梯度消失

假设输入 ( x=10 ):

  • Sigmoid输出:( \sigma(10) ≈ 0.999 )
  • 梯度:( 0.999 \times (1-0.999) ≈ 0.001 )(几乎为0)。
ReLU的梯度保持

假设输入 ( x=10 ):

  • ReLU输出:( 10 )
  • 梯度:( 1 )(完全保留)。

4. 为什么Sigmoid梯度会消失?

  • 饱和区:当Sigmoid输入很大/很小时,函数曲线变得极其平缓(导数接近0)。

  • 链式法则的灾难:深度学习依赖梯度反向传播,连续多层小梯度相乘会指数级减小。


5. ReLU的局限性补充

虽然ReLU解决了梯度消失,但也有缺点:

  • 神经元死亡:如果某神经元因输入始终为负,输出恒为0,梯度永远无法更新它。
    改进方案
    • LeakyReLU:负数区给微小斜率(如0.01x),避免完全死亡。
      [
      \text{LeakyReLU}(x) = \max(0.01x, x)
      ]

总结

  • Sigmoid的问题:梯度在两端饱和→反向传播时连乘导致梯度消失→深层网络无法训练。
  • ReLU的救场:正数区梯度=1,保持梯度强度→支持深层网络(如ResNet有1000+层)。

简单说:Sigmoid像老式收音机信号弱,ReLU像5G信号全覆盖!

1. 什么是反向传播?

**反向传播(Backpropagation)**是神经网络训练的核心算法,用于计算每个参数(权重和偏置)对最终误差的“贡献程度”(即梯度),从而指导参数更新。它的工作流程如下:


(1) 前向传播(Forward Pass)
  • 输入数据通过网络层层计算,得到预测输出。
    例如:输入一张猫的图片 → 经过卷积、激活函数等操作 → 输出“猫:70%,狗:30%”。
(2) 计算误差(Loss)
  • 比较预测输出和真实标签的差异(如交叉熵损失)。
    例如:真实标签是“猫”,误差 = -log(0.7) ≈ 0.36。
(3) 反向传播(Backward Pass)
  • 从输出层向输入层逐层传递误差,利用链式法则计算每个参数的梯度。
  • 梯度表示“参数微小变化时,误差的变化率”。
    例如:某个权重 ( w ) 的梯度 = 0.05,表示增大 ( w ) 会使误差增加 0.05。
(4) 参数更新
  • 用梯度下降法调整参数:
    [
    w \leftarrow w - \text{学习率} \times \text{梯度}
    ]
    例如:学习率=0.01,则 ( w ) 更新为 ( w - 0.01 \times 0.05 )。

2. 为什么需要反向传播?

  • 手动计算不可行:深层网络可能有数百万个参数,手动求导效率极低。
  • 高效分配误差:反向传播能自动确定“谁该为误差负责”,并将误差公平地分摊给各层参数。
  • 动态调整:通过梯度指导参数更新,让网络逐步改进预测。

3. “链式法则的灾难”详解

(1) 链式法则是什么?

反向传播的核心是链式法则(复合函数求导法则):
若 ( y = f(g(x)) ),则 ( \frac{dy}{dx} = \frac{dy}{dg} \cdot \frac{dg}{dx} )。

(2) 在神经网络中的应用

假设一个3层网络,最终误差 ( L ) 对第一层权重 ( w_1 ) 的梯度为:
[
\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial z_3} \cdot \frac{\partial z_3}{\partial z_2} \cdot \frac{\partial z_2}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}
]
其中 ( z_i ) 是第 ( i ) 层的输出。

(3) 梯度消失的数学原因

如果每一层的梯度 ( \frac{\partial z_{i+1}}{\partial z_i} ) 很小(如Sigmoid的梯度最大仅0.25),多层连乘后会指数级减小:
[
0.25 \times 0.25 \times 0.25 = 0.015625
]

  • 结果:第一层的梯度接近0,参数几乎不更新,网络无法学习底层特征。
(4) ReLU如何解决?

ReLU在正数区的梯度恒为1,连乘时不会衰减:
[
1 \times 1 \times 1 = 1
]


4. 生活化比喻

(1) 反向传播:公司问责制
  • 前向传播:员工(神经元)逐层处理任务,最终提交报告(预测)。
  • 误差发现:老板发现报告有误(损失函数)。
  • 反向追责:从高层到底层逐级问责(反向传播),找出谁该扣奖金(梯度)。
  • 改进:员工根据问责结果调整工作方式(参数更新)。
(2) 链式法则的灾难:传话游戏
  • 10个人排成一列传话,每人传话时声音减小一半(Sigmoid的小梯度)。
  • 最后一人听到的内容 ≈ 初始内容的 ( \frac{1}{1024} )(信息消失)。
  • ReLU版传话:正数内容原样传递(梯度=1),负数内容不传(梯度=0)。

5. 总结

  • 反向传播:是神经网络高效计算梯度的算法,通过链式法则实现误差的逐层分配。
  • 梯度消失:当激活函数(如Sigmoid)的梯度连续多层连乘时,梯度指数级减小,导致深层网络无法训练。
  • ReLU的救场:正数区梯度=1,避免连乘衰减,支持深层网络训练。

一句话:反向传播是神经网络的“学习引擎”,而ReLU是让这个引擎在深层网络中不熄火的关键设计! 🔥

1. 例子回顾

假设一个5层神经网络,每层使用Sigmoid激活函数。在反向传播时:

  • 每一层的梯度为 0.1(因Sigmoid的梯度较小)。
  • 传播到第一层的总梯度:
    [
    0.1 \times 0.1 \times 0.1 \times 0.1 \times 0.1 = 0.00001
    ]
    这意味着第一层的参数几乎无法更新。

2. 参数更新过程分析

(1) 网络结构

假设每层只有一个神经元,权重为 ( w_1, w_2, \dots, w_5 ),输入为 ( x ),预测输出为 ( \hat{y} ),真实标签为 ( y )。

(2) 前向传播

每层的计算(以第1层为例):
[
z_1 = w_1 \cdot x, \quad a_1 = \sigma(z_1)
]
最终输出:
[
\hat{y} = a_5 = \sigma(w_5 \cdot a_4)
]

(3) 损失函数

用均方误差(MSE):
[
L = \frac{1}{2} (y - \hat{y})^2
]

(4) 反向传播(链式法则)
  • 第5层权重的梯度
    [
    \frac{\partial L}{\partial w_5} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_5} \cdot \frac{\partial z_5}{\partial w_5}
    ]
    其中:

    • ( \frac{\partial L}{\partial \hat{y}} = - (y - \hat{y}) )(误差项)
    • ( \frac{\partial \hat{y}}{\partial z_5} = \sigma’(z_5) = \sigma(z_5)(1 - \sigma(z_5)) )(Sigmoid导数)
    • ( \frac{\partial z_5}{\partial w_5} = a_4 )(上一层的输出)

    假设 ( \sigma’(z_5) = 0.1 ),则:
    [
    \frac{\partial L}{\partial w_5} = - (y - \hat{y}) \times 0.1 \times a_4
    ]

  • 第1层权重的梯度
    [
    \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_5} \cdot \frac{\partial z_5}{\partial a_4} \cdot \frac{\partial a_4}{\partial z_4} \cdot \frac{\partial z_4}{\partial a_3} \cdot \frac{\partial a_3}{\partial z_3} \cdot \frac{\partial z_3}{\partial a_2} \cdot \frac{\partial a_2}{\partial z_2} \cdot \frac{\partial z_2}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}
    ]
    由于每层Sigmoid的导数 ( \sigma’(z_i) = 0.1 ),且其他项(如 ( \frac{\partial z_i}{\partial a_{i-1}} = w_i ))假设为1:
    [
    \frac{\partial L}{\partial w_1} = - (y - \hat{y}) \times 0.1 \times 0.1 \times 0.1 \times 0.1 \times 0.1 \times x
    ]
    最终:
    [
    \frac{\partial L}{\partial w_1} \approx \text{误差项} \times 0.00001 \times x
    ]

(5) 参数更新
  • 梯度下降更新规则:
    [
    w_1 \leftarrow w_1 - \eta \cdot \frac{\partial L}{\partial w_1}
    ]
    其中 ( \eta ) 是学习率(如0.01)。
    由于 ( \frac{\partial L}{\partial w_1} ) 极小(0.00001量级),( w_1 ) 几乎不变。

3. 链式法则的灾难

(1) 根本原因
  • Sigmoid导数的上限:( \sigma’(x) \leq 0.25 )(当 ( x=0 ) 时最大)。
    实际中,由于输入 ( x ) 的绝对值通常较大,导数更小(如0.1)。
  • 多层连乘:梯度是各层导数的乘积,导致指数级衰减。
(2) 数学表达

若每层梯度为 ( \alpha )(( \alpha \ll 1 )),则第 ( k ) 层的梯度:
[
\frac{\partial L}{\partial w_k} \propto \alpha^k
]

  • 当 ( k=5 ),( \alpha^5 = 0.00001 )(几乎消失)。
(3) 后果
  • 浅层参数不更新:网络只能学习最后几层的特征,无法利用深层结构的优势。
  • 性能瓶颈:模型表现类似浅层网络,无法解决复杂任务。

4. ReLU的对比

(1) ReLU的梯度

[
\text{ReLU}'(x) =
\begin{cases}
1 & \text{if } x > 0 \
0 & \text{if } x \leq 0
\end{cases}
]

  • 正数区:梯度=1,连乘时不会衰减。
    [
    1 \times 1 \times 1 \times 1 \times 1 = 1
    ]
  • 效果:浅层参数能获得有效梯度,支持深层网络训练。
(2) 参数更新对比
  • Sigmoid
    ( \frac{\partial L}{\partial w_1} \approx 0.00001 ) → 更新量微乎其微。
  • ReLU
    ( \frac{\partial L}{\partial w_1} \approx \text{误差项} \times 1 \times x ) → 正常更新。

5. 直观图示

(1) Sigmoid的梯度消失
输入 → [Sigmoid (梯度=0.1)] → [Sigmoid (梯度=0.1)] → ... → 输出
反向传播时:梯度 = 0.1 × 0.1 × ... → 0.00001
(2) ReLU的梯度保留
输入 → [ReLU (梯度=1)] → [ReLU (梯度=1)] → ... → 输出
反向传播时:梯度 = 1 × 1 × ... → 1

6. 总结

  • 反向传播:通过链式法则计算梯度,指导参数更新。
  • Sigmoid的问题:梯度连乘导致指数衰减,浅层参数无法学习。
  • ReLU的优势:正数区梯度=1,避免衰减,支持深层网络训练。

关键结论
激活函数的选择直接影响梯度传播的效率,进而决定神经网络能否发挥深度优势!

为什么多标签分类用Sigmoid而不是Softmax?

多标签分类任务中,一个样本可以同时属于多个类别(比如一张图片包含“猫”和“狗”),而Softmax的设计逻辑是**“单选”**(所有类别互斥,概率和为1),因此不适用。以下是详细解释:


1. Softmax的“单选”特性

  • 输出特点:所有类别的概率之和为1,且彼此竞争。
    例如
    [猫: 0.9, 狗: 0.1, 鸟: 0.0] → 模型认为“只能是猫,不可能是其他”。
  • 问题:如果图片中有猫和狗,Softmax会强制压制“狗”的概率,导致错误。

2. Sigmoid的“多选”特性

  • 输出特点:每个类别独立判断,概率范围[0,1],且不要求总和为1
    例如
    [猫: 0.9, 狗: 0.8, 鸟: 0.1] → 可同时预测“有猫”和“有狗”。
  • 数学形式
    [
    P(\text{class}_i) = \frac{1}{1 + e^{-z_i}}
    ]
    每个类别的概率仅依赖自身的logit ( z_i ),与其他类别无关。

3. 直观例子对比

任务:预测图片中的动物(猫、狗、鸟)
  • 多标签(用Sigmoid)
    • 输出 [猫: 0.9, 狗: 0.7, 鸟: 0.05] → 正确识别“猫+狗”。
  • 多分类(用Softmax)
    • 输出 [猫: 0.6, 狗: 0.3, 鸟: 0.1] → 强制忽略“狗”的存在。

4. 反向传播的差异

  • Sigmoid
    每个类别的梯度独立计算,互不干扰。
    • 猫的梯度只与猫的logit相关,不影响狗或鸟的梯度。
  • Softmax
    所有类别的梯度相互耦合(因分母是所有类别的指数和)。
    • 调整猫的logit会直接影响狗和鸟的概率。

5. 实际场景应用

适合Sigmoid的任务
  • 医学诊断:同时预测“肺炎+结核病”。
  • 图像标注:识别“阳光+沙滩+海浪”。
  • 文本分类:文章包含“科技+娱乐”标签。
适合Softmax的任务
  • MNIST手写数字:图片只能是“0”到“9”中的一个。
  • ImageNet分类:图片属于1000个互斥类别之一。

6. 代码示例(PyTorch)

import torch
import torch.nn as nn# 多标签分类(Sigmoid)
model = nn.Linear(input_dim, num_classes)  # 输出层无激活函数
criterion = nn.BCEWithLogitsLoss()        # 二分类交叉熵(内置Sigmoid)# 多分类(Softmax)
model = nn.Sequential(nn.Linear(input_dim, num_classes),nn.Softmax(dim=1)                     # 显式Softmax
criterion = nn.CrossEntropyLoss()         # 交叉熵(内置LogSoftmax)

7. 常见误区

  • 误区:“用Softmax+阈值拆分可以模拟多标签”。
    问题:Softmax的概率受其他类别压制,阈值拆分会导致漏检(如“狗”因概率被压低而无法触发)。
  • 正确做法:对每个类别独立用Sigmoid,根据阈值(如0.5)判断是否属于该类。

总结

  • Sigmoid:允许多个类别共存,适合“多选”任务。
  • Softmax:强制单选,适合“互斥分类”任务。
  • 核心区别:是否要求类别间概率竞争。

一句话

  • 问“这是什么?” → 用Softmax(答案唯一)。
  • 问“哪些存在?” → 用Sigmoid(答案可多选)。

相关文章:

【激活函数:神经网络的“调味料】

1. 激活函数:神经网络的“调味料” 想象你在做菜: 没有激活函数:就像只用水煮食材,味道单调(只能拟合线性关系)。加入激活函数:像加了盐、糖、辣椒,让菜有酸甜苦辣(非线…...

006.Gitlab CICD流水线触发

文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活,常见的有如下几类触发方式: …...

服务器远程端口详解

服务器远程端口详解 一、服务器远程端口的概念与作用 1. 端口的基本定义 服务器远程端口是计算机网络中用于标识不同应用程序或服务的逻辑接口。通过TCP/IP协议栈的"Socket"机制,计算机可以通过软件方式与其他设备建立通信通道。每个端口对应一个16位无…...

如何在 Vue 3 中实现百度地图位置选择器组件

如何在 Vue 3 中实现百度地图位置选择器组件 前言 在开发前端应用时,地图选择器是一个非常常见的需求。尤其是在一些需要用户选择地址的场景,如电商平台、旅游网站、酒店预定等,百度地图组件能提供准确的地理位置服务。在本文中&#xff0c…...

es6学习02-let命令和const命令

一、let命令 1.let块级作用域: let关键字 VS var关键字 2.for循环计数器很适合let命令 var:整个for循环中一直都是同一个i在做1,最后输出的就是10; let:每循环一次都是多一个i的赋值,最后输出是可以调出…...

电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案

tips:资料来自网络,仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明: 典型应用…...

DeepSeek大语言模型部署指南:从基础认知到本地实现

目录 一、DeepSeek简介:开源领域的新兴力量 1.1 公司背景与发展历程 1.2 核心产品DeepSeek-R1的技术特点 1.3 行业影响与伦理挑战 二、官方资源获取:全面掌握DeepSeek生态 2.1 官方网站与API服务 2.2 开源代码库资源 2.3 模型部署工具Ollama简介…...

09-设计模式 企业场景 面试题-mk

你之前项目中用过设计模式吗? 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类图设计如下: 上面的对象都是ne…...

达梦数据库-学习-18-ODBC数据源配置(Linux)

一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…...

解决VS2022中scanf报错C4996

这个的原因是因为新版的VS认为scanf不安全,要去使用scanf_s,但在C语言中就需要scanf,所以我们只要以以下步骤解决就可以了。 只要加入宏定义即可 #define _CRT_SECURE_NO_WARNINGS 因为本人已经很少写小案例了,所以就用这个办法…...

Python(11)Python判断语句全面解析:从基础到高级模式匹配

目录 一、条件逻辑的工程价值1.1 真实项目中的逻辑判断1.2 判断语句类型矩阵 二、基础判断深度解析2.1 多条件联合判断2.2 类型安全判断 三、模式匹配进阶应用3.1 结构化数据匹配3.2 对象模式匹配 四、判断语句优化策略4.1 逻辑表达式优化4.2 性能对比测试 五、典型应用场景实战…...

Quartus II的IP核调用及仿真测试

目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…...

如何修改服务器TTL值

Windows默认返回的TTL值为128,Linux为64,我们怎么修改这个值呢? 目录 一. Windows 二. Linux 临时更改 永久更改 一. Windows WinR输入regedit,打开注册表 路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…...

大模型LLM表格报表分析:markitdown文件转markdown,大模型markdown统计分析

整体流程:用markitdown工具文件转markdown,然后大模型markdown统计分析 markitdown https://github.com/microsoft/markitdown 在线体验:https://huggingface.co/spaces/AlirezaF138/Markitdown 安装: pip install markitdown…...

劫持SUID程序提权彻底理解Dirty_Pipe:从源码解析到内核调试

DirtyPipe(CVE-2022-0847)漏洞内核调试全流程指南 本文主要面向对内核漏洞挖掘与调试没有经验的初学者,结合 CVE-2022-0847——著名的 Dirty Pipe 漏洞,带你从零开始学习 Linux 内核调试、漏洞复现、原理分析与漏洞利用。该漏洞危害极大,并且概念简单明了,无需复杂前置知…...

React 组件样式

在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...

嵌入式人工智能应用-第三章 opencv操作3 图像平滑操作 下

5 高斯噪声(Gaussian Noise) 高斯噪声(Gaussian Noise)是一种符合正态(高斯)分布的随机噪声,广泛存在于传感器采集、信号传输等场景中。以下是关于高斯噪声的详细说明、添加方法及滤波方案。 …...

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型(工作方式)计时器BMA(以太网)broadcast ,需要DR/BDR的选举hello:10s…...

maven编译jar踩坑[sqlite.db]

背景: 最近在项目中搞多数据源切换的job,在src/resource下有初始化的sqlite默认文件供后续拷贝使用,在测试阶段没有什么问题,但是一部署到服务器上运行就有问题。 报错现象: 找不到这个sqlite.db文件或者文件格式有问题&#x…...

【软考系统架构设计师】软件工程

1、 软件开发生命周期 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体分为问题定义、可行性研究、需求分析等 软件开发时期:软件的设计与实现,分为概要设计、详细设计、…...

蓝桥杯单片机刷题——ADC测量电位器的电压

设计要求 通过PCF8591的ADC通道测量电位器RB2的输出电压,并使用套件上提供的USB转串口功能,完成下列程序设计要求。 串口每次接收包含5个字符的字符串, 1)若接收的5个字符中有字符’a’或’A’,则数码管显示一位小数…...

零基础上手Python数据分析 (12):DataFrame 数据清洗与预处理 (下) - 类型转换、格式化、文本与日期处理

写在前面 上一篇博客,我们学习了如何使用 Pandas 处理数据分析中最常见的 “脏数据”:缺失值、重复值和异常值。 这为我们处理数据质量问题打下了坚实的基础。 然而,数据清洗的挑战远不止于此。 在实际数据中,我们还会经常遇到 数据类型不一致、数据格式不规范、文本数据混…...

免费下载 | 2025清华五道口:“十五五”金融规划研究白皮书

《2025清华五道口:“十五五”金融规划研究白皮书》的核心内容主要包括以下几个方面: 一、五年金融规划的重要功能与作用 凝聚共识:五年金融规划是国家金融发展的前瞻性谋划和战略性安排,通过广泛听取社会各界意见,凝…...

制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)

AI (神经网络模型) 可以认为是计算机的一种新的 “编程” 方式. 为了充分利用计算机, 只学习传统的编程 (编程语言/代码) 是不够的, 我们还要掌握 AI. 本文以 qwen2.5 和 llama-factory 举栗, 介绍语言模型 (LLM) 的微调 (LoRA SFT). 为了方便上手, 此处选择使用小模型 (qwen2…...

Java中parallelStream并行流使用指南

Java中parallelStream并行流使用指南 在 Java 中,parallelStream() 是 Java 8 引入的一个用于并行处理集合数据的工具,它基于 Fork/Join框架 实现,能够自动将任务拆分成子任务并利用多核处理器并行执行。以下是对 parallelStream的详细说明和…...

Python及C++中的列表

一、Python中的列表(List) Python的列表是动态数组,内置于语言中,功能强大且易用,非常适合算法竞赛。 1. 基本概念 定义:列表是一个有序、可变的序列,可以存储任意类型的元素(整数…...

mybatis plus 分页查询出来数据后对他二次 修改数据 封装返回

mybatis plus 分页查询出来数据后对他二次 修改数据 封装返回 /*** 搜索问卷** param keyword* param pageNo* param pageSize* return*/AutoLog(value "v_survey-搜索")ApiOperation(value"v_survey-搜索", notes"v_survey-搜索")GetMapping(v…...

海洋大地测量基准与水下导航系列之八我国海洋水下定位装备发展现状

中国国家综合PNT体系建设重点可概括为“51N”,“5”指5大基础设施,包括重点推进下一代北斗卫星导航系统、积极发展低轨导航增强系统、按需发展水下导航系统、大力发展惯性导航系统、积极探索脉冲星导航系统;“1”是实现1个融合发展&#xff0…...

基于单片机的电梯智能识别电动车阻车系统设计与实现

标题:基于单片机的电梯智能识别电动车阻车系统设计与实现 内容:1.摘要 随着电动车在日常生活中的普及,将电动车带入电梯带来的安全隐患日益凸显,如引发火灾等。本研究的目的是设计并实现一种基于单片机的电梯智能识别电动车阻车系统。方法上&#xff0c…...

什么是柜台债

柜台债(柜台债券业务)是指通过银行等金融机构的营业网点或电子渠道,为投资者提供债券买卖、托管、结算等服务的业务模式。它允许个人、企业及机构投资者直接参与银行间债券市场的交易,打破了以往仅限机构参与的壁垒。以下是综合多…...

.py文件和.ipynb文件的区别:完整教程

一、概述 Python开发者常用的两种文件格式.py和.ipynb各有特点,本教程将通过对比分析、代码示例和场景说明,帮助开发者全面理解二者的区别与联系。 二、核心区别对比 1. 文件格式本质 特性.ipynb文件.py文件文件类型JSON结构化文档纯文本文件存储内容…...

Python中NumPy的逻辑和比较

在数据科学和科学计算领域,NumPy是一个不可或缺的Python库。它提供了高效的多维数组对象以及丰富的数组操作函数,其中逻辑和比较操作是NumPy的核心功能之一。通过灵活运用这些操作,我们可以轻松实现数据筛选、条件判断和复杂的数据处理任务。…...

tt_Docker

快速上手 查看 Docker 服务运行状态;查看本地镜像;从 Docker Hub 拉取基础镜像, 我们此处选择 ubuntu:18.04 镜像;再次查看本地镜像;使用 ubuntu:18.04 镜像构建容器,并交互式运行容器;在容器内部执行 LS 命令;退出容器;查看本地容器实例;再次启动停止的…...

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解? code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?理解这句话的关键点1.类&#xff08…...

compose map 源码解析

目录 TileCanvas ZoomPanRotateState ZoomPanRotate 布局,手势处理完了,就开始要计算tile了 MapState TileCanvasState telephoto的源码已经分析过了.它的封装好,扩展好,适用于各种view. 最近又看到一个用compose写的map,用不同的方式,有点意思.分析一下它的实现流程与原…...

IDEA202403 常用设置【持续更新】

文章目录 1、设置maven2、设置JDK3、菜单栏固定展示4、连接Gitee第一步、安装插件第二步、Gitee账号配置 IDEA 是程序员的编程利器,需要具备其的各种配置,提高工作效率。Java项目启动,两个关键设置:Maven 和 JDK设置。 1、设置mav…...

从零开始开发纯血鸿蒙应用之语音输入

从零开始开发纯血鸿蒙应用 〇、前言一、认识 speechRecognizer1、使用方式2、依赖权限3、结果回写 二、实现语音识别功能1、创建语音识别引擎2、设置事件监听3、启动识别4、写入音频数据5、操作控制 三、总结 〇、前言 除了从图片中识别文本外,语音输入也是一种现代…...

c++ STL常用工具的整理和思考

蓝桥杯后,我整理了这些常用的C STL工具 作为一个算法竞赛的中等生,以前总觉得STL“花里胡哨”,不如自己写数组和循环踏实。但这次蓝桥杯发现,合理用STL能省很多时间,甚至避免低级错误。下面是我总结的常用知识点和踩过…...

Go:复合数据结构

数组 定义:数组是固定长度、元素数据类型相同的序列 。元素通过索引访问,索引从 0 到数组长度减 1 。可用len函数获取元素个数 。 初始化:默认元素初始值为类型零值(数字为 0 ) 。可使用数组字面量初始化,…...

SQL 语句基础(增删改查)

文章目录 一、SQL 基础概念1. SQL 简介2. 数据库系统的层次结构 二、SQL 语句分类1. DDL(Data Definition Language 数据定义语言)1.1 CREATE1.1.1 创建数据库1.1.2 创建数据表1.1.3 创建用户 1.2 ALTER1.2.1 AlTER 添加字段名1.2.2 ALTER 修改字段名1.2…...

【蓝桥杯 CA 好串的数目】题解

题目链接 考虑令 p r e [ i ] pre[i] pre[i] 表示 [ p r e [ i ] , i ] [pre[i], i] [pre[i],i] 是连续非递减子串&#xff0c;这可以类似双指针 O ( n ) O(n) O(n) 预处理&#xff1a; std::vector<int> pre(n); for (int r 1, l 0; r < n; r) {if (s[r] ! s[…...

Oracle for Linux安装和配置(11)——Linux命令

11.1. Linux命令 Linux是目前比较常用和流行的操作系统,现在很多生产环境就会用到它。随着其功能、性能、稳定性和可靠性等方面的日渐增强和完善,加之其成本上的优势,其市场占有率逐日攀升,也得到越来越多广大用户的关注和青睐。但作为一种操作系统,其安装、配置、管理和…...

Linux基础7

一、逻辑卷管理 查看所有物理卷&#xff1a;pvs 查看当前系统卷组&#xff1a;vgs 查看所有逻辑卷&#xff1a;lvs 新创建系统卷组&#xff1a;vgcreate [参数] ​ [volume name] url/sdb[1-2] ​ eg&#xff1a;vgcreate vg_Test /dev/sdb{1,2} >…...

C#打开文件及目录脚本

如果每天开始工作前都要做一些准备工作&#xff0c;比如打开文件或文件夹&#xff0c;我们可以使用代码一键完成。 using System.Diagnostics; using System.IO;namespace OpenFile {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, …...

Docker 镜像 的常用命令介绍

拉取镜像 $ docker pull imageName[:tag][:tag] tag 不写时&#xff0c;拉取的 是 latest 的镜像查看镜像 查看所有本地镜像 docker images or docker images -a查看完整的镜像的数字签名 docker images --digests查看完整的镜像ID docker images --no-trunc只查看所有的…...

Python数组学习之旅:数据结构的奇妙冒险

Python数组学习之旅:数据结构的奇妙冒险 第一天:初识数组的惊喜 阳光透过窗帘缝隙洒进李明的房间,照亮了他桌上摊开的笔记本和笔记本电脑。作为一名刚刚转行的金融分析师,李明已经坚持学习Python编程一个月了。他的眼睛因为昨晚熬夜编程而微微发红,但脸上却挂着期待的微…...

Vue 3 和 Vue 2 的区别及优点

Vue.js 是一个流行的 JavaScript 框架&#xff0c;广泛用于构建用户界面和单页应用。自 Vue 3 发布以来&#xff0c;很多开发者开始探索 Vue 3 相较于 Vue 2 的新特性和优势。Vue 3 引入了许多改进&#xff0c;优化了性能、增强了功能、提升了开发体验。本文将详细介绍 Vue 2 和…...

特殊定制版,太给力了!

今天给大家分享一款超棒的免费录屏软件&#xff0c;真的是录屏的好帮手&#xff01; 这款软件功能可以录制 MP4、AVI、WMV 格式的标清、高清、原画视频&#xff0c;满足你各种需求。 云豹录屏大师 多功能录屏神器 它的界面特别简洁&#xff0c;上手超快&#xff0c;用起来很顺…...

Vue事件修饰符课堂练习

Vue事件修饰符课堂练习 题目‌&#xff1a;基于 Vue 2.0&#xff0c;使用事件修饰符 .stop、.prevent、.capture、.self 和 .once&#xff0c;为按钮绑定 click 事件&#xff0c;并展示每个修饰符的作用。 要求‌&#xff1a; 创建一个 Vue 实例&#xff0c;并绑定到一个 HT…...

Y1——ST表

知识点 ST表 只能询问&#xff0c;不能修改 ST表的预处理&#xff1a; 使用了DP的思想&#xff0c;设a是要求区间最值的数列&#xff0c;f(i,j)表示从第i个数起连续2^j个数中的最大值 状态转移方程 f [ i , j ]max( f [ i , j-1 ], f [ i 2 ^ j-1,j - 1]) 建立ST表 vo…...