计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)

news2024/10/5 18:25:42

计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)

flyfish

链式法则在深度学习中的主要应用是在反向传播(backpropagation)算法中。
从简单的开始 ,文本说的就是链式法则

R \mathbb{R} R

  • 英文:The set of real numbers
  • 解释:符号 R \mathbb{R} R 表示所有实数的集合,包括所有正数、负数和零。在英语中,这个符号称为 “the set of real numbers” 或简称 “the reals”。
  • 读作:实数集
  • 含义:符号 R \mathbb{R} R 表示所有实数的集合。在数学中,这个符号用来指代从负无穷到正无穷的所有实数。

f ∘ g f \circ g fg

  • 读作 f f f 复合 g g g
  • 含义:符号 ∘ \circ 表示函数的复合。复合函数 f ∘ g f \circ g fg 表示先应用函数 g g g,然后将 g g g 的输出作为函数 f f f 的输入。形式上,这可以写作:
    ( f ∘ g ) ( x ) = f ( g ( x ) ) (f \circ g)(x) = f(g(x)) (fg)(x)=f(g(x))

例子

假设我们有两个函数 g ( x ) = 2 x + 3 g(x) = 2x + 3 g(x)=2x+3 f ( u ) = u 3 f(u) = u^3 f(u)=u3,复合函数 f ∘ g f \circ g fg 表示为:
( f ∘ g ) ( x ) = f ( g ( x ) ) = f ( 2 x + 3 ) = ( 2 x + 3 ) 3 (f \circ g)(x) = f(g(x)) = f(2x + 3) = (2x + 3)^3 (fg)(x)=f(g(x))=f(2x+3)=(2x+3)3

箭头符号的意义

  • f : A → B f: A \to B f:AB 表示函数 f f f 将集合 A A A 中的每个元素映射到集合 B B B 中的一个元素。
  • x ↦ f ( x ) x \mapsto f(x) xf(x) 表示 x x x 经过函数 f f f 的映射得到 f ( x ) f(x) f(x)

例子

  1. 简单映射
    f : R → R f: \mathbb{R} \to \mathbb{R} f:RR 表示一个从实数集合到实数集合的函数。具体的映射可以是:
    f ( x ) = x 2 f(x) = x^2 f(x)=x2
    这里, f f f 将每个实数 x x x 映射到它的平方 x 2 x^2 x2
  2. 复合函数的映射
    如果有两个函数 g g g f f f
  • g : R → R g: \mathbb{R} \to \mathbb{R} g:RR
  • f : R → R f: \mathbb{R} \to \mathbb{R} f:RR并且 g ( x ) = 2 x + 3 g(x) = 2x + 3 g(x)=2x+3 f ( u ) = u 3 f(u) = u^3 f(u)=u3,那么复合函数 f ∘ g f \circ g fg 可以表示为:
    ( f ∘ g ) ( x ) = f ( g ( x ) ) (f \circ g)(x) = f(g(x)) (fg)(x)=f(g(x))
    具体的映射是:
    g : x ↦ 2 x + 3 g: x \mapsto 2x + 3 g:x2x+3
    f : u ↦ u 3 f: u \mapsto u^3 f:uu3
    结合起来:
    ( f ∘ g ) : x ↦ ( 2 x + 3 ) 3 (f \circ g): x \mapsto (2x + 3)^3 (fg):x(2x+3)3

函数的映射关系

在数学中,函数的定义和使用广泛应用于各种映射关系中。箭头符号帮助我们清晰地描述这些关系。更具体地:

  • 箭头 → \to 用于描述集合之间的映射关系。
  • 箭头 ↦ \mapsto 用于描述具体的元素如何被映射。

复合函数的表示

复合函数的映射关系可以通过箭头符号更直观地表示:

  1. g : A → B g: A \to B g:AB
  2. f : B → C f: B \to C f:BC
  3. 复合函数 f ∘ g f \circ g fg 的映射关系为 f ∘ g : A → C f \circ g: A \to C fg:AC
    假设 g g g x x x 映射到 u u u,即 g : x ↦ u g: x \mapsto u g:xu,并且 f f f u u u 映射到 y y y,即 f : u ↦ y f: u \mapsto y f:uy。那么复合函数 f ∘ g f \circ g fg x x x 直接映射到 y y y,即:
    ( f ∘ g ) : x ↦ f ( g ( x ) ) (f \circ g): x \mapsto f(g(x)) (fg):xf(g(x))

复合函数的概念

