深度学习之矩阵形式的链式法则推导

深度学习之矩阵形式的链式法则推导

对于深度学习的基础“梯度下降”和“自动微分”的数学原理网上讲解的博客有很多了,但是目前没看到有讲关于矩阵形式的链式法则的内容,所以写了这篇笔记,供自己学习和复习。

文章目录

  • 深度学习之矩阵形式的链式法则推导
  • 1. 复习基础
    • 几个基本概念
    • 举例
  • 2.标量形式的链式法则
    • 拓展到向量
  • 3.矩阵形式的链式法则
    • 仅中间变量是向量
    • 所有变量均为向量

1. 复习基础

我印象中本科生学习的传统微积分中,当时学的是只有标量多元函数才能求梯度,本科阶段也只介绍了标量链式法则。为了尽可能简洁明了地进行推导,首先复习几个简单的概念:

几个基本概念

  • 方向导数:是标量多元函数沿指定方向的变化率,它在原函数的特定某点上是一个数。根据定义,方向导数是原函数沿着这一方向,自变量增加一个无穷小量后的微小变化量,除以这个无穷小量,再取极限得到的一个数。反映了原函数在这个点的特定方向上的函数值变化率。
  • 偏导数:一个多元标量函数对每个自变量各有一个偏导数。其本质是标量多元函数沿着每个元的坐标轴正方向的方向导数。
  • 梯度:是一个向量,向量的每个维度为原函数对该维度的偏导数。同时,其也是原函数在任一点沿所有方向的最大方向导数。它是原函数增长最快的方向。

我本科数学阶段老师上课所讲的多元分析学,研究的函数基本上都在标量多元函数范畴内。

根据国际惯例,本文把标量记作小写字母 x x x向量记作粗体小写字母 x \textbf{x} x或者带有箭头上标的小写字母 x ⃗ \vec{x} x 矩阵记作大写字母 X X X.

举例

下面用一个简单的二元标量函数 y = x 1 2 + x 2 2 y = x_{1}^{2} + x_{2}^{2} y=x12+x22 为例简要介绍以上基本概念:

  1. 方向导数

    ​ 求上述二元标量函数 y = f ( x ⃗ ) y=f(\vec{x}) y=f(x )在点 ( 1 , 1 ) (1,1) (1,1)沿方向 ( − 1 , − 1 ) (-1,-1) (1,1)的方向导数:

    ​ 根据定义:
    方向导数 = lim ⁡ t → 0 f ( x + t ) − f ( x ) t 其中 t 表示沿着指定方向的向量, t 表示方向向量 t 的模长 \textbf{方向导数} = \lim_{t \to 0} \frac{f(\textbf{x}+\textbf{t}) - f(\textbf{x} )}{t} \\ 其中\textbf{t}表示沿着指定方向的向量,t表示方向向量\textbf{t}的模长 方向导数=t0limtf(x+t)f(x)其中t表示沿着指定方向的向量,t表示方向向量t的模长
    ​ 代入数据:
    函数 y = x 1 2 + x 2 2 在点 ( 1 , 1 ) 处 : f ( x ) = 2 将方向向量单位化: ( − 1 2 , − 1 2 ) , 则 lim ⁡ t → 0 t ⃗ = ( − 1 2 t , − 1 2 t ) : 在点 ( 1 − 1 2 t , 1 − 1 2 t ) 处 : f ( x+t ) = t 2 − 2 2 t + 2 lim ⁡ t → 0 f ( x + t ) − f ( x ) t = t 2 − 2 2 t t = − 2 2 函数y = x_{1}^{2} + x_{2}^{2} \quad 在点(1,1)处:f(\textbf{x})=2 \\ 将方向向量单位化:(-\frac{1}{\sqrt{2}}, -\frac{1}{\sqrt{2}}),则\lim_{t\to0}\vec{t} = (-\frac{1}{\sqrt{2}}t, -\frac{1}{\sqrt{2}}t) : \\ 在点(1-\frac{1}{\sqrt{2}}t,1-\frac{1}{\sqrt{2}}t)处:f(\textbf{x+t}) = t^{2} - 2\sqrt{2}t + 2 \\ \lim_{t \to 0} \frac{f(\textbf{x}+\textbf{t}) - f(\textbf{x} )}{t} = \frac{t^{2}-2\sqrt{2}t}{t} = -2\sqrt{2} 函数y=x12+x22在点(1,1):f(x)=2将方向向量单位化:(2 1,2 1),t0limt =(2 1t,2 1t):在点(12 1t,12 1t):f(x+t)=t222 t+2t0limtf(x+t)f(x)=tt222 t=22

  2. 偏导数(偏导函数)

    求上述函数对于 x 1 x_{1} x1的偏导(函)数:

    根据定义:
    f ′ ( x 1 ) = ∂ y ∂ x 1 = 2 x 1 {f}'(x_{1}) = \frac{\partial y}{\partial x_{1}} = 2x_{1} f(x1)=x1y=2x1

  3. 梯度

