前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Normalizing Flow 理解与实现

Normalizing Flow 理解与实现

作者头像
为为为什么
发布于 2023-05-24 06:25:52
发布于 2023-05-24 06:25:52
61400
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:0
代码可运行

前文介绍了 标准化流 ,本文做简单尝试加深理解。

标准化流

Flow 通过多层可逆映射的精巧变换实现分布之间的转换,通过这种方式拟合复杂的分布;

有些和多层的卷积拟合复杂函数相似的感觉,只是处理的是分布转换。

标准化是因为转换过程必须万分小心,每一步 Flow 的输入输出均为分布,即需要满足和为1 的约束,体积不变,我是这么理解的。

实现流程

原始项目:https://github.com/abdulfatir/normalizing-flows

从中摘出了一个简单示例。

引入 normflows 包

安装包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install normflowsv

引入包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import numpy as np
import normflows as nf

初始分布

用生成器表示,采样得到点位置和该点概率密度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
q0 = nf.distributions.DiagGaussian(2)

展示

由于是生成器,只能随机生成点,因此生成很多很多点,统计直方图作为初始分布示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Plot initial flow distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()

目标分布

目标分布为评估器,给定点,输出该点的概率密度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target = nf.distributions.TwoModes(2, 0.1)

展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Plot target distribution
grid_size = 200
xx, yy = torch.meshgrid(torch.linspace(-3, 3, grid_size), torch.linspace(-3, 3, grid_size))
z = torch.cat([xx.unsqueeze(2), yy.unsqueeze(2)], 2).view(-1, 2)
log_prob = target.log_prob(z.to(device)).to('cpu').view(*xx.shape)
prob = torch.exp(log_prob)

plt.figure(figsize=(10, 10))
plt.pcolormesh(xx, yy, prob)
plt.show()

Flows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
K = 16
flows = []
for i in range(K):
    flows += [nf.flows.Planar((2,))]

创建最简单的 Planar 流,

模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nfm = nf.NormalizingFlow(q0=q0, flows=flows, p=target)

训练
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Train model
max_iter = 20000
num_samples = 2 * 20
anneal_iter = 10000
annealing = True
show_iter = 200


loss_hist = np.array([])

optimizer = torch.optim.Adam(nfm.parameters(), lr=1e-3, weight_decay=1e-4)
for it in tqdm(range(max_iter)):
    optimizer.zero_grad()
    if annealing:
        loss = nfm.reverse_kld(num_samples, beta=np.min([1., 0.01 + it / anneal_iter]))
    else:
        loss = nfm.reverse_kld(num_samples)
    loss.backward()
    optimizer.step()
    
    loss_hist = np.append(loss_hist, loss.to('cpu').data.numpy())
    

整体代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import required packages
import torch
import numpy as np
import normflows as nf
import mtutils as mt
from matplotlib import pyplot as plt
from tqdm import tqdm


K = 16
#torch.manual_seed(0)

# Move model on GPU if available
enable_cuda = True
device = torch.device('cuda' if torch.cuda.is_available() and enable_cuda else 'cpu')

flows = []
for i in range(K):
    flows += [nf.flows.Planar((2,))]
target = nf.distributions.TwoModes(2, 0.1)

## 初始分布
q0 = nf.distributions.DiagGaussian(2)
nfm = nf.NormalizingFlow(q0=q0, flows=flows, p=target)
nfm.to(device)



# Plot target distribution
grid_size = 200
xx, yy = torch.meshgrid(torch.linspace(-3, 3, grid_size), torch.linspace(-3, 3, grid_size))
z = torch.cat([xx.unsqueeze(2), yy.unsqueeze(2)], 2).view(-1, 2)
log_prob = target.log_prob(z.to(device)).to('cpu').view(*xx.shape)
prob = torch.exp(log_prob)

plt.figure(figsize=(10, 10))
plt.pcolormesh(xx, yy, prob)
plt.show()

# Plot initial flow distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()



# Train model
max_iter = 20000
num_samples = 2 * 20
anneal_iter = 10000
annealing = True
show_iter = 200


loss_hist = np.array([])

optimizer = torch.optim.Adam(nfm.parameters(), lr=1e-3, weight_decay=1e-4)
for it in tqdm(range(max_iter)):
    optimizer.zero_grad()
    if annealing:
        loss = nfm.reverse_kld(num_samples, beta=np.min([1., 0.01 + it / anneal_iter]))
    else:
        loss = nfm.reverse_kld(num_samples)
    loss.backward()
    optimizer.step()
    
    loss_hist = np.append(loss_hist, loss.to('cpu').data.numpy())
    
    # Plot learned distribution
    if (it + 1) % show_iter == 0:
        torch.cuda.manual_seed(0)
        z, _ = nfm.sample(num_samples=2 ** 20)
        z_np = z.to('cpu').data.numpy()
        
        plt.figure(1, figsize=(10, 10))
        plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
        # plt.pause(0.1)
        image = mt.convert_plt_to_rgb_image(plt)
        mt.cv_rgb_imwrite(image, f"res/{it}.jpg")