如果我们有两个函数:

  • g : A → B g: A \to B g:AB
  • f : B → C f: B \to C f:BC
    其中,函数 g g g 将集合 A A A 中的元素映射到集合 B B B,而函数 f f f 将集合 B B B 中的元素映射到集合 C C C。那么,复合函数 f ∘ g f \circ g fg 将集合 A A A 中的元素直接映射到集合 C C C,即:
    ( f ∘ g ) ( x ) = f ( g ( x ) ) (f \circ g)(x) = f(g(x)) (fg)(x)=f(g(x))

例子

  1. 简单的复合函数
    g ( x ) = x 2 g(x) = x^2 g(x)=x2 f ( u ) = sin ⁡ ( u ) f(u) = \sin(u) f(u)=sin(u)。复合函数 ( f ∘ g ) ( x ) (f \circ g)(x) (fg)(x) 表示为:
    ( f ∘ g ) ( x ) = f ( g ( x ) ) = sin ⁡ ( x 2 ) (f \circ g)(x) = f(g(x)) = \sin(x^2) (fg)(x)=f(g(x))=sin(x2)
    在这个例子中,先计算内部函数 g ( x ) = x 2 g(x) = x^2 g(x)=x2,然后将结果代入到外部函数 f ( u ) = sin ⁡ ( u ) f(u) = \sin(u) f(u)=sin(u)
  2. 其他例子
    g ( x ) = 2 x + 3 g(x) = 2x + 3 g(x)=2x+3 f ( u ) = u 3 f(u) = u^3 f(u)=u3。复合函数 ( f ∘ g ) ( x ) (f \circ g)(x) (fg)(x) 表示为:
    ( f ∘ g ) ( x ) = f ( g ( x ) ) = ( 2 x + 3 ) 3 (f \circ g)(x) = f(g(x)) = (2x + 3)^3 (fg)(x)=f(g(x))=(2x+3)3

假设我们有两个函数 g ( x ) g(x) g(x) f ( u ) f(u) f(u)

  1. 先绘制 g ( x ) g(x) g(x) 的图形。例如, g ( x ) = x 2 g(x) = x^2 g(x)=x2 是一个抛物线。
  2. 然后将 g ( x ) g(x) g(x) 的输出代入 f ( u ) f(u) f(u),绘制 f ( g ( x ) ) f(g(x)) f(g(x)) 的图形。例如, f ( u ) = sin ⁡ ( u ) f(u) = \sin(u) f(u)=sin(u),将 u = x 2 u = x^2 u=x2 代入,得到 sin ⁡ ( x 2 ) \sin(x^2) sin(x2) 的图形。
    在这里插入图片描述
import numpy as np
import matplotlib.pyplot as plt

# 定义两个函数
def g(x):
    return x**2

def f(u):
    return np.sin(u)

# 生成x的值
x = np.linspace(-2, 2, 400)
y_g = g(x)
y_f = f(y_g)

# 初始化图形
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 12))

# 绘制函数 g(x)
ax1.plot(x, y_g, label=r'$g(x) = x^2$', color='blue')
ax1.set_title('Function $g(x)$')
ax1.set_xlabel('$x$')
ax1.set_ylabel('$g(x)$')
ax1.legend()

# 绘制函数 f(u)
u = np.linspace(0, 4, 400)
ax2.plot(u, f(u), label=r'$f(u) = \sin(u)$', color='green')
ax2.set_title('Function $f(u)$')
ax2.set_xlabel('$u$')
ax2.set_ylabel('$f(u)$')
ax2.legend()

# 绘制复合函数 h(x) = f(g(x))
ax3.plot(x, y_f, label=r'$h(x) = \sin(x^2)$', color='red')
ax3.set_title('Composite Function $h(x) = f(g(x))$')
ax3.set_xlabel('$x$')
ax3.set_ylabel('$h(x)$')
ax3.legend()

# 调整子图之间的间距
plt.subplots_adjust(hspace=0.5)

# 显示图形
plt.show()

链式法则(Chain Rule)是微积分中一个重要的求导法则,它用于求复合函数的导数。复合函数是指一个函数的输入是另一个函数的输出,形式上可以写作 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x))。链式法则告诉我们如何求这种复合函数的导数。

如果我们有两个函数 f f f g g g,其中 y = f ( u ) y = f(u) y=f(u) u = g ( x ) u = g(x) u=g(x),那么根据链式法则,复合函数 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)) x x x 的导数可以表示为:
d y d x = d y d u ⋅ d u d x \frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} dxdy=dudydxdu