​ 求原函数在点 ( 1 , 1 ) (1,1) (1,1) 处的梯度:

​ 根据定义:

▽ f = ( f ′ ( x 1 ) , f ′ ( x 2 ) , ⋯ , f ′ ( x n ) ) = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 , ⋯ , ∂ y ∂ x n ) \begin{align*} \bigtriangledown f &= (f'(x_{1}), f'(x_{2}), \cdots, f'(x_{n})) \\ & = (\frac{\partial y}{\partial x_{1}}, \frac{\partial y}{\partial x_{2}}, \cdots, \frac{\partial y}{\partial x_{n}} ) \end{align*} f=(f(x1),f(x2),,f(xn))=(x1y,x2y,,xny)

​ 代入数据得:

▽ f = ( f ′ ( x 1 ) , f ′ ( x 2 ) ) = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 ) = ( 2 x 1 , 2 x 2 ) = ( 2 , 2 ) \begin{align*} \bigtriangledown f &= (f'(x_{1}), f'(x_{2})) \\ & = (\frac{\partial y}{\partial x_{1}}, \frac{\partial y}{\partial x_{2}}) \\ & = (2x_{1}, 2x_{2}) \\ & = (2,2) \end{align*} f=(f(x1),f(x2))=(x1y,x2y)=(2x1,2x2)=(2,2)

2.标量形式的链式法则

这个是本科工科数学一元分析学的重点,此处不用多做证明,只简单地记录一下:

若 y = f ( u ) , u = g ( x ) ,其中 y , u , x 均为标量,则 : ∂ y ∂ x = ∂ y ∂ u ⋅ ∂ u ∂ x 若y=f(u), u=g(x),其中y,u,x均为标量,则:\\ \frac{\partial y}{\partial x} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial x} y=f(u),u=g(x),其中y,u,x均为标量,则:xy=uyxu

拓展到向量

y = f ( u ) , u = g ( x ⃗ ) y=f(u), u=g(\vec{x}) y=f(u),u=g(x ), 其中 x ⃗ = ( x 1 , x 2 , ⋯ , x n ) \vec{x} = (x_{1},x_{2},\cdots,x_{n}) x =(x1,x2,,xn) , y和u均为标量

则有:

∂ y ∂ x = ∂ y ∂ u ⋅ ∂ u ∂ x ( 1 , n ) = 1 ⋅ ( 1 , n ) \frac{\partial y}{\partial \textbf{x}} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial \textbf{x}} \\ (1,n) = 1\cdot(1,n) xy=uyxu(1,n)=1(1,n)

更具体的展开:

∂ y ∂ x = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 , ⋯ , ∂ y ∂ x n ) = ( ∂ y ∂ u ⋅ ∂ u ∂ x 1 , ∂ y ∂ u ⋅ ∂ u ∂ x 2 , ⋯ , ∂ y ∂ u ⋅ ∂ u ∂ x n ) = ( ∂ y ∂ u ) ⋅ ( ∂ u ∂ x 1 , ∂ u ∂ x 2 , ⋯ , ∂ u ∂ x n ) \begin{align*} \frac{\partial y}{\partial \textbf{x}} &= ( \frac{\partial y}{\partial x_{1}}, \frac{\partial y}{\partial x_{2}}, \cdots, \frac{\partial y}{\partial x_{n}}) \\ &= ( \frac{\partial y}{\partial u}\cdot\frac{\partial u}{\partial x_{1}}, \frac{\partial y}{\partial u}\cdot\frac{\partial u}{\partial x_{2}}, \cdots, \frac{\partial y}{\partial u}\cdot\frac{\partial u}{\partial x_{n}}) \\ &= (\frac{\partial y}{\partial u}) \cdot ( \frac{\partial u}{\partial x_{1}}, \frac{\partial u}{\partial x_{2}}, \cdots, \frac{\partial u}{\partial x_{n}}) \end{align*} xy=(x1y,x2y,,xny)=(uyx1u,uyx2u,,uyxnu)=(uy)(x1u,x2u,,xnu)

