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

深度学习中的常用线性代数知识汇总——第一篇:基础概念、秩、奇异值

文章目录

      • 0. 前言
      • 1. 基础概念
      • 2. 矩阵的秩
        • 2.1 秩的定义
        • 2.2 秩的计算方法
        • 2.3 秩在深度学习中的应用
      • 3. 矩阵的奇异值
        • 3.1 奇异值分解(SVD)
        • 3.2 奇异值的定义
        • 3.3 奇异值的性质
        • 3.4 奇异值的意义
        • 3.5 实例说明
        • 3.6 奇异值在深度学习中的应用

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

在深度学习中,线性代数是最基础数学工具,它为构建和理解神经网络提供了必要的数学框架。这门课程虽然是我们大学中的必修课,但是由于其内容的晦涩、抽象以及缺少实际应用说明,是最容易还给老师的学科。

本文将汇总在深度学习中常用的、又是非常容易被忘记的线性代数知识点,并结合PyTorch代码以及深度学习中的实际应用加以说明。本文适用于任何想认真研究深度学习的新手,而对于老手同样也推荐再学习一下线性代数以夯实基础,并能激发出更深层次的思考。

这是一个系列文章,相关文章链接如下:

  • 第一篇:基础概念、秩、奇异值(本篇)
  • 第二篇:行列式、逆矩阵、特征值与特征向量
  • 第三篇:协方差矩阵、主成分分析、正交性与正定性

1. 基础概念

这一章是基础中的基础,也都非常好理解,大多数人可以跳过此章节~

  1. 向量:一个向量可以用一个列向量来表示:
    v = ( 1 2 3 ) \mathbf{v} = \begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} v= 123

  2. 矩阵:一个简单的 2x3 矩阵可以写作:
    A = ( 1 2 3 4 5 6 ) A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} A=(142536)

  3. 标量:一个标量就是一个单独的数字:
    s = 3 s = 3 s=3

  4. 向量加法:假设我们有两个向量 u \mathbf{u} u v \mathbf{v} v
    u = ( 1 2 ) , v = ( 3 4 ) \mathbf{u} = \begin{pmatrix} 1 \\ 2 \end{pmatrix}, \quad \mathbf{v} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} u=(12),v=(34)
    它们的和为:
    u + v = ( 1 + 3 2 + 4 ) = ( 4 6 ) \mathbf{u} + \mathbf{v} = \begin{pmatrix} 1 + 3 \\ 2 + 4 \end{pmatrix} = \begin{pmatrix} 4 \\ 6 \end{pmatrix} u+v=(1+32+4)=(46)

  5. 向量标量乘法:如果用标量 s = 2 s = 2 s=2 乘以向量 v = ( 1 2 3 ) \mathbf{v} = \begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} v= 123
    2 ⋅ v = 2 ⋅ ( 1 2 3 ) = ( 2 ⋅ 1 2 ⋅ 2 2 ⋅ 3 ) = ( 2 4 6 ) 2 \cdot \mathbf{v} = 2 \cdot \begin{pmatrix} 1 \\ 2 \\ 3 \end{pmatrix} = \begin{pmatrix} 2 \cdot 1 \\ 2 \cdot 2 \\ 2 \cdot 3 \end{pmatrix} = \begin{pmatrix} 2 \\ 4 \\ 6 \end{pmatrix} 2v=2 123 = 212223 = 246

  6. 矩阵加法:如果有两个同维度的矩阵 A A A B B B
    A = ( 1 2 3 4 ) , B = ( 5 6 7 8 ) A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}, \quad B = \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} A=(1324),B=(5768)
    它们的和为:
    A + B = ( 1 + 5 2 + 6 3 + 7 4 + 8 ) = ( 6 8 10 12 ) A + B = \begin{pmatrix} 1 + 5 & 2 + 6 \\ 3 + 7 & 4 + 8 \end{pmatrix} = \begin{pmatrix} 6 & 8 \\ 10 & 12 \end{pmatrix} A+B=(1+53+72+64+8)=(610812)

  7. 矩阵标量乘法:如果用标量 s = 3 s = 3 s=3乘以矩阵 A = ( 1 2 3 4 ) A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} A=(1324)
    3 ⋅ A = 3 ⋅ ( 1 2 3 4 ) = ( 3 ⋅ 1 3 ⋅ 2 3 ⋅ 3 3 ⋅ 4 ) = ( 3 6 9 12 ) 3 \cdot A = 3 \cdot \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} = \begin{pmatrix} 3 \cdot 1 & 3 \cdot 2 \\ 3 \cdot 3 & 3 \cdot 4 \end{pmatrix} = \begin{pmatrix} 3 & 6 \\ 9 & 12 \end{pmatrix} 3A=3(1324)=(31333234)=(39612)

  8. 矩阵乘法(点乘):假设有两个矩阵 A A A B B B,其中 A A A是 2x3 矩阵, B B B 是 3x2 矩阵:
    A = ( 1 2 3 4 5 6 ) , B = ( 7 8 9 10 11 12 ) A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}, \quad B = \begin{pmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{pmatrix} A=(142536),B= 791181012
    它们的乘积为:
    A B = ( ( 1 ⋅ 7 + 2 ⋅ 9 + 3 ⋅ 11 ) ( 1 ⋅ 8 + 2 ⋅ 10 + 3 ⋅ 12 ) ( 4 ⋅ 7 + 5 ⋅ 9 + 6 ⋅ 11 ) ( 4 ⋅ 8 + 5 ⋅ 10 + 6 ⋅ 12 ) ) = ( 58 64 139 154 ) AB = \begin{pmatrix} (1\cdot7 + 2\cdot9 + 3\cdot11) & (1\cdot8 + 2\cdot10 + 3\cdot12) \\ (4\cdot7 + 5\cdot9 + 6\cdot11) & (4\cdot8 + 5\cdot10 + 6\cdot12) \end{pmatrix} = \begin{pmatrix} 58 & 64 \\ 139 & 154 \end{pmatrix} AB=((17+29+311)(47+59+611)(18+210+312)(48+510+612))=(5813964154)

  9. 转置:矩阵 A = ( 1 2 3 4 5 6 ) A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} A=(142536) 的转置 A T A^T AT是:
    A T = ( 1 4 2 5 3 6 ) A^T = \begin{pmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{pmatrix} AT= 123456

  10. Hadamard 乘积:假设我们有两个 2x2 矩阵 A A A B B B

A = ( 1 2 3 4 ) , B = ( 5 6 7 8 ) A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}, \quad B = \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} A=(1324),B=(5768)

