论文《A recurrent latent variable model for sequential data》笔记:详解VRNN

A recurrent latent variable model for sequential data

背景

1 通过循环神经网络的序列建模

循环神经网络(RNN)可以接收一个可变长度的序列 x = ( x 1 , x 2 , . . . , x T ) x = (x_1, x_2, ..., x_T) x=(x1,x2,...,xT)作为输入,并通过递归地处理每个符号同时维持其内部隐藏状态 h h h。在每个时间步 t t t,RNN读取符号 x t x_t xt并更新其隐藏状态 h t ∈ R p h_t \in \mathbb{R}^p htRp如下:

h t = f θ ( x t , h t − 1 ) (1) h_t = f_\theta (x_t, h_{t-1})\tag{1} ht=fθ(xt,ht1)(1)

其中 f f f是一个确定性的非线性转移函数, θ \theta θ f f f的参数集。转移函数 f f f可以通过长短期记忆(LSTM)[9]或门控循环单元(GRU)[5]等具有门控激活函数的方式实现。RNN通过参数化联合序列概率分布的条件概率的乘积来建模序列:

p ( x 1 , x 2 , . . . , x T ) = ∏ t = 1 T p ( x t ∣ x < t ) p(x_1, x_2, ..., x_T) = \prod_{t=1}^{T} p(x_t | x_{<t}) p(x1,x2,...,xT)=t=1Tp(xtx<t)

p ( x t ∣ x < t ) = g τ ( h t − 1 ) (2) p(x_t | x_{<t}) = g_\tau (h_{t-1}) \tag{2} p(xtx<t)=gτ(ht1)(2)

其中 g g g是一个将 RNN 隐藏状态 h t − 1 h_{t-1} ht1映射到可能输出上的概率分布的函数, τ \tau τ g g g的参数集。

决定 RNN 表征能力的主要因素之一是输出函数 g g g在方程(2)中的定义。通过一个确定性的转移函数 f f f g g g的选择实际上定义了 RNN 能够表达的联合概率分布 p ( x 1 , . . . , x T ) p(x_1, ..., x_T) p(x1,...,xT)的家族。

我们可以将方程(2)中的输出函数 g g g表达为由两部分组成。第一部分 ϕ τ \phi_\tau ϕτ是一个函数,它根据隐藏状态 h t − 1 h_{t-1} ht1返回参数集 ϕ t \phi_t ϕt,即 ϕ t = ϕ τ ( h t − 1 ) \phi_t = \phi_\tau (h_{t-1}) ϕt=ϕτ(ht1),而 g g g的第二部分返回 x t x_t xt的密度,即 p ϕ t ( x t ∣ x < t ) p_{\phi_t} (x_t | x_{<t}) pϕt(xtx<t)

在建模高维和实值序列时,一个合理的观察模型选择是高斯混合模型(GMM),如在[7]中使用。对于 GMM, ϕ τ \phi_\tau ϕτ返回一组混合系数 α t \alpha_t αt,均值 μ t \mu_t μt,和协方差 Σ t \Sigma_t Σt,它们定义了对应混合组件下 x t x_t xt的概率。在混合分布下 x t x_t xt的概率是:

p α t , μ t , Σ t ( x t ∣ x < t ) = ∑ j α t , j N ( x t ; μ t , j , Σ t , j ) p_{\alpha_t, \mu_t, \Sigma_t} (x_t | x_{<t}) = \sum_j \alpha_{t,j} \mathcal{N}(x_t; \mu_{t,j}, \Sigma_{t,j}) pαt,μt,Σt(xtx<t)=jαt,jN(xt;μt,j,Σt,j)

除了[7]的显著例外,很少有工作研究了针对实值序列的 RNN 的结构化输出密度模型。

RNN模型输出可变性的方式可能存在一个显著问题。鉴于确定性转移函数是唯一的可变性来源,唯一的可变性来源在于条件输出概率密度。这在建模高度可变且需要高信号保真度的序列时会带来问题。为了有效地模拟这些类型的序列,RNN必须能够映射 x t x_t xt中非常微小的变化(即,随机性的唯一来源)到 h t h_t ht中可能非常大的变化。限制网络的表达能力,如必须通过提高隐藏状态的维度来对抗过拟合,将迫使在生成清晰信号和编码足够的输入可变性以捕捉高层次的可变性之间进行折中。