这是显然的。

3.矩阵形式的链式法则

前面提到的例子全部都只涉及到对标量多元函数求偏导数,这是本科的工科数学中就很熟悉的内容。下面介绍的矩阵形式的链式法则均涉及到向量多元函数的偏导数。对向量多元函数求梯度得到的是一个矩阵。

仅中间变量是向量

y = f ( u ⃗ ) , u ⃗ = g ( x ⃗ ) y=f(\vec{u}), \vec{u}=g(\vec{x}) y=f(u ),u =g(x ), 其中 u ⃗ = ( u 1 , u 2 , ⋯ , u k ) \vec{u} = (u_{1},u_{2},\cdots,u_{k}) u =(u1,u2,,uk) , x ⃗ = ( x 1 , x 2 , ⋯ , x n ) \vec{x} = (x_{1},x_{2},\cdots,x_{n}) x =(x1,x2,,xn) , y为标量

链式法则的具体展开:

∂ y ∂ x = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 , ⋯ , ∂ y ∂ x n ) = ( ∂ y ∂ u ⋅ ∂ u ∂ x 1 , ∂ y ∂ u ⋅ ∂ u ∂ x 2 , ⋯ , ∂ y ∂ u ⋅ ∂ u ∂ x n ) = ( ∂ y ∂ u ) ⋅ ( ∂ u ∂ x 1 , ∂ u ∂ x 2 , ⋯ , ∂ u ∂ x n ) = ( ∂ y ∂ u 1 , ∂ y ∂ u 2 , ⋯ , ∂ y ∂ u k ) ⋅ [ ∂ u 1 ∂ x ∂ u 2 ∂ x ⋯ ∂ u k ∂ x ] = ( ∂ y ∂ u 1 , ∂ y ∂ u 2 , ⋯ , ∂ y ∂ u k ) ⋅ [ ∂ u 1 ∂ x 1 ∂ u 1 ∂ x 2 ⋯ ∂ u 1 ∂ x n ∂ u 2 ∂ x 1 ∂ u 2 ∂ x 2 ⋯ ∂ u 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ u k ∂ x 1 ∂ u k ∂ x 2 ⋯ ∂ u k ∂ x n ] \begin{align*} \frac{\partial y}{\partial \textbf{x}} &= ( \frac{\partial y}{\partial x_{1}}, \frac{\partial y}{\partial x_{2}}, \cdots, \frac{\partial y}{\partial x_{n}}) \\ &= ( \frac{\partial y}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{1}}, \frac{\partial y}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{2}}, \cdots, \frac{\partial y}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{n}}) \\ &= (\frac{\partial y}{\partial \textbf{u}}) \cdot ( \frac{\partial \textbf{u}}{\partial x_{1}}, \frac{\partial \textbf{u}}{\partial x_{2}}, \cdots, \frac{\partial \textbf{u}}{\partial x_{n}}) \\ &= (\frac{\partial {y}}{\partial u_{1}}, \frac{\partial {y}}{\partial u_{2}}, \cdots, \frac{\partial {y}}{\partial u_{k}}) \cdot \begin{bmatrix} \frac{\partial u_{1}}{\partial \textbf{x}} \\ \frac{\partial u_{2}}{\partial \textbf{x}}\\ \cdots \\ \frac{\partial u_{k}}{\partial \textbf{x}} \end{bmatrix} \\ &= (\frac{\partial {y}}{\partial u_{1}}, \frac{\partial {y}}{\partial u_{2}}, \cdots, \frac{\partial {y}}{\partial u_{k}}) \cdot \begin{bmatrix} \frac{\partial u_{1}}{\partial x_{1}}& \frac{\partial u_{1}}{\partial x_{2}}& \cdots & \frac{\partial u_{1}}{\partial x_{n}}\\ \frac{\partial u_{2}}{\partial x_{1}}& \frac{\partial u_{2}}{\partial x_{2}}& \cdots & \frac{\partial u_{2}}{\partial x_{n}} \\ \cdots &\cdots & \cdots & \cdots \\ \frac{\partial u_{k}}{\partial x_{1}}& \frac{\partial u_{k}}{\partial x_{2}}& \cdots & \frac{\partial u_{k}}{\partial x_{n}} \end{bmatrix} \end{align*} xy=(x1y,x2y,,xny)=(uyx1u,uyx2u,,uyxnu)=(uy)(x1u,x2u,,xnu)=(u1y,u2y,,uky) xu1xu2xuk =(u1y,u2y,,uky) x1u1x1u2x1ukx2u1x2u2x2ukxnu1xnu2xnuk