那么 A A A B B B的 Hadamard 乘积 C = A ∘ B C = A \circ B C=AB 将会是:

C = ( 1 ⋅ 5 2 ⋅ 6 3 ⋅ 7 4 ⋅ 8 ) = ( 5 12 21 32 ) C = \begin{pmatrix} 1 \cdot 5 & 2 \cdot 6 \\ 3 \cdot 7 & 4 \cdot 8 \end{pmatrix} = \begin{pmatrix} 5 & 12 \\ 21 & 32 \end{pmatrix} C=(15372648)=(5211232)

这就是通过对应元素相乘得到的矩阵。

2. 矩阵的秩

2.1 秩的定义

矩阵的秩定义为:矩阵中非零子式的最高阶数。具体来说,如果矩阵 A A A中存在一个 r r r阶非零子式,且所有 r + 1 r+1 r+1阶及更高阶的子式都为零,则称 r r r为矩阵 A A A的秩,记作 r a n k ( A ) = r rank(A) = r rank(A)=r R ( A ) = r R(A) = r R(A)=r

看到上面这段定义,你头皮发麻了吗?我也明白了当年为什么学不好线性代数了。

秩,可以理解为矩阵中线性独立列(或行)的最大数量,这样理解就简单多了,但是可能仍然比较抽象,这里可以举一个简单的例子:

如果一个人让你帮忙解一个方程组:

x + y + z = 1 x + 2 y + 2 z = 5 \begin{align*} x+y+z=1\\ x+2y+2z=5 \end{align*} x+y+z=1x+2y+2z=5