# plt.figure(figsize=(10, 10))
# plt.plot(loss_hist, label='loss')
# plt.legend()
# plt.show()

# Plot learned distribution
z, _ = nfm.sample(num_samples=2 ** 20)
z_np = z.to('cpu').data.numpy()
plt.figure(figsize=(10, 10))
plt.hist2d(z_np[:, 0].flatten(), z_np[:, 1].flatten(), (grid_size, grid_size), range=[[-3, 3], [-3, 3]])
plt.show()

实现效果

200 iter / frame

参考资料

文章链接: https://cloud.tencent.com/developer/article/2291036

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年5月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
机器学习 pipeline 可视化
作为任何数据科学项目的一部分,数据可视化在理解更多可用数据和识别任何主要模式方面发挥着重要作用。
McGL
2020/10/30
1.2K0
机器学习 pipeline 可视化
BN层代码实现_无代码
src文件夹存储了带有BN的FC训练文件、基于初始化的带BN的FC训练文件以及BN在训练阶段的操作。 tools存储了通用数据集:生成虚拟数据集和FC模型。
全栈程序员站长
2022/11/04
1.3K0
生成对抗网络(GAN)简介
GAN 由 Ian Goodfellow 在2014年提出。GAN通过训练两个相互对抗的神经网络解决了非监督学习问题,其中一个是生成(Generator)网络,另一个叫判别(discriminator)网络。
用户6021899
2022/06/07
2.1K0
生成对抗网络(GAN)简介
TensorFlow_Probability实现Normalizing flows实例
标准化流(Normalizing Flows)是算法工具包中的一种便捷技术,它将简单的密度(如高斯分布)转换为丰富的复杂分布,可用于生成模型,RL和变分推断。 TensorFlow具有一组不错的功能,可轻松构建流程并对其进行训练以适应实际数据。
flavorfan
2021/03/14
1.8K0
TensorFlow_Probability实现Normalizing flows实例
基于LSTM的比特币价格预测模型(系列1)
设计并训练由输入/训练数据(比特币价格时间序列/60min)驱动的LSTM,预测一小时内的比特币价格,从而在整个测试数据样本中实现真实价格和预测价格之间的最小均方根误差(RMSE)。
量化投资与机器学习微信公众号
2020/04/13
4.1K0
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。值国庆佳节,专知特别推出独家特刊-来自中科院自动化所专知小组博士生huaiwen和Jin创作的-PyTorch教程学习系列。 <
WZEARW
2018/04/08
2.2K0
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型
当阅读一篇课文时,我们可以根据前面的单词来理解每个单词的,而不是从零开始理解每个单词。这可以称为记忆。卷积神经网络模型(CNN)不能实现这种记忆,因此引入了递归神经网络模型(RNN)来解决这一问题。RNN是带有循环的网络,允许信息持久存在。
润森
2022/08/18
6290
【小白学习PyTorch教程】九、基于Pytorch训练第一个RNN模型
深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略
在深度学习领域,循环神经网络(RNN)在处理序列数据方面具有独特的优势,例如语音识别、自然语言处理等任务。然而,传统的 RNN 在处理长序列数据时面临着严重的梯度消失问题,这使得网络难以学习到长距离的依赖关系。LSTM 作为一种特殊的 RNN 架构应运而生,有效地解决了这一难题,成为了序列建模领域的重要工具。
Undoom
2025/05/22
6830
深度学习之序列建模的核心技术:LSTM架构深度解析与优化策略
人工智能创新挑战赛:助力精准气象和海洋预测Baseline2:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
数据分析是解决一个数据挖掘任务的重要一环,通过数据分析,我们可以了解标签的分布、数据中存在的缺失值和异常值、特征与标签之间的相关性、特征之间的相关性等,并根据数据分析的结果,指导我们后续的特征工程以及模型的选择和设计。
汀丶人工智能
2023/06/06
1.8K0
人工智能创新挑战赛:助力精准气象和海洋预测Baseline2:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
生成对抗网络(GAN)系列:WGAN与金融时序(附代码)
过拟合是我们试图将机器学习技术应用于时间序列时遇到的问题之一。出现这个问题是因为我们使用我们所知道的唯一时间序列路径来训练我们的模型:已实现的历史。
量化投资与机器学习微信公众号
2020/06/29
4.3K1
生成对抗网络(GAN)系列:WGAN与金融时序(附代码)
【小白学习PyTorch教程】十一、基于MNIST数据集训练第一个生成性对抗网络
GAN 是使用两个神经网络模型训练的生成模型。一种模型称为生成网络模型,它学习生成新的似是而非的样本。另一个模型被称为判别网络,它学习区分生成的例子和真实的例子。
润森
2022/08/18
4890
【小白学习PyTorch教程】十一、基于MNIST数据集训练第一个生成性对抗网络
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
In 2014, Goodfellow et al. presented a method for training generative models called Generative Adversarial Networks (GANs for short). In a GAN, we build two different neural networks. Our first network is a traditional classification network, called the discriminator. We will train the discriminator to take images, and classify them as being real (belonging to the training set) or fake (not present in the training set). Our other network, called the generator, will take random noise as input and transform it using a neural network to produce images. The goal of the generator is to fool the discriminator into thinking the images it produced are real. 在生成网络中,我们建立了两个神经网络。第一个网络是典型的分类神经网络,称为discriminator重点内容,我们训练这个网络对图像进行识别,以区别真假的图像(真的图片在训练集当中,而假的则不在。另一个网络称之为generator,它将随机的噪声作为输入,将其转化为使用神经网络训练出来产生出来的图像,它的目的是混淆discriminator使其认为它生成的图像是真的。
老潘
2018/06/21
2.5K0
利用pytorch实现GAN(生成对抗网络)-MNIST图像-cs231n-assignment3
从零开始实现VAE和CVAE
来源:DeepHub IMBA 本文约4200字,建议阅读8分钟 本文将用python从头开始实现VAE和CVAE,来增加对于它们的理解。 扩散模型可以看作是一个层次很深的VAE(变分自编码器),
数据派THU
2023/05/11
5340
从零开始实现VAE和CVAE
直方图与核密度估计
直方图是一种经常被用于统计的图形表达形式,简单来说它的功能就是用一系列的样本数据,去分析样本的分布规律。而直方图跟核密度估计(Kernel Density Estimation,KDE)方法的主要差别在于,直方图得到的是一个离散化的统计分布,而KDE方法得到的是一个连续的概率分布函数。如果将得到的分布重新用于采样,两者都可以结合蒙特卡洛方法实现这样的功能,但是KDE的优点在于它得到的结果是可微分的,那么就可以应用于有偏估计的分子动力学模拟中,如元动力学(Meta Dynamics)方法。这里主要用Python实现一个简单的KDE函数的功能,也顺带介绍一下Numpy和Matplotlib中关于直方图的使用方法。
DechinPhy
2024/04/18
2810
直方图与核密度估计
使用pytorch实现高斯混合模型分类器
本文是一个利用Pytorch构建高斯混合模型分类器的尝试。我们将从头开始构建高斯混合模型(GMM)。这样可以对高斯混合模型有一个最基本的理解,本文不会涉及数学,因为我们在以前的文章中进行过很详细的介绍。
deephub
2023/10/23
5100
使用pytorch实现高斯混合模型分类器
[机器学习从零到壹sklearn]·0.1.1·线性拟合
[机器学习从零到壹sklearn]·0.1.1·线性拟合 code: import matplotlib.pyplot as plt import numpy as np import pandas as pd # 引入包 from sklearn.linear_model.stochastic_gradient import SGDRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection
小宋是呢
2019/06/27
5560
[机器学习从零到壹sklearn]·0.1.1·线性拟合
siamfC
大家好,又见面了,我是你们的朋友全栈君。 SiamFC 特征提取网络 孪生网络讲解 SiamFC孪生网络细解 单目标跟踪 https://zhuanlan.zhihu.com/p
全栈程序员站长
2022/11/10
3200
siamfC
TCGA官方数据挖掘文章教你机器学习or深度学习
最近我们又组织了:《机器学习加深度学习资料大放送(附上资料群)》交流群,感觉吧,大家松鼠症发作收集整理了大把资料最后却束之高阁,也不是一个事啊。所以就安排学徒系统性讲解一下机器学习的应用。本次教程参考TCGA 官方的一篇文章Machine Learning Detects Pan-cancer Ras Pathway Activation in The Cancer Genome Atlas文章,文章的源码也可以在官方的 github 上搜到:
生信技能树
2020/10/26
1.7K0
TCGA官方数据挖掘文章教你机器学习or深度学习
深度学习第5天:GAN生成对抗网络
我们知道GAN的全名是生成对抗网络,那么它就是以生成为主要任务,所以可以用在这些方面
Nowl
2024/01/18
1740
深度学习第5天:GAN生成对抗网络
【动手学深度学习笔记】之线性回归实现
这一节不牵扯深度学习框架,仅使用Tensor和autograd库来训练线性回归模型。
树枝990
2020/08/20
7070
推荐阅读
相关推荐
机器学习 pipeline 可视化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验