用更直观的方式理解,链式法则表明:

  1. 首先求出内部函数 u = g ( x ) u = g(x) u=g(x) x x x 的导数,即 d u d x \frac{du}{dx} dxdu
  2. 然后求出外部函数 y = f ( u ) y = f(u) y=f(u) u u u 的导数,即 d y d u \frac{dy}{du} dudy
  3. 最后将这两个导数相乘,得到复合函数 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)) x x x 的导数。

例子

假设有函数 y = sin ⁡ ( x 2 ) y = \sin(x^2) y=sin(x2),我们希望求 y y y x x x 的导数。

  1. 首先,我们将 y = sin ⁡ ( x 2 ) y = \sin(x^2) y=sin(x2) 看作两个函数的复合,即 y = sin ⁡ ( u ) y = \sin(u) y=sin(u) u = x 2 u = x^2 u=x2
  2. 对内部函数 u = x 2 u = x^2 u=x2 求导: d u d x = 2 x \frac{du}{dx} = 2x dxdu=2x
  3. 对外部函数 y = sin ⁡ ( u ) y = \sin(u) y=sin(u) 求导: d y d u = cos ⁡ ( u ) \frac{dy}{du} = \cos(u) dudy=cos(u)
  4. 将这两个结果相乘: d y d x = d y d u ⋅ d u d x = cos ⁡ ( x 2 ) ⋅ 2 x \frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} = \cos(x^2) \cdot 2x dxdy=dudydxdu=cos(x2)2x
    所以, y = sin ⁡ ( x 2 ) y = \sin(x^2) y=sin(x2) x x x 的导数为:
    d y d x = 2 x cos ⁡ ( x 2 ) \frac{dy}{dx} = 2x \cos(x^2) dxdy=2xcos(x2)

微分符号 d d d 的含义

  1. 导数的定义
    导数表示函数在某一点的变化率。对于函数 y = f ( x ) y = f(x) y=f(x),它在 x x x 处的导数定义为: d y d x = lim ⁡ Δ x → 0 Δ y Δ x \frac{dy}{dx} = \lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} dxdy=limΔx0ΔxΔy这里, Δ y \Delta y Δy Δ x \Delta x Δx 分别表示 y y y x x x 的增量。当这些增量趋近于零时,我们用 d y dy dy d x dx dx 来表示这些非常小的变化量。
  2. 微分表示法
    微分符号 d d d 用于表示一个函数的微小变化。例如, d x dx dx 表示变量 x x x 的一个非常小的变化量。同样地, d y dy dy 表示函数 y y y 的一个非常小的变化量。如果 y = f ( x ) y = f(x) y=f(x),那么 d y dy dy 表示 y y y x x x 的微小变化,可以表示为: d y = f ′ ( x ) ⋅ d x dy = f'(x) \cdot dx dy=f(x)dx这里, f ′ ( x ) f'(x) f(x) 是函数 f ( x ) f(x) f(x) 的导数,表示 x x x 处的变化率。

链式法则中的 d d d

在链式法则中, d d d 表示不同变量的微小变化。例如:

  • d u du du 表示变量 u u u 的微小变化量。

  • d x dx dx 表示变量 x x x 的微小变化量。

  • d y dy dy 表示函数 y y y 的微小变化量。
    链式法则告诉我们,当我们有复合函数 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)) 时, y y y x x x 的变化可以分解为 y y y u u u 的变化以及 u u u x x x 的变化:
    d y d x = d y d u ⋅ d u d x \frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} dxdy=dudydxdu
    这里,每个 d d d 都表示相应变量的微小变化。例如:

  • d y d x \frac{dy}{dx} dxdy 表示 y y y x x x 的变化率。

  • d y d u \frac{dy}{du} dudy 表示 y y y u u u 的变化率。

  • d u d x \frac{du}{dx} dxdu 表示 u u u x x x 的变化率。
    通过这样分解,我们可以更容易地计算复合函数的导数。