即:

∂ y ∂ x = ∂ y ∂ u ⋅ ∂ u ∂ x ( 1 , n ) = ( 1 , k ) ⋅ ( k , n ) \frac{\partial y}{\partial \textbf{x}} = \frac{\partial y}{\partial \textbf{u}} \cdot \frac{\partial \textbf{u}}{\partial \textbf{x}} \\ (1,n) = (1,k)\cdot(k,n) xy=uyxu(1,n)=(1,k)(k,n)

所有变量均为向量

y ⃗ = f ( u ⃗ ) , u ⃗ = g ( x ⃗ ) \vec{y}=f(\vec{u}), \vec{u}=g(\vec{x}) y =f(u ),u =g(x ), 其中 y ⃗ = ( y 1 , y 2 , ⋯ , y m ) \vec{y} = (y_{1},y_{2},\cdots,y_{m}) y =(y1,y2,,ym) , u ⃗ = ( u 1 , u 2 , ⋯ , u k ) \vec{u} = (u_{1},u_{2},\cdots,u_{k}) u =(u1,u2,,uk) , x ⃗ = ( x 1 , x 2 , ⋯ , x n ) \vec{x} = (x_{1},x_{2},\cdots,x_{n}) x =(x1,x2,,xn)

链式法则的具体展开:

∂ y ∂ x = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 , ⋯ , ∂ y ∂ x n ) = ( ∂ y ∂ u ⋅ ∂ u ∂ x 1 , ∂ y ∂ u ⋅ ∂ u ∂ x 2 , ⋯ , ∂ y ∂ u ⋅ ∂ u ∂ x n ) = ( ∂ y ∂ u ) ⋅ ( ∂ u ∂ x 1 , ∂ u ∂ x 2 , ⋯ , ∂ u ∂ x n ) = [ ∂ y 1 ∂ u 1 ∂ y 1 ∂ u 2 ⋯ ∂ y 1 ∂ u k ∂ y 2 ∂ u 1 ∂ y 2 ∂ u 2 ⋯ ∂ y 2 ∂ u k ⋯ ⋯ ⋯ ⋯ ∂ y m ∂ u 1 ∂ y m ∂ u 2 ⋯ ∂ y m ∂ u k ] ⋅ [ ∂ u 1 ∂ x 1 ∂ u 1 ∂ x 2 ⋯ ∂ u 1 ∂ x n ∂ u 2 ∂ x 1 ∂ u 2 ∂ x 2 ⋯ ∂ u 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ u k ∂ x 1 ∂ u k ∂ x 2 ⋯ ∂ u k ∂ x n ] \begin{align*} \frac{\partial \textbf{y}}{\partial \textbf{x}} &= ( \frac{\partial \textbf{y}}{\partial x_{1}}, \frac{\partial \textbf{y}}{\partial x_{2}}, \cdots, \frac{\partial \textbf{y}}{\partial x_{n}}) \\ &= ( \frac{\partial \textbf{y}}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{1}}, \frac{\partial \textbf{y}}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{2}}, \cdots, \frac{\partial \textbf{y}}{\partial \textbf{u}}\cdot\frac{\partial \textbf{u}}{\partial x_{n}}) \\ &= (\frac{\partial \textbf{y}}{\partial \textbf{u}}) \cdot ( \frac{\partial \textbf{u}}{\partial x_{1}}, \frac{\partial \textbf{u}}{\partial x_{2}}, \cdots, \frac{\partial \textbf{u}}{\partial x_{n}}) \\ &= \begin{bmatrix} \frac{\partial y_{1}}{\partial u_{1}}& \frac{\partial y_{1}}{\partial u_{2}}& \cdots & \frac{\partial y_{1}}{\partial u_{k}}\\ \frac{\partial y_{2}}{\partial u_{1}}& \frac{\partial y_{2}}{\partial u_{2}}& \cdots & \frac{\partial y_{2}}{\partial u_{k}} \\ \cdots &\cdots & \cdots & \cdots \\ \frac{\partial y_{m}}{\partial u_{1}}& \frac{\partial y_{m}}{\partial u_{2}}& \cdots & \frac{\partial y_{m}}{\partial u_{k}} \end{bmatrix} \cdot \begin{bmatrix} \frac{\partial u_{1}}{\partial x_{1}}& \frac{\partial u_{1}}{\partial x_{2}}& \cdots & \frac{\partial u_{1}}{\partial x_{n}}\\ \frac{\partial u_{2}}{\partial x_{1}}& \frac{\partial u_{2}}{\partial x_{2}}& \cdots & \frac{\partial u_{2}}{\partial x_{n}} \\ \cdots &\cdots & \cdots & \cdots \\ \frac{\partial u_{k}}{\partial x_{1}}& \frac{\partial u_{k}}{\partial x_{2}}& \cdots & \frac{\partial u_{k}}{\partial x_{n}} \end{bmatrix} \end{align*} xy=(x1y,x2y,,xny)=(uyx1u,uyx2u,,uyxnu)=(uy)(x1u,x2u,,xnu)= u1y1u1y2u1ymu2y1u2y2u2ymuky1uky2ukym x1u1x1u2x1ukx2u1x2u2x2ukxnu1xnu2xnuk