RNN中对高度结构化输出函数的需求已经被之前注意到过。Boulanger-Lewandowski等人[4]广泛测试了NADE和基于RBM的输出密度,用于模拟音乐的二进制向量表示的序列。Bayer和Osendorfer[2]引入了一个序列的独立潜变量表示的压缩传递到状态的RNN。他们的模型,称为STORN,首先从序列的独立潜变量中生成一系列样本 z = ( z 1 , . . . , z T ) z = (z_1, ..., z_T) z=(z1,...,zT),然后在每个时间步骤上,转移函数 f f f根据方程(1)从先前的状态 h t − 1 h_{t-1} ht1,先前的输出 x t − 1 x_{t-1} xt1和采样的潜变量 z t z_t zt计算下一个隐藏状态 h t h_t ht。他们提出根据VAE原则来训练这个模型(见第2.2节)。同样,Pachitariu和Sahani[16]早期提出了一个序列的独立潜变量和随机隐藏状态的RNN。

这些方法与本文提出的方法密切相关。然而,有一个主要差异在于如何对潜在随机变量的先验分布进行建模。与上述方法不同,我们的方法使潜在随机变量的先验分布依赖于通过RNN隐藏状态 h t − 1 h_{t-1} ht1传递的所有前序输入(见方程(5))。引入时间结构到先验分布中预计会提高模型的表征能力,这一点我们在实验中实证观察到(见表1)。然而,重要的是要注意,任何基于具有随机潜在状态的方法与拥有结构化输出函数的方法是正交的,这两者可以一起使用以形成一个单一模型。

2 变分自编码器 (Variational Autoencoder)

对于非序列化数据,变分自编码器(VAEs)[11, 17] 最近已经被证明是一个有效的建模范式,用于恢复数据空间上的复杂多模态分布。VAE引入了一组潜在随机变量 z z z,旨在捕捉观测变量 x x x 的变化。作为一个有向图模型的例子,联合分布被定义为:

p ( x , z ) = p ( x ∣ z ) p ( z ) . (3) p(x, z) = p(x | z)p(z).\tag{3} p(x,z)=p(xz)p(z).(3)

潜在随机变量的先验 p ( z ) p(z) p(z) 通常选择为一个简单的高斯分布,而条件分布 p ( x ∣ z ) p(x | z) p(xz) 是一个任意观测模型,其参数由 z z z 的参数函数计算得出。重要的是,VAE通常用一个高度灵活的函数逼近器(如神经网络)来参数化 p ( x ∣ z ) p(x | z) p(xz) 。尽管潜在随机变量模型的形式如方程 (4) 中所示并不少见,这使得条件 p ( x ∣ z ) p(x | z) p(xz) 作为从潜在变量 z z z 到观测变量 x x x 的非线性映射是VAE的一个独特特征。

然而,从 z 到 x 的高度非线性映射导致后验 p ( z ∣ x ) p(z | x) p(zx) 的推理难以处理。相反,VAE使用后验的变分近似 q ( z ∣ x ) q(z | x) q(zx) ,从而允许使用下界:

log ⁡ p ( x ) ≥ − K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) + E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] , (4) \log p(x) \geq -KL(q(z | x) || p(z)) + \mathbb{E}_{q(z|x)} [\log p(x | z)],\tag{4} logp(x)KL(q(zx)∣∣p(z))+Eq(zx)[logp(xz)],(4)

其中 K L ( Q ∣ ∣ P ) KL(Q||P) KL(Q∣∣P) 是两个分布 Q 和 P 之间的Kullback-Leibler散度。

在 [11] 中,近似后验 q ( z ∣ x ) q(z | x) q(zx)是一个高斯 N ( μ , d i a g ( σ 2 ) ) N(\mu, diag(\sigma^2)) N(μ,diag(σ2)),其均值 μ \mu μ和方差 σ 2 \sigma^2 σ2是 x 的高度非线性函数的输出,通常再次是一个神经网络。

生成模型 p ( x ∣ z ) p(x | z) p(xz)和推断模型 q ( z ∣ x ) q(z | x) q(zx)然后通过最大化它们的参数的变分下界共同训练,其中积分通过随机近似。这个估计的梯度可以有一个低方差估计,通过重新参数化 z = μ + σ ⊗ ϵ z = \mu + \sigma \otimes \epsilon z=μ+σϵ并重写:

E q ( z ∣ x ) [ log ⁡ p ( x ∣ z ) ] = E p ( ϵ ) [ log ⁡ p ( x ∣ z = μ + σ ⊗ ϵ ) ] , \mathbb{E}_{q(z|x)}[\log p(x | z)] = \mathbb{E}_{p(\epsilon)}[\log p(x | z = \mu + \sigma \otimes \epsilon)], Eq(zx)[logp(xz)]=Ep(ϵ)[logp(xz=μ+σϵ)],

其中 ϵ \epsilon ϵ是标准高斯变量的向量。推断模型可以通过标准的反向传播技术来进行随机梯度下降训练。

变分循环神经网络(VRNN)

在本节中,我们介绍了VAE的递归版本,目的是为了模拟序列。受到简单动态贝叶斯网络(DBNs)如HMMs和卡尔曼滤波器启发,提出的变分递归神经网络(VRNN)明确模型了潜在随机变量在连续时间步之间的依赖性。然而,不像这些更简单的DBN模型,VRNN保留了模拟高度非线性动态的灵活性。

VRNN每个操作的图形说明:(a) 使用方程(5)计算条件先验;(b) 使用方程(6)的生成函数;© 使用方程(7)更新RNN隐藏状态;(d) 使用方程(9)推断近似后验;(e) VRNN的整体计算路径。
image.png

Generation

VRNN在每个时间步包含一个VAE。然而,这些VAEs是基于RNN的状态变量 h t − 1 h_{t-1} ht1 的条件。这一新增功能将帮助VAE考虑到序列数据的时间结构。与标准VAE不同,潜在随机变量的先验不再是标准高斯分布,而是遵循以下分布:

z t ∼ N ( μ 0 , t , d i a g ( σ 0 , t 2 ) ) , where  [ μ 0 , t , σ 0 , t ] = ϕ t p r i o r ( h t − 1 ) , (5) z_t \sim \mathcal{N}(\mu_{0,t}, diag(\sigma_{0,t}^2)), \text{ where } [\mu_{0,t}, \sigma_{0,t}] = \phi^{prior}_t (h_{t-1}),\tag{5} ztN(μ0,t,diag(σ0,t2)), where [μ0,t,σ0,t]=ϕtprior(ht1),(5)

上述公式说明 z t z_t zt h t − 1 h_{t-1} ht1通过一个神经网络提取特征得到的 μ 0 , t , σ 0 , t \mu_{0,t}, \sigma_{0,t} μ0,t,σ0,t进行计算得到

其中 μ 0 , t \mu_{0,t} μ0,t σ 0 , t \sigma_{0,t} σ0,t 表示条件先验分布的参数。此外,生成分布不仅基于 z t z_t zt 进行条件化,也基于 h t − 1 h_{t-1} ht1,如下:

x t ∼ N ( μ x , t , d i a g ( σ x , t 2 ) ) , where  [ μ x , t , σ x , t ] = ϕ t d e c ( ϕ t p r i o r ( z t , h t − 1 ) ) , (6) x_t \sim \mathcal{N}(\mu_{x,t}, diag(\sigma_{x,t}^2)), \text{ where } [\mu_{x,t}, \sigma_{x,t}] = \phi^{dec}_t (\phi^{prior}_t (z_t, h_{t-1})),\tag{6} xtN(μx,t,diag(σx,t2)), where [μx,t,σx,t]=ϕtdec(ϕtprior(zt,ht1)),(6)

其中 μ x , t \mu_{x,t} μx,t σ x , t \sigma_{x,t} σx,t 表示生成分布的参数。生成分布的参数 ϕ t p r i o r \phi^{prior}_t ϕtprior ϕ t d e c \phi^{dec}_t ϕtdec 可以是任何高度灵活的函数,比如神经网络。 ϕ t p r i o r \phi^{prior}_t ϕtprior ϕ t d e c \phi^{dec}_t ϕtdec 也可以是神经网络,这些网络从 x t x_t xt z t z_t zt 提取特征,我们发现这些特征提取器对于学习复杂序列至关重要。RNN使用以下递归方程更新其隐藏状态:

h t = f θ ( ϕ t e n c ( x t ) , ϕ t p r i o r ( z t ) , h t − 1 ) , (7) h_t = f_{\theta}(\phi^{enc}_t (x_t), \phi^{prior}_t (z_t), h_{t-1}),\tag{7} ht=fθ(ϕtenc(xt),ϕtprior(zt),ht1),(7)