基于极限和增量来理解链式法则

  1. 定义复合函数和导数
  • y = f ( u ) y = f(u) y=f(u),其中 u = g ( x ) u = g(x) u=g(x)
  • 我们需要求 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)) x x x 的导数。
  1. 增量表示
  • Δ x \Delta x Δx x x x 的一个非常小的增量。
  • 相应的, u u u 有一个非常小的增量 Δ u \Delta u Δu,其中 Δ u = g ( x + Δ x ) − g ( x ) \Delta u = g(x + \Delta x) - g(x) Δu=g(x+Δx)g(x)
  • y y y 的增量表示为 Δ y = f ( g ( x + Δ x ) ) − f ( g ( x ) ) \Delta y = f(g(x + \Delta x)) - f(g(x)) Δy=f(g(x+Δx))f(g(x))
  1. 导数的定义 d y d x = lim ⁡ Δ x → 0 Δ y Δ x \frac{dy}{dx} = \lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} dxdy=limΔx0ΔxΔy
  2. 应用链式法则的思想 Δ y = f ( g ( x + Δ x ) ) − f ( g ( x ) ) \Delta y = f(g(x + \Delta x)) - f(g(x)) Δy=f(g(x+Δx))f(g(x))可以表示为: Δ y Δ x = f ( g ( x + Δ x ) ) − f ( g ( x ) ) Δ x \frac{\Delta y}{\Delta x} = \frac{f(g(x + \Delta x)) - f(g(x))}{\Delta x} ΔxΔy=Δxf(g(x+Δx))f(g(x))
  3. 拆分增量
    由于 u = g ( x ) u = g(x) u=g(x),我们可以引入 Δ u \Delta u Δu Δ y Δ x = f ( g ( x + Δ x ) ) − f ( g ( x ) ) g ( x + Δ x ) − g ( x ) ⋅ g ( x + Δ x ) − g ( x ) Δ x \frac{\Delta y}{\Delta x} = \frac{f(g(x + \Delta x)) - f(g(x))}{g(x + \Delta x) - g(x)} \cdot \frac{g(x + \Delta x) - g(x)}{\Delta x} ΔxΔy=g(x+Δx)g(x)f(g(x+Δx))f(g(x))Δxg(x+Δx)g(x)
  4. 极限过程
    Δ x → 0 \Delta x \to 0 Δx0,我们有 Δ u → 0 \Delta u \to 0 Δu0,因此: d y d x = lim ⁡ Δ x → 0 ( f ( g ( x + Δ x ) ) − f ( g ( x ) ) g ( x + Δ x ) − g ( x ) ⋅ g ( x + Δ x ) − g ( x ) Δ x ) \frac{dy}{dx} = \lim_{\Delta x \to 0} \left( \frac{f(g(x + \Delta x)) - f(g(x))}{g(x + \Delta x) - g(x)} \cdot \frac{g(x + \Delta x) - g(x)}{\Delta x} \right) dxdy=Δx0lim(g(x+Δx)g(x)f(g(x+Δx))f(g(x))Δxg(x+Δx)g(x))根据导数的定义,我们有: d y d x = ( lim ⁡ Δ u → 0 Δ y Δ u ) ⋅ ( lim ⁡ Δ x → 0 Δ u Δ x ) \frac{dy}{dx} = \left( \lim_{\Delta u \to 0} \frac{\Delta y}{\Delta u} \right) \cdot \left( \lim_{\Delta x \to 0} \frac{\Delta u}{\Delta x} \right) dxdy=(Δu0limΔuΔy)(Δx0limΔxΔu)
  5. 导数表示 d y d x = d y d u ⋅ d u d x \frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx} dxdy=dudydxdu其中, d y d u = lim ⁡ Δ u → 0 Δ y Δ u \frac{dy}{du} = \lim_{\Delta u \to 0} \frac{\Delta y}{\Delta u} dudy=Δu0limΔuΔy d u d x = lim ⁡ Δ x → 0 Δ u Δ x \frac{du}{dx} = \lim_{\Delta x \to 0} \frac{\Delta u}{\Delta x} dxdu=Δx0limΔxΔu
    因此复合函数的导数可以表示为外层函数的导数乘以内层函数的导数。

可视化

  • g(x):定义了内层函数 sin ⁡ ( x ) \sin(x) sin(x)
  • f(u):定义了外层函数 exp ⁡ ( u ) \exp(u) exp(u)
  • g_prime(x) 和 f_prime(u):定义了对应的导数。
  • h(x):复合函数 e sin ⁡ ( x ) e^{\sin(x)} esin(x)
  • h_prime(x):复合函数的导数,使用链式法则 f ′ ( g ( x ) ) ⋅ g ′ ( x ) f'(g(x)) \cdot g'(x) f(g(x))g(x)

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 定义两个函数及其导数
def g(x):
    return np.sin(x)

def f(u):
    return np.exp(u)

def g_prime(x):
    return np.cos(x)

def f_prime(u):
    return np.exp(u)