即:

∂ y ∂ x = ∂ y ∂ u ⋅ ∂ u ∂ x ( m , n ) = ( m , k ) ⋅ ( k , n ) \frac{\partial \textbf{y}}{\partial \textbf{x}} = \frac{\partial \textbf{y}}{\partial \textbf{u}} \cdot \frac{\partial \textbf{u}}{\partial \textbf{x}} \\ (m,n) = (m,k)\cdot(k,n) xy=uyxu(m,n)=(m,k)(k,n)

如果将此时的链式法则画出计算图,可以清晰地看出,向量函数 y \textbf{y} y 对 向量 x \textbf{x} x 求偏导,实际上就是遍历了从y到x的所有依赖关系。这就是上面这个矩阵相乘的本质。 ]

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

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

相关文章

Lazada商品API接口:item_search接口中指定搜索范围

store_code: 指定商店代码。你可以使用这个参数来限制搜索结果仅返回特定商店的商品。格式为:store_code商店代码。category_id: 指定商品类别ID。通过提供特定的类别ID,你可以限制搜索结果仅返回该类别下的商品。格式为:category_id类别ID。…

【自学笔记】01Java基础-09Java关键字详解

介绍java(基于java11)中所有关键字,以及主要重要的关键字详解。 1 Java 11中的关键字: 1.1 类型声明与变量定义 boolean:声明布尔类型变量,只有两个可能值 true 或 false。byte:声明一个8位有…

复制Ubuntu遇到的问题及解决办法、Ubuntu上git命令更改和查看账户、实现Ubuntu与Windows之间的文件共享

1、复制Ubuntu遇到的问题及解决办法 (1)问题一:“该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按”获取所有权(T)”按钮获取它的所有权。否则,请按”取消(C)”按钮以防损坏。” 出现该问题的原因“未正确关闭虚…

关于java栈和堆

关于java栈和堆 在上一篇文章中我们了解了数组的声明和创建,本篇文章中我们了解一下声明数组,创建数组,给数组赋值以后,栈和堆都是怎么样子分配的,了解一下底层的逻辑知识,让大家可以更好的理解数组&#…

后端中的Dao层、Service层、Impl层、utils层、Controller层