上过初中的我们都知道,要想解出这里的 x x x y y y z z z至少还需要一个方程,于是他又给了:

2 x + 3 y + 3 z = 6 2x+3y+3z=6 2x+3y+3z=6

看到这,你会不会给他一个大大的白眼,因为第三个方程它“没有用”啊!它就是第一个和第二个方程的左右分别加合而已,第三个方程的引入并没有新的信息量。如果我们把上面的系数写成矩阵的形式:

( 1 1 1 1 2 2 2 3 3 ) \begin{pmatrix} 1 & 1 &1 \\ 1 & 2 & 2 \\ 2&3&3 \end{pmatrix} 112123123

我们也可以发现:这个矩阵中的任意一行,是可以通过其他两行进行线性组合计算出来(例如:第二行 = -1×第一行+1×第三行)的,即这个矩阵的线性独立行为2,那么这个矩阵的行秩即为2。(列秩也是同样的道理)

2.2 秩的计算方法

计算矩阵的秩有多种方法,以下种常见的计算方法:

  1. 行阶梯形形式(Row Echelon Form, REF)
  2. 行最简形(Reduced Row Echelon Form, RREF)
  3. 高斯消元法(Gaussian Elimination)
  4. 高斯-若尔当消元法(Gauss-Jordan Elimination)
  5. 奇异值分解(Singular Value Decomposition, SVD)
  6. QR 分解(QR Decomposition)
  7. LU 分解(LU Decomposition)
  8. 列空间和零空间(Column Space and Null Space)分析

这些方法都可以用来确定矩阵的秩,每种方法都有其适用场景和特点。这块不是本文的介绍重点,后面仅详细介绍奇异值分解SVD方法,其他方法有需要可以自行百度。

也可以使用PyTorch中的.matrix_rank()方法求解矩阵的秩,示例代码如下:

import torch# 创建一个矩阵
matrix = torch.tensor([[1,1,1],[1,2,2],[2,3,3]],dtype=torch.float32)
# 计算矩阵的秩
rank = torch.linalg.matrix_rank(matrix)
print("Matrix:\n", matrix)
print("Rank of the matrix:", rank)

输出为:

Matrix:tensor([[1., 1., 1.],[1., 2., 2.],[2., 3., 3.]])
Rank of the matrix: tensor(2)
2.3 秩在深度学习中的应用
  1. 低秩近似:通过将高维的权重矩阵分解为低秩矩阵的乘积,可以显著减少模型的参数数量,从而实现模型压缩。这不仅减少了模型的存储需求,还能加速模型的训练和推理过程。
  2. 特征选择:通过对权重矩阵的秩进行分析,可以识别出哪些特征是冗余的(联想下上面说的“没有用”的方程),从而帮助进行特征选择,进一步减少模型复杂度。
  3. 正则化:通过正则化技术(如 L1 或 L2 正则化)来惩罚权重矩阵的范数,间接控制矩阵的秩(简单来说,正则化惩罚会鼓励权重矩阵中的元素变为0,如果矩阵中有多个零向量,那么矩阵的秩就会下降。),从而减少模型的复杂度,防止过拟合。
  4. 模型泛化能力:适当的矩阵秩有助于提升模型的泛化能力。如果矩阵的秩过高,可能导致模型过于复杂而过拟合;如果秩过低,则可能使模型过于简单而欠拟合。

3. 矩阵的奇异值

矩阵的奇异值是矩阵的一个重要属性,它们出现在矩阵的奇异值分解(Singular Value Decomposition, SVD)中。奇异值分解是线性代数中的一个重要工具,广泛应用于数据分析、信号处理、机器学习等领域。下面详细介绍矩阵的奇异值及其相关概念。

3.1 奇异值分解(SVD)