# 复合函数及其导数
def h(x):
    return f(g(x))

def h_prime(x):
    return f_prime(g(x)) * g_prime(x)

# 生成x的值
x = np.linspace(0, 2 * np.pi, 400)
y_g = g(x)
y_f = f(y_g)
y_h = h(x)

# 初始化图形
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 12))

# 绘制函数 g(x)
ax1.plot(x, y_g, label=r'$g(x) = \sin(x)$', color='blue')
ax1.set_title('Function $g(x)$')
ax1.set_xlabel('$x$')
ax1.set_ylabel('$g(x)$')
ax1.legend()

# 绘制函数 f(u)
u = np.linspace(-1, 1, 400)
ax2.plot(u, f(u), label=r'$f(u) = e^{u}$', color='green')
ax2.set_title('Function $f(u)$')
ax2.set_xlabel('$u$')
ax2.set_ylabel('$f(u)$')
ax2.legend()

# 绘制复合函数 h(x) = f(g(x))
ax3.plot(x, y_h, label=r'$h(x) = e^{\sin(x)}$', color='red')
ax3.set_title('Composite Function $h(x) = f(g(x))$')
ax3.set_xlabel('$x$')
ax3.set_ylabel('$h(x)$')
ax3.legend()

plt.subplots_adjust(hspace=0.5)

# 初始化点和切线
point1, = ax1.plot([], [], 'ro')  # 点
tangent_line1, = ax1.plot([], [], 'r--')  # 切线

point2, = ax2.plot([], [], 'ro')  # 点
tangent_line2, = ax2.plot([], [], 'r--')  # 切线

point3, = ax3.plot([], [], 'ro')  # 点
tangent_line3, = ax3.plot([], [], 'r--')  # 切线

def init():
    point1.set_data([], [])
    tangent_line1.set_data([], [])
    point2.set_data([], [])
    tangent_line2.set_data([], [])
    point3.set_data([], [])
    tangent_line3.set_data([], [])
    return point1, tangent_line1, point2, tangent_line2, point3, tangent_line3

def animate(i):
    x0 = i * 2 * np.pi / 100  # 从 0 开始,步长为 2π / 100
    y0_g = g(x0)
    y0_h = h(x0)
    
    # 绘制 g(x) 的点和切线
    slope_g = g_prime(x0)
    point1.set_data([x0], [y0_g])
    tangent_x1 = np.array([x0 - 0.5, x0 + 0.5])
    tangent_y1 = y0_g + slope_g * (tangent_x1 - x0)
    tangent_line1.set_data(tangent_x1, tangent_y1)
    
    # 绘制 f(g(x)) 的点和切线
    u0 = y0_g
    y0_f = f(u0)
    slope_f = f_prime(u0)
    point2.set_data([u0], [y0_f])
    tangent_x2 = np.array([u0 - 0.5, u0 + 0.5])
    tangent_y2 = y0_f + slope_f * (tangent_x2 - u0)
    tangent_line2.set_data(tangent_x2, tangent_y2)
    
    # 绘制 h(x) = f(g(x)) 的点和切线
    slope_h = h_prime(x0)
    point3.set_data([x0], [y0_h])
    tangent_x3 = np.array([x0 - 0.5, x0 + 0.5])
    tangent_y3 = y0_h + slope_h * (tangent_x3 - x0)
    tangent_line3.set_data(tangent_x3, tangent_y3)
    
    return point1, tangent_line1, point2, tangent_line2, point3, tangent_line3

ani = animation.FuncAnimation(fig, animate, frames=100, init_func=init, blit=True)

# 保存为gif
ani.save('chain_rule_animation.gif', writer='imagemagick')

# 显示动画
plt.show()

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

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

相关文章

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份,确保只有授权的用户可以访问和管理酒店客房信…

如何利用react框架快速创建一个electron项目

1、搭建electron项目 创建一个electron入门项目还是很容易的,基体方法可以参考:eletron入门教程 -- 快速写一个electron demo程序 但是如果要利用react框架搭建一个electron项目,但是有一点麻烦,不过可以利用工具包来进行创建&am…

opengl 实现反锯齿

// 启用混合 //glEnable(GL_BLEND); // 设置混合函数 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //glEnable(GL_POINT_SMOOTH); // 启用点平滑 //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // 选择最佳点平滑 glEnable(GL_BLEND); glBlendFu…

这四款软件很好用,可以提升工作、学习效率

