Flow模型

一、简述

        Flow模型是生成模型,目标是找到输入样本的分布。Flow模型选择直接直面生成模型的概率计算。

       流模型有一个非常与众不同的特点是,它的转换通常是可逆的。也就是说,流模型不仅能找到从A分布变化到B分布的网络通路,并且该通路也能让B变化到A,简言之流模型找到的是一条A、B分布间的双工通路。当然,这样的可逆性是具有代价的——A、B的数据维度必须是一致的。

        A、B分布间的转换并不是轻易能做到的,流模型为实现这一点经历了三个步骤:最初的NICE实现了从A分布到高斯分布的可逆求解;后来RealNVP实现了从A分布到条件非高斯分布的可逆求解;而最新的GLOW,实现了从A分布到B分布的可逆求解,其中B分布可以是与A分布同样复杂的分布。

二、建模思想

        给定两组数据z和x,其中z服从已知的简单先验分布π(z)(通常是高斯分布),x服从复杂的分布p(x)(即训练数据代表的分布),现在我们想要找到一个变换函数f,它能建立一种z到x的映射f。

        如果这个变换函数能找到的话,那么我们就实现了一个生成模型的构造。因为现在如果我们想要有新的生成,只需要从π(z)中随机采样一个点,然后通过映射f,就可以得到新的样本点x。

三、数学基础

3.1

 

        假设x、z满足简单的均匀分布,那么构建z与x之间的变换关系只需要构造一个线性函数即可:x=f(z)=2z+1。

3.2 下面再考虑非均匀分布的更复杂的情况:

        我们可以考虑在很短的间隔上将二者视为简单均匀分布,然后应用前边方法计算小段上的,最后将每个小段变换累加起来(每个小段实际对应一个采样样本)就得到最终的完整变换式f。 

 

(相同的面积可以确保它们处理了对应信息量的任务)

又考虑到dz/dx有可能是负值(如下图所示),而p(x’)Π(z’)都为非负,所以p(x’)、Π(z’)的实际关系为p(x’)=Π(z’)|dz/dx|。

3.3

 

 

 

3.4 (注意:这个地方将上文中的f换成G,其实只是一个符号,本质是一样的)

 

G*是我们要求的。

 

四、如何求解3.4中的G*

4.1 要求解G*,就是要计算

 

有着一些困难

 不好计算,因为的 Jacobian矩阵一般维度不低(譬如256*256矩阵),其行列式的计算量是异常巨大的,所以在实际计算中,我们必须对的Jacobian行列式做一定优化,使其能够在计算上变得简洁高效。

②需要巧妙地设计G的结构使得也是好计算的

4.2 逐步设计的结构

 

       要求:G的输入和输出的维度必须是一致的并且G的行列式不能为0。

       从上面的表达式中我们可以看出其只和有关,所以在实际训练中我们可以训练对应的网络,然后想办法算出G来并且在真实运行的时候改用G做图像生成。

 

 

 

4.2.1

 

这样设计的耦合层能快速计算出,其在G的Jacobian行列式的计算上也是非常简便。注:就是在学习β、γ

 

4.2.2

        上述措施对G做了诸多限制,导致G的变换能力有限,所以我们可以堆叠多个G,去增强模型的变换拟合能力。

        多个耦合层堆叠在一起,从而形成一个更完整的生成器。但是这样会有一个新问题,就是最终生成数据的前d维与初始数据的前d维是一致的,这会导致生成数据中总有一片区域看起来像是固定的图样(实际上它代表着来自初始高斯噪音的一个部分)

4.2.3

        我们可以通过将复制模块(copy)与仿射模块(affine)交换顺序的方式去解决4.2.2一问题。

       如上图所示,通过将某些耦合层的copy与affine模块进行位置上的互换,使得每一部分数据都能走向copy->affine->copy->affine的交替变换通道,这样最终的生成图像就不会包含完全copy自初始图像的部分。值得说明的是,在图像生成当中,这种copy与affine模块互换的方式有很多种。

4.2.4

       W矩阵,帮我们决定按什么样的顺序做copy和affine变换,这种方法叫做1×1 convolution。1×1 convolution只需要让机器决定在每次仿射计算前对图片哪些区域实行像素对调,而保持copy和affine模块的顺序不变,这实际上和对调copy和affine模块顺序产生的效果是一致的。其中W矩阵是可以由机器来学习的。引入1×1 convolution后的G的Jacobian行列式计算依然非常简单。

 

 

 

 

 

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 CAN 通信管理 Stateflow 模型示例,用于控制单个 CAN 节点的发送和接收行为。 首先,在 Simulink 中创建一个新模型,并添加 Stateflow 模块。然后,在 Stateflow 中创建两个状态:发送和接收。 在发送状态中,我们将定义要发送的数据,并将其转换为 CAN 帧格式。然后,我们使用 CAN 工具箱将 CAN 帧发送到 CAN 总线上。在接收状态中,我们将从 CAN 总线上接收 CAN 帧,并对数据进行解析和处理。 我们为每个状态添加相应的动作和条件。在发送状态中,我们将定义要发送的数据,并将其转换为 CAN 帧格式。在接收状态中,我们将从 CAN 总线上接收 CAN 帧,并对数据进行解析和处理。 在状态之间进行转换时,我们需要考虑网络管理方面的问题。例如,我们需要处理错误和冲突,并根据网络状态调整发送和接收行为。我们可以使用状态机中的转移和条件来实现这个功能。 以下是一些示例状态和转移: - 发送状态 - 动作:定义要发送的数据并将其转换为 CAN 帧格式 - 转移:如果 CAN 总线忙碌,则等待 - 接收状态 - 动作:从 CAN 总线接收 CAN 帧,并对数据进行解析和处理 - 转移:如果发生错误,则转换到错误状态 在最后,我们需要进行仿真和测试,以确保模型的正确性和可靠性。我们可以使用 Simulink 中的仿真工具来进行仿真和测试,并对模型进行优化和调试。 需要注意的是,这只是一个简单的示例,实际上 CAN 通信管理 Stateflow 模型可能会更加复杂。如果您要建立更复杂的模型,建议您先学习相关知识或咨询专业人士的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值