对于任何一个 m × n m \times n m×n的矩阵 A A A,都可以将其分解为三个矩阵的乘积:
A = U Σ V T A = U \Sigma V^T A=UΣVT
其中:

  • U U U是一个 m × m m \times m m×m的酉矩阵(orthogonal matrix),它的列向量是 A A A的左奇异向量。
  • Σ \Sigma Σ是一个 m × n m \times n m×n 的对角矩阵,对角线上是矩阵 A A A的奇异值,通常按从大到小的顺序排列。
  • V V V是一个 n × n n \times n n×n的酉矩阵,它的列向量是 A A A 的右奇异向量。
3.2 奇异值的定义

奇异值是对角矩阵 Σ \Sigma Σ中的非负实数对角元素。如果矩阵 A A A的秩为 r r r,那么它有 r r r个非零奇异值。其余的奇异值均为零。

3.3 奇异值的性质
  1. 非负性:奇异值是非负实数,即 σ i ≥ 0 \sigma_i \geq 0 σi0
  2. 排序:通常情况下,奇异值按从大到小的顺序排列,即 σ 1 ≥ σ 2 ≥ … ≥ σ r > 0 \sigma_1 \geq \sigma_2 \geq \ldots \geq \sigma_r > 0 σ1σ2σr>0
  3. :矩阵的秩等于非零奇异值的数量。
  4. 范数:最大奇异值是矩阵的谱范数(spectral norm),即 ∥ A ∥ 2 = σ 1 \|A\|_2 = \sigma_1 A2=σ1
  5. 伪逆:奇异值分解可以用于计算矩阵的伪逆(Moore-Penrose pseudoinverse),即 A † = V Σ † U T A^\dagger = V \Sigma^\dagger U^T A=VΣUT,其中 Σ † \Sigma^\dagger Σ Σ \Sigma Σ的对角矩阵,其非零对角元素替换为各自的倒数。
3.4 奇异值的意义

奇异值提供了矩阵的重要信息,包括但不限于:

  • 矩阵的秩:矩阵的秩等于非零奇异值的数量。
  • 矩阵的稳定性:奇异值的分布可以反映矩阵的稳定性。如果奇异值差距很大,矩阵可能是病态的(ill-conditioned),这意味着它对数值计算中的微小变化很敏感。
  • 特征向量:奇异值分解提供了矩阵的特征向量(后续文章会讲),这些向量可以用于数据的降维和特征提取。
  • 低秩近似:通过保留最大的几个奇异值及其对应的奇异向量,可以构造矩阵的低秩近似,这对于数据压缩和降维很有用。(即2.3节中的第1点)
3.5 实例说明

假设我们有一个 3x2 的矩阵 A A A

A = ( 1 2 3 4 5 6 ) A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{pmatrix} A= 135246

对其进行 SVD 分解,得到:

A = U Σ V T A = U \Sigma V^T A=UΣVT

其中 U U U V V V 是酉矩阵, Σ \Sigma Σ 是对角矩阵,包含奇异值。例如:

U = ( u 11 u 12 u 13 u 21 u 22 u 23 u 31 u 32 u 33 ) , Σ = ( σ 1 0 0 σ 2 0 0 ) , V = ( v 11 v 12 v 21 v 22 ) U = \begin{pmatrix} u_{11} & u_{12} & u_{13} \\ u_{21} & u_{22} & u_{23} \\ u_{31} & u_{32} & u_{33} \end{pmatrix}, \quad \Sigma = \begin{pmatrix} \sigma_1 & 0 \\ 0 & \sigma_2 \\ 0 & 0 \end{pmatrix}, \quad V = \begin{pmatrix} v_{11} & v_{12} \\ v_{21} & v_{22} \end{pmatrix} U= u11u21u31u12u22u32u13u23u33 ,Σ= σ1000σ20 ,V=(v11v21v12v22)

这里的 σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2就是矩阵 A A A 的奇异值。而奇异值的求解我们仍可以借助PyTorch:

import torch# 创建一个随机矩阵
A = torch.tensor([[1,2],[3,4],[5,6]],dtype=torch.float32)# 使用 torch.svd 进行奇异值分解
U, S, Vt = torch.svd(A)print("Left singular vectors (U):")
print(U)
print("Singular values (S):")
print(S)
print("Right singular vectors (V^T):")
print(Vt)