TableConvert TableConvert是一个基于Web的在线表格转换工具,能够将多种格式的表格数据进行快速转换。它支持将Excel、URL、HTML、JSON、CSV等格式转换为Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用户只需将表格数据粘贴到编辑器&#…

pikachu靶场 利用Rce上传一句话木马案例(工具:中国蚁剑)

目录 一、准备靶场,进入RCE 二、测试写入文件 三、使用中国蚁剑 一、准备靶场,进入RCE 我这里用的是pikachu 打开pikachu靶场,选择 RCE > exec "ping" 测试是否存在 Rce 漏洞 因为我们猜测在这个 ping 功能是直接调用系统…

驱动开发:配置Visual Studio驱动开发环境

100编程书屋_孔夫子旧书网 配置驱动开发环境配置驱动开发模板配置驱动双机调试 在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的…

【单片机毕业设计选题24038】-基于STM32的木材厂环境监测系统

系统功能: 系统上电后根据采集到的传感器值自动控制,温度过高后自动开启风扇通风降温,湿度过 高后自动开启风扇除湿,光照过低后自动开启补光,雨量过高蜂鸣器报警,火焰传感器检 测到火灾后蜂鸣器报警并打开水泵灭火。…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞,读取任意文件,对服务器造成危害。 程序开发人员为了代码的灵活性,常常会将包含文件的路径…

c++重载(运算符)

1)C入门级小知识,分享给将要学习或者正在学习C开发的同学。 2)内容属于原创,若转载,请说明出处。 3)提供相关问题有偿答疑和支持。 对于系统的所有操作符,一般情况下,只支持基本数…

算法:链表

目录 链表的技巧和操作总结 常用技巧: 链表中的常用操作 题目一:反转一个单链表 题目二:链表的中间结点 题目三:返回倒数第k个结点 题目四:合并两个有序链表 题目五:移除链表元素 题目六&#xff…

【快速排序】| 详解快速排序 力扣912

🎗️ 主页:小夜时雨 🎗️专栏:快速排序 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/sort-an-array/ 我们上道题讲过快速排序的核心代码&a…

三元表达式解析器

题意:其实本质上就是三目运算 ,只不过跟我们以往的三目运算不同的是,这一系列的运算可以把T 和 F 都参与到运算中。设x5 表达式 x>2?T:F 最终返回T. 思路: 1.从后往前遍历字符数组 2.如果遇到的是 非?和 非&…

[C++][设计模式][中介者模式]详细讲解

目录 1.动机2.模式定义3.要点总结 1.动机 在软件构建过程中,经常会出现多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化在这种情况下,可以…

2-自动驾驶关键技术框架

框架 来自《自动驾驶汽车决策与控制》这本书 三大技术 车载平台的关键技术: 环境感知技术:这是自动驾驶车辆能够“看”和“感知”周围世界的技术。它包括使用摄像头、雷达、激光雷达(Lidar)和超声波传感器来检测和识别道路、障…

Efficient Unified Demosaicing for Bayer and Non-Bayer Patterned Image Sensors

这篇文章是 2023 ICCV 的一篇文章,主要介绍一套统一的去马赛克的算法框架的 由于手机 Camera 上 CMOS 的单个 pixel size 比较小,所以现在很多手机的 Camera CMOS 会采用一些独特的非 Bayer 模式的 CFA (Quad, Nona 以及 Q X Q) 等,这类非 B…

redis实战-添加商户缓存

为什么要使用缓存 言简意赅:速度快,好用缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力实际开发中,企业的数据量,少…

vs 2019 Release模式下采用Debug断点调试

由于Release默认模式是不能调试的,有时候我们需要调试,属性更改如下所示: 再次启动程序,就可以进行调试

C语言 for循环

for循环语句 //初始化 //判断 //调整 for(表达式1; 表达式2; 表达式3;)循环语句; 例: for循环里break for循环里continue 注:1.不可在for循环体内修改循环变量,防止for循环失去控制 2.建议for语句的循环控制变量的…

qiankun微前端:qiankun+vite+vue3+ts(未完待续..)

目录 什么是微前端 目前现有的微前端 好处 使用 子应用的页面在主应用里显示 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 我的理解就是将一个大型的前端应用拆分成多个模块,每个微前端模块可以由…

《编译原理》阅读笔记:p25-p32

《编译原理》学习第 5 天,p25-p32总结,总计 8 页。 一、技术总结 1.lexical lexical这个单词后续会经常用到,所以首先要搞懂它的英文意思,不然看到中文的“词法,语法,文法”这三个词的时候就会懵了——l…