其中 f f f 最初是从方程(1)的过渡函数。从方程(7)我们发现 h t h_t ht x ≤ t x_{\leq t} xt z < t z_{<t} z<t 的函数。因此,方程(5)和方程(6)定义了分布 p ( z t ∣ x ≤ t , z < t ) p(z_t | x_{\leq t}, z_{<t}) p(ztxt,z<t) p ( x t ∣ z ≤ t , x < t ) p(x_t | z_{\leq t}, x_{<t}) p(xtzt,x<t),生成模型的参数化导致了以下因式分解的动机:

p ( x ≤ T , z ≤ T ) = ∏ t = 1 T p ( x t ∣ z ≤ t , x < t ) p ( z t ∣ x ≤ t , z < t ) . (8) p(x_{\leq T}, z_{\leq T}) = \prod_{t=1}^T p(x_t | z_{\leq t}, x_{<t})p(z_t | x_{\leq t}, z_{<t}).\tag{8} p(xT,zT)=t=1Tp(xtzt,x<t)p(ztxt,z<t).(8)

Inference

以类似的方式,近似后验不仅仅是 x t x_t xt 的函数,也是 h t − 1 h_{t-1} ht1 的函数,如下式所示:

z t ∣ x t ∼ N ( μ z , t , d i a g ( σ z , t 2 ) ) , 其中  [ μ z , t , σ z , t ] = ϕ t e n c ( ϕ t x ( x t ) , h t − 1 ) , (9) z_t | x_t \sim \mathcal{N}(\mu_{z,t}, diag(\sigma_{z,t}^2)), \text{ 其中 } [\mu_{z,t}, \sigma_{z,t}] = \phi_t^{enc}(\phi_t^x(x_t), h_{t-1}),\tag{9} ztxtN(μz,t,diag(σz,t2)), 其中 [μz,t,σz,t]=ϕtenc(ϕtx(xt),ht1),(9)

其中 μ z , t \mu_{z,t} μz,t σ z , t \sigma_{z,t} σz,t 表示近似后验的参数。我们注意到,近似后验的编码和生成的解码通过RNN隐藏状态 h t − 1 h_{t-1} ht1 进行关联。我们也观察到,对 h t − 1 h_{t-1} ht1 的这种条件化导致了因子分解:

q ( z ≤ T ∣ x ≤ T ) = ∏ t = 1 T q ( z t ∣ x ≤ t , z < t ) . (10) q(z_{\leq T} | x_{\leq T}) = \prod_{t=1}^T q(z_t | x_{\leq t}, z_{<t}).\tag{10} q(zTxT)=t=1Tq(ztxt,z<t).(10)

Learning

目标函数变为使用方程(8)和方程(10)的时间步长变分下界:

E q ( z ≤ T ∣ x ≤ T ) [ ∑ t = 1 T ( − K L ( q ( z t ∣ x ≤ t , z < t ) ∣ ∣ p ( z t ∣ x ≤ t , z < t ) ) + log ⁡ p ( x t ∣ z ≤ t , x < t ) ) ] . (11) \mathbb{E}_{q(z_{\leq T} | x_{\leq T})} \left[ \sum_{t=1}^T \left( -KL(q(z_t | x_{\leq t},z_{<t}) || p(z_t | x_{\leq t},z_{<t})) + \log p(x_t | z_{\leq t},x_{<t}) \right) \right].\tag{11} Eq(zTxT)[t=1T(KL(q(ztxt,z<t)∣∣p(ztxt,z<t))+logp(xtzt,x<t))].(11)

如同标准VAE,我们通过最大化它们参数的变分下界共同学习生成模型和推断模型。VRNN的示意图如图1所示,操作(a)-(d)分别对应于方程(1)-(7),方程(9)。VRNN在计算条件先验时应用操作(a)(见方程(5))。如果VRNN的变体(VRNN-I)不应用操作(a),那么先验在时间步之间变得独立。实际上,STORN[2]可以被认为是VRNN-I模型家族的一个实例。我们在实验评估中包括了这个模型版本(VRNN-I),以便直接研究先验(即条件先验)在潜在随机变量上的时间依赖结构的影响。

vrnn_gmm详解

代码:https://github.com/jych/nips2015_vrnn

模型的架构和数据流动如下:

模型架构

  1. 输入层

    • 数据通过train_data.theano_vars()valid_data.theano_vars()被加载为Theano变量xm_x,分别用于训练和验证。
  2. 全连接层(FullyConnectedLayer

    • x_1x_4z_1z_4是一系列用于特征变换的全连接层。每个x层处理来自上一层或原始输入x_t的信息,而每个z层处理来自潜在变量z_t的信息。
    • phi_1phi_4用于构建近似后验分布的参数。
    • prior_1prior_4用于构建先验分布的参数。
    • theta_1theta_4用于构建生成模型的参数。
  3. LSTM层

    • rnn层是一个长短时记忆单元,用于捕获数据的时序特征。
  4. 输出层

    • phi_muphi_sig层分别用于输出近似后验分布的均值和标准差。
    • prior_muprior_sig层分别用于输出先验分布的均值和标准差。
    • theta_mutheta_sig层分别用于输出生成分布的均值和标准差。

数据流动

  1. 前向传播

    • 原始输入数据x经过一系列全连接层(x_1x_4)被转换为适合LSTM层处理的形式。
  2. 递归处理

    • inner_fn函数定义了每个时间步的处理方式。它首先通过phi_*层处理输入x_t和先前的状态s_tm1来获取近似后验分布的参数,然后从该分布中采样得到z_t
    • z_t接着经过全连接层z_1z_4处理,并和x_t一起被送入rnn层得到新的状态s_t
  3. 后向传播和参数更新

    • Theano的scan函数被用来迭代整个序列,应用inner_fn函数,并收集每个时间步的输出。
    • 通过比较每一步生成的均值和标准差与先验和后验的相应值,使用KLGaussianGaussian计算Kullback-Leibler散度,作为正则化项。
    • 使用Gaussian函数计算重构损失,与KL散度相加得到变分下界(也即负对数似然)。
  4. 优化

    • 通过定义的Adam优化器和Theano函数进行梯度下降,更新模型的参数以最小化变分下界。
  5. 监控

    • monitor_fn函数用于在验证数据上计算和监控各种统计量,如模型的上界负对数似然、重构项、KL项以及各参数的最大值、最小值和均值。

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

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

相关文章

MATLAB 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器

系列文章目录 MATLAB 模型预测控制&#xff08;MPC&#xff09; 文章目录 系列文章目录前言一、使用 MPC Designer 设计控制器1.1 CSTR 模型1.2 导入被控对象并定义 MPC 结构1.3 定义输入和输出通道属性1.4 配置仿真场景1.5 配置控制器水平线1.6 定义输入约束条件1.7 指定控制…

SpringBoot-Docker容器化部署发布

在生产环境都是怎么部署 Spring Boot? 打成 jar 直接一键运行打成 war 扔到 Tomcat 容器中运行容器化部署 一、准备Docker 在 CentOS7 上安装好 Docker 修改 Docker 配置&#xff0c;开启允许远程访问 Docker 的功能&#xff0c;开启方式很简单&#xff0c;修改 /usr/lib/s…

第四代可燃气体监测仪:可燃气体监测仪在燃气管网中的作用有哪些

燃气管网如同城市的血脉&#xff0c;纵横交错着覆盖在每一寸土地。然而如此复杂的管网&#xff0c;仅靠人工巡查难免有些力不从心。毕竟人工监测的范围有其局限性&#xff0c;难以做到全方位、全天候的紧密监测&#xff0c;难免会有疏忽和遗漏。如何将安全隐患消灭于萌芽状态&a…

Linux CentOS 8(DNS的配置与管理)

Linux CentOS 8&#xff08;DNS的配置与管理&#xff09; 目录 一、DNS相关知识1.1 DNS简介1.2 DNS的解析原理1.3 DNS解析 二、DNS服务器部署2.1 不使用chroot模式启动DNS2.2 使用chroot模式DNS 三、DNS配置文件详解3.1 主配文件详解3.2 区域数据库文件详解 四、项目实施4.1 主…

【每日OJ —— 225.用队列实现栈(队列)】

每日OJ —— 225.用队列实现栈&#xff08;队列&#xff09; 1.题目&#xff1a;225.用队列实现栈&#xff08;队列&#xff09;2.解法2.1.解法讲解&#xff1a;2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;225.用队列实现栈&#xff08;队列&#xff0…

php伪随机数

利用工具 php_mt_seed <?php // php 7.2function white_list() {return mt_rand();}echo white_list(), "\n";echo white_list(), "\n";echo white_list(), "\n"; 输入命令&#xff1a; ./php_mt_seed 1035656029 <?phpmt_srand(181095…

关于校园网使用罗技flow功能

目录 情况概述问题及解决方案 情况概述 我目前设备是一台Macbook air m1处理器&#xff0c;学校给配了一台windows台式&#xff0c;台式机不能连蓝牙&#xff0c;不能连wifi&#xff0c;只能用网线&#xff0c;我的需求是想让mac和windows共用一套键鼠&#xff0c;在了解到罗技…

echarts 实现3D立体柱状图示例

该示例有如下几个特点&#xff1a; ①实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ②数据为0时&#xff0c;顶部四边形不展示 ③legend图标设置为自定义图片 【第②也是一个难点&#xff0c;我没有找到其他解决办法&#xff…

从小米14安装不上应用说起【适配64位】

一、原因 某天早上&#xff0c;同事突然对我说我换了小米14pro手机但是安装不了公司的打卡软件&#xff0c;怎么办呀。一时间&#xff0c;我也不知道原因&#xff0c;看到给我发的安装不上的截图陷入了沉思。随即打开在git仓库里找到这个项目&#xff0c;到本地编译打开&#…

对比学习15篇顶会论文及代码合集,2023最新

对比学习&#xff08;contrastive learning&#xff09;是现在无监督学习中一种常用的学习机制&#xff0c;它可以在没有标签的数据上进行学习&#xff0c;避免依赖大量标签数据&#xff0c;从而帮助我们更好地理解和利用数据集中的信息&#xff0c;提高模型的性能和表现。 作…

【前端学java】java中的字符串操作(10)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…

springcloud学生选课系统源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 学生&#xff1a; 登录&#xff0c;统计分析&#xff0c;选课&#xff08;查看课程及选择&a…

API网关那些事【架构新知系列】

目前随着云原生ServiceMesh和微服务架构的不断演进&#xff0c;网关领域新产品不断出现&#xff0c;各种网关使用的技术&#xff0c;功能和应用领域也不断扩展&#xff0c;在各有所长的前提下也有很多功能重合&#xff0c;网上各种技术PR文章&#xff0c;评测资料和网关落地实践…

新能源充电桩工业4G路由器应用,推动绿色出行,响应环保理念

在智慧城市环保事业发展领域&#xff0c;新能源技术应用成熟&#xff0c;物联网技术越来越广泛&#xff0c;充电桩物联网成为了智慧城市建设的热门应用。充电桩作为新能源汽车的重要配套设施&#xff0c;对于节能减排和推动环保理念可持续发展具有重要意义。而工业4G路由器作为…

福州大学《嵌入式系统综合设计》实验四:边缘检测

一、实验目的 BMCV 提供了一套基于 Sophon AI 芯片优化的机器视觉库&#xff0c;通过利用芯片的 TPU 和 VPP模块&#xff0c;可以完成色彩空间转换、尺度变换、仿射变换、透射变换、线性变换、画框、JPEG 编解码、BASE64 编解码、NMS、排序、特征匹配等操作。 本实验的目的是…

C++中的内存管理

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2023年11月21日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

基于C#实现KMP算法

一、BF 算法 如果让你写字符串的模式匹配&#xff0c;你可能会很快的写出朴素的 bf 算法&#xff0c;至少问题是解决了&#xff0c;我想大家很清楚的知道它的时间复杂度为 O&#xff08;MN&#xff09;&#xff0c;原因很简单&#xff0c;主串和模式串失配的时候&#xff0c;我…

电脑便签工具推荐哪个?电脑上好用的便签软件使用哪一款

对于职场办公人士来讲&#xff0c;一款好用的电脑便签工具可以给日常工作带来极大的便利&#xff0c;如果您的日常工作离不开电脑工具&#xff0c;您就会知晓电脑便签工具在日常工作中的重要&#xff0c;电脑便签通常以一个小的窗口呈现在电脑桌面上&#xff0c;记录一些工作中…

KVM网络环境下vlan和trunk的理解

vmware exsi 平台&#xff0c;虚拟交换机管理界面的上行链路是什么意思 VMware ESXi中的虚拟交换机管理界面中的“上行链路”&#xff08;uplinks&#xff09;是指虚拟交换机连接到物理网络的物理网络适配器。在ESXi中&#xff0c;虚拟交换机&#xff08;vSwitch&#xff09;用…

JAXB:根据Java文件生成XML schema文件

说明 JAXB有个schemagen脚本&#xff0c;可以根据Java文件生成XML schema。这个工具在JAXB独立发布包中有&#xff0c;可以从官网下载JAXB的独立发布包&#xff1a; https://eclipse-ee4j.github.io/jaxb-ri/ 示例 使用schemagen -d <path> <java files>格式 …