输出为:

Left singular vectors (U):
tensor([[-0.2298,  0.8835],[-0.5247,  0.2408],[-0.8196, -0.4019]])
Singular values (S):
tensor([9.5255, 0.5143])
Right singular vectors (V^T):
tensor([[-0.6196, -0.7849],[-0.7849,  0.6196]])

我们可以反过来通过重构 A A A来验算下过程的正确性:

import numpy as np
# 重构矩阵 A
Sigma = np.zeros((3, 2),dtype=np.float32)
Sigma[:2, :2] = np.diag(S)A_reconstructed = U @ Sigma @ Vt
print(A_reconstructed)

输出为:

tensor([[1.0000, 2.0000],[3.0000, 4.0000],[5.0000, 6.0000]])
3.6 奇异值在深度学习中的应用

权重的奇异值在深度学习中具有重要的意义,因为它们反映了权重矩阵的结构和性质。可以提供关于模型复杂度、稳定性以及潜在的优化方向的信息。

  1. 矩阵的秩与模型复杂度:非零奇异值较高意味着秩较大,这通常意味着模型有更多的自由度来拟合数据。如果秩过高,模型可能会过拟合;如果秩过低,则可能导致欠拟合。

  2. 模型的稳定性:条件数是矩阵的最大奇异值与最小非零奇异值的比值。条件数越大,矩阵越接近奇异,这意味着模型可能对输入数据的变化更加敏感。条件数较大的矩阵在数值计算中容易出现问题,如梯度消失或梯度爆炸。通过观察权重矩阵的奇异值分布,可以评估模型的数值稳定性。

  3. 模型的可解释性:奇异值分解不仅提供了奇异值,还提供了左奇异向量和右奇异向量。这些向量可以解释为模型中的重要特征或模式。通过分析奇异向量,可以识别哪些特征对于模型的决策最重要,从而帮助进行特征选择或特征工程。

  4. 模型压缩与加速:通过保留权重矩阵的最大几个奇异值及其对应的奇异向量,可以构建低秩近似矩阵。这种方法可以显著减少模型的参数数量,从而实现模型压缩。低秩近似不仅可以减少参数数量,还可以减少计算复杂度,从而提高模型的推理速度。

  5. 正则化与防止过拟合:通过正则化技术(如 L2 正则化)惩罚权重矩阵的范数,可以间接地控制奇异值的大小,从而控制矩阵的秩。通过限制奇异值的大小,可以减少模型的复杂度,从而防止过拟合现象的发生。

相关文章:

深度学习中的常用线性代数知识汇总——第一篇:基础概念、秩、奇异值

文章目录 0. 前言1. 基础概念2. 矩阵的秩2.1 秩的定义2.2 秩的计算方法2.3 秩在深度学习中的应用 3. 矩阵的奇异值3.1 奇异值分解(SVD)3.2 奇异值的定义3.3 奇异值的性质3.4 奇异值的意义3.5 实例说明3.6 奇异值在深度学习中的应用 0. 前言 按照国际惯例…...

MATLAB | R2024b更新了哪些好玩的东西?

Hey, 又到了一年两度的MATLAB更新时刻,MATLAB R2024b正式版发布啦!,直接来看看有哪些我认为比较有意思的更新吧! 1 小提琴图 天塌了,我这两天才写了个半小提琴图咋画,MATLAB 官方就出了小提琴图绘制方法。 小提琴图…...

嵌入式硬件基础知识

嵌入式硬件基础知识涵盖了嵌入式系统中的硬件组成及其工作原理,涉及处理器、存储器、外设接口、电源管理等多个方面。这些硬件共同构成了一个完整的嵌入式系统,用于执行特定任务。下面我们来详细介绍嵌入式硬件的基础知识。 1. 嵌入式系统的组成 嵌入式…...

keepalived和lvs高可用集群

keepavlied和lvs高可用集群搭建 主备模式: 关闭防火墙和selinux systemctl stop firewalld setenforce 0部署master负载调度服务器 zyj86 安装ipvsadm keepalived yum install -y keepalived ipvsadm修改主节点配置 vim /etc/keepalived/keepalived.conf! Conf…...