Java Dao层 dao层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查,对外提供稳定访问数据库的方法 Mapper:(DAO) 访问数据库&am…

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 题目链接:. - 力扣(LeetCode) 文档讲解:代码随想录 视频讲解:手把手带你入门动态规划 | LeetCode:509.斐波那契数_哔哩哔哩_bilibili C代码: class Solution { public:int fib(int n) {if…

新品牌在小红书上宣传推广怎么做?

对于新品牌来说,如何在小红书进行有效的宣传推广,成为了一大挑战。本文伯乐网络传媒将为你揭秘新品牌在小红书上的宣传策略,助你牢牢抓住用户流量,提升品牌知名度。 小红书作为一款以内容为核心的社交电商平台,具有极高…

论文阅读:基于MCMC的能量模型最大似然学习剖析

On the Anatomy of MCMC-Based Maximum Likelihood Learning of Energy-Based Models 相关代码:点击 本文只介绍关于MCMC训练的部分,由此可知,MCMC常常被用于训练EBM。最后一张图源于Implicit Generation and Modeling with Energy-Based Mod…

Git提交规范详解

在团队协作开发中,Git作为版本控制系统,其提交信息的清晰性和一致性至关重要。通过定义特定的提交类型和格式,我们可以更好地追踪项目历史,提高代码审查效率,并方便生成高质量的变更日志。以下是几种常见的Git提交类型…

开发知识点-Java网络编程-Netty

Netty P1 Netty-导学分布式网络返回 异步结果dubbo rabbitmqtest 测试案例多线程 日志 第1章_01_nio三大组件-channel-buffer网络编程 框架jdk 1.4 之后才有 nio这个 APIChannel 数据传输通道 (双向)Buffer 内存缓冲区 (暂存Channel 的 数据&…

【React系列】Redux(三) state如何管理

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…

jdk动态代理与cglib代理区别1

动态代理有jdk动态代理及cglib代理&#xff0c;下面描述jdk动态代理 jdk动态代理 看了 上云 老师的视频&#xff0c;整理下 pom文件 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…

JS函数实现数字转中文大写

JS函数实现数字转中文大写 1. 数字转字符,分割,去除空字符2. 遍历分割字符,替换为中文3. 增加四位数单位4. 处理零5. 拼接四位数据和单位 项目中,JS将万亿以下正整数转为中文大写 1. 数字转字符,分割,去除空字符 function toChineseNumber(num){const strs num.toString().re…

2023海内外零知识证明学习资料汇总(一)(故事中的零知识证明篇)

工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面且有知识深度的web3开发工具、web3学习项目…

12 位多通道,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中的国产芯片ACM32F403/F433

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…

街道洗扫车VR虚拟仿真展示创新了培训方式

吸污车用于收集处理城市中的污水、污泥&#xff0c;起到疏通管道的作用&#xff0c;特别是洪涝灾害时是重要的清理工具。吸污车由于内部结构复杂、工艺原理繁琐且造价成本高&#xff0c;因此传统的吸污车作业培训难以达到满意效果。VR虚拟仿真技术的出现&#xff0c;给企业提供…

【MODBUS】J2Mod库核心代码示例

J2Mod库的Modbus核心代码主要用于实现Modbus协议的通信功能。以下是Modbus核心代码的讲解和示例&#xff1a; 1. 创建Modbus连接 首先&#xff0c;您需要创建一个Modbus连接对象&#xff0c;指定要连接的Modbus设备的IP地址和端口号。 import com.ghgande.j2mod.modbus.Modb…

ln -s 的时候,如果连接已存在,如何覆盖他

使用 ln -s 命令时&#xff0c;如果连接已存在&#xff0c;通常不会覆盖目标文件或目录。 这是因为 ln -s 命令用于创建符号链接&#xff0c;而符号链接只包含目标文件或目录的路径&#xff0c;不会直接覆盖目标文件或目录。 如果你想覆盖已存在的符号链接&#xff0c;可以使…

免费邮件系统hMailServer本地部署并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

Vscode新手安装与使用

安装与版本选择 VS Code 有两个不同的发布渠道&#xff1a;一个是我们经常使用的稳定版&#xff08;Stable&#xff09;&#xff0c;每个月发布一个主版本&#xff1b;另外一个发布渠道叫做 Insiders&#xff0c;每周一到周五 UTC 时间早上6点从最新的代码发布一个版本&#x…