在VMware部署银河麒麟系统

虚拟机镜像安装文件从下面下载: 银河麒麟桌面操作系统V10SP1 2403 下载地址_银河麒麟v10镜像iso下载-CSDN博客 虚拟机安装要求硬盘大小至少40G,我悬着60G 选择桥接网络安装后上不了网并且和本机也互相ping不通,因此选择Nat方式,然后重启,就可以上网 下面开始安装,第一个…...

git删除本地分支报错:error: the branch ‘xxx‘ is not fully merged

git删除本地分支报错:error: the branch xxx is not fully merged error: the branch xxx is not fully merged 直接: git branch -D xxx 就可以。 如果删除远程分支: git push origin --delete origin/xxx git强制删除本地分支 git branc…...

Tensorflow 兼容性测试-opencloudos

介绍 Tensorflow 兼容性测试: 测试 Tensorflow 各个版本在 OpenCloudOS Stream 的安装支持 操作系统 [rootlab101 ~]# cat /etc/os-release NAME"OpenCloudOS Stream" VERSION"23" ID"opencloudos" ID_LIKE"opencloudos" VERSION_I…...

Windows主机上安装CUPS服务端共享USB打印机实践心得

背景 平时主力机器是Windows,不想额外开一个Linux服务器来共享打印机。由于主力机平时也不关机,尝试在Windows上安装CUPS服务。 结论 先说结论,结论是可行,但是麻烦且不稳定,虚拟机方案少折腾,但是资源消耗…...

socket通讯原理及例程(详解)

里面有疑问或者不正确的地方可以给我留言。 对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 什么是TCP/IP、UDP?Socket在哪里呢?Socket是什么呢&#xff1…...

vue3使用provide和inject传递异步请求数据子组件接收不到

前言 一般接口返回的格式是数组或对象,使用reactive定义共享变量 父组件传递 const data reactive([])// 使用settimout模拟接口返回 setTimeout(() > {// 将接口返回的数据赋值给变量Object.assign(data, [{ id: 10000 }]) }, 3000);provide(shareData, dat…...

对称矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的对称矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵&a…...

高阶数据结构之哈希表基础讲解与模拟实现

程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高阶编程—>x语言的科学与艺术—>编程之美—>编程之道—>编程之禅—>颈椎病康复指南。 前言: 哈希表(Hash Table)是一种高效的键值对存储数据结构&…...

基于STM32设计的智能货架(华为云IOT)(225)

文章目录 一、前言1.1 项目介绍【1】项目背景【2】项目支持的功能【3】项目硬件模块组成【4】ESP8266工作模式配置【5】Android手机APP开发思路【6】项目模块划分1.2 项目开发背景【1】选题来源与背景【2】国内外研究现状【3】课题研究的目的和内容【4】参考文献【5】研究内容【…...

JDBC API详解一

DriverManager 驱动管理类,作用:1,注册驱动;2,获取数据库连接 1,注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 查看Driver类源码 static{try{DriverManager.registerDriver(newDrive…...

工厂安灯系统在设备管理中的重要性

在现代制造业中,设备管理是确保生产效率和产品质量的关键环节。随着工业4.0的推进,越来越多的企业开始采用智能化的设备管理系统,其中安灯系统作为一种有效的管理工具,逐渐受到重视。安灯系统最初源于日本的丰田生产方式&#xff…...

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架,不仅要很好满足用户的功能需求,还要考虑到系统的稳定性、实时性、可扩展性、可维护性,执行效率等方面。借用一些成熟的设计框架&a…...

【CSS】 Grid布局:现代网页设计的基石

引言 最近接到一个网页布局比较复杂的页面,看了半天还是决定用grid布局来写,记录一下 布局是构建用户界面的关键部分。CSS Grid布局提供了一种简单而强大的方式来创建复杂的网格布局,它让设计师和开发者能够更直观、更灵活地控制网页的结构。…...

jQuery UI API 文档

关于《jQuery UI API 文档》,我找到了一些有用的信息。jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题。如果您是 jQuery 新手,建议您先查看 jQuery 教程。目前,我找到的资料主要是关于 jQuery UI 1.10 版…...

盘点2024年大家都在用的录屏工具

现在录屏工具的使用范围越来越广了。我的深切体验是有很多人愿意为知识付费了,但是到线下培训的话很多人时间不一定能协调的来,这就导致涌现了不少的录屏课程。这次我们来探讨下要怎么录屏才能呈现更好的效果。 1.福昕录屏大师 链接达达:ww…...

【大数据】探索怎么从一段话中解析关键信息(寄件人相关信息)

本文由ChatGPT生成,主要用于学习,大家有疑问请及时提出。 使用NLP实现文本信息解析功能:以提取姓名、地址和电话号码为例 在这个博客中,我们将通过自然语言处理(NLP)技术来实现一个简单的文本信息解析功能…...

初学者指南:MyBatis 入门教程

主要介绍了Mybatis的基本使用、JDBC、数据库连接池、lombok注解! 文章目录 前言 什么是Mybatis? 快速入门 使用Mybatis查询所有的用户信息 配置SQL提示 JDBC介绍 Mybatis 数据库连接池 lombok 总结 前言 主要介绍了Mybatis的基本使用、JDBC、数据库连接…...

reader-lm:小模型 html转markdown

参考: https://huggingface.co/jinaai/reader-lm-0.5b 在线demo: https://colab.research.google.com/drive/1wXWyj5hOxEHY6WeHbOwEzYAC0WB1I5uA#scrollTo0mG9ISzHOuKK 输入网址:https://www.galaxy-geely.com/E5 结果: 代码…...

进击J6:ResNeXt-50实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、实验目的: 阅读ResNeXt论文,了解作者的构建思路对比之前介绍的ResNet50V2、DenseNet算法使用ResNeXt-50算法完成猴痘病识别 二、实…...

新代机床采集数据

新代集團1995年成立於台灣新竹,事業版圖遍布全球,以台灣為中心向外發展,據點橫跨歐洲、美洲、亞洲三大洲。新代長期深耕於機床控制器的軟體及硬體技術研發,專注於運動控制領域,目前已成為亞太市場中深具影響力的控制器領導品牌之一。主營產品包括:機床數控系統、伺服驅動…...

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑,对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司,致力于提供专业的数据标注服务,帮助客户解决AI链条中的数据处理难题,共同推动人工…...

k8s以及prometheus

#生成控制器文件并建立控制器 [rootk8s-master ~]# kubectl create deployment bwmis --image timinglee/myapp:v1 --replicas 2 --dry-runclient -o yaml > bwmis.yaml [rootk8s-master ~]# kubectl expose deployment bwmis --port 80 --target-port 80 --dry-runclient…...

android 权限说明

1. 权限的定义语法 注&#xff1a; 任何应用都可以定义权限 <permission 标签是定义权限 <uses-permission 标签是使用权限。 <permission android:description"string resource"android:icon"drawable resource"android:label"string res…...

<winsock>重叠IO模型

基于事件判断io完成 send程序 #include <stdio.h> #include <winsock2.h>#pragma comment(lib, "Ws2_32.lib") #pragma warning(disable : 4996)int main() {WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) ! 0){printf("WSAStart…...

Android Tools | 如何使用Draw.io助力Android开发:从UI设计到流程优化

Android Tools | 如何使用Draw.io助力Android开发&#xff1a;从UI设计到流程优化 1. 引言 在Android开发中&#xff0c;视觉化设计与流程管理至关重要。虽然开发工具如Android Studio强大&#xff0c;但它并不适用于所有设计场景。Draw.io是一款免费的在线绘图工具&#xff…...

Java 每日一刊(第5期):变量守护者

前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; 量子数据宇宙的变量守护者第一章&#xff1a;能源错配与基本数据类型第二章&#xff1a;引用类型与通讯网络的崩溃第三章&#xff1a;作用域冲突与系统崩溃终章&#xff1…...