Glow: Generative Flow with Invertible 1×1 Convolutions论文解析及实现(二)

news/2024/4/25 20:57:57/文章来源:https://blog.csdn.net/weixin_42529756/article/details/131993407

Glow: Generative Flow with Invertible 1×1 Convolutions
代码github: https://github.com/rosinality/glow-pytorch添加链接描述

1 模型架构如下

1.1 左边图flow模型

Flow model
① ActNorm
② InvConv2dLU
③ AffineCoupling

1.2 右边模型结构Glow模型

Glow Model
Block (L-1)个
Flow K

在这里插入图片描述
在这里插入图片描述

2 Flow层

在这里插入图片描述

2.1 ActNorm

在这里插入图片描述

1)ActNorm 就是一个线性函数:

		# y=a*x +b self.loc = nn.Parameter(torch.zeros(1, in_channel, 1, 1))   # bself.scale = nn.Parameter(torch.ones(1, in_channel, 1, 1))  #  a 

2) 参数初始化:
取第一批数据,计算均值方差,初始化 a 和b

 flatten = input.permute(1, 0, 2, 3).contiguous().view(input.shape[1], -1)mean = ( flatten.mean(1) .unsqueeze(1) .unsqueeze(2).unsqueeze(3).permute(1, 0, 2, 3)  )std = ( flatten.std(1)  .unsqueeze(1) .unsqueeze(2) .unsqueeze(3).permute(1, 0, 2, 3))self.loc.data.copy_(-mean)self.scale.data.copy_(1 / (std + 1e-6))

3)log deteminant

log_abs = logabs(self.scale)logdet = height * width * torch.sum(log_abs)
  1. 反函数
 output / self.scale - self.loc

2.2 Invertible 1*1 convolution

在这里插入图片描述

2.2.1使用LU 分解计算行列式

1)权重计算

        weight = (self.w_p@ (self.w_l * self.l_mask + self.l_eye)@ ((self.w_u * self.u_mask) + torch.diag(self.s_sign * torch.exp(self.w_s))))

在这里插入图片描述

2)前向计算

  out = F.conv2d(input, weight)

3) 行列式计算

logdet = height * width * torch.sum(self.w_s)

在这里插入图片描述
4)反函数计算

 F.conv2d(output, weight.squeeze().inverse().unsqueeze(2).unsqueeze(3))

2.2.2 行列式直接计算方法

在这里插入图片描述

2.3 AffineCoupling

1)网络结构

        self.net = nn.Sequential(nn.Conv2d(in_channel // 2, filter_size, 3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(filter_size, filter_size, 1),nn.ReLU(inplace=True),ZeroConv2d(filter_size, in_channel if self.affine else in_channel // 2),)

2)前向公式

in_a, in_b = input.chunk(2, 1)
log_s, t = self.net(in_a).chunk(2, 1)
# s = torch.exp(log_s)
s = F.sigmoid(log_s + 2)
# out_a = s * in_a + t
out_b = (in_b + t) * storch.cat([in_a, out_b], 1)

3)log 行列式

 logdet = torch.sum(torch.log(s).view(input.shape[0], -1), 1)

3)反函数

out_a, out_b = output.chunk(2, 1)log_s, t = self.net(out_a).chunk(2, 1)
# s = torch.exp(log_s)
s = F.sigmoid(log_s + 2)
# in_a = (out_a - t) / s
in_b = out_b / s - ttorch.cat([out_a, in_b], 1)

在这里插入图片描述

2.4 Flow 模型

1)前向计算及log行列式

out, logdet = self.actnorm(input)
out, det1 = self.invconv(out)
out, det2 = self.coupling(out)
logdet = logdet + det1+det2

2)反函数

        input = self.coupling.reverse(output)input = self.invconv.reverse(input)input = self.actnorm.reverse(input)

3 Glow 层

在这里插入图片描述

Flow * k
Block * (L-s)

3.1 Block

3.1.1 squeeze

        squeezed = input.view(b_size, n_channel, height // 2, 2, width // 2, 2)squeezed = squeezed.permute(0, 1, 3, 5, 2, 4)out = squeezed.contiguous().view(b_size, n_channel * 4, height // 2, width // 2)

3.1.2 step of flow

        for i in range(n_flow):self.flows.append(Flow(squeeze_dim, affine=affine, conv_lu=conv_lu))

3.1.3 split

            out, z_new = out.chunk(2, 1)mean, log_sd = self.prior(out).chunk(2, 1)log_p = gaussian_log_p(z_new, mean, log_sd)log_p = log_p.view(b_size, -1).sum(1)

3.1.4block 层

1)反函数

   input = outputif reconstruct:if self.split:input = torch.cat([output, eps], 1)else:input = epselse:if self.split:mean, log_sd = self.prior(input).chunk(2, 1)z = gaussian_sample(eps, mean, log_sd)input = torch.cat([output, z], 1)else:zero = torch.zeros_like(input)# zero = F.pad(zero, [1, 1, 1, 1], value=1)mean, log_sd = self.prior(zero).chunk(2, 1)z = gaussian_sample(eps, mean, log_sd)input = zfor flow in self.flows[::-1]:input = flow.reverse(input)b_size, n_channel, height, width = input.shapeunsqueezed = input.view(b_size, n_channel // 4, 2, 2, height, width)unsqueezed = unsqueezed.permute(0, 1, 4, 2, 5, 3)unsqueezed = unsqueezed.contiguous().view(b_size, n_channel // 4, height * 2, width * 2)return unsqueezed

3.2 Glow层

1)前向计算

     self.blocks = nn.ModuleList()n_channel = in_channelfor i in range(n_block - 1):self.blocks.append(Block(n_channel, n_flow, affine=affine, conv_lu=conv_lu))n_channel *= 2self.blocks.append(Block(n_channel, n_flow, split=False, affine=affine))

2)反函数

        for i, block in enumerate(self.blocks[::-1]):if i == 0:input = block.reverse(z_list[-1], z_list[-1], reconstruct=reconstruct)else:input = block.reverse(input, z_list[-(i + 1)], reconstruct=reconstruct)return input

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

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

相关文章

万年历【小游戏】(Java课设)

系统类型 Java实现的小游戏 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Idea或eclipse 运行效果 更多Java课设系统源码地址:更多Java课设系统源码地址 更多Java小游戏运行效果展示:更多Java小游戏运行效果展…

解决Font family [‘sans-serif’] not found问题

序言 以下测试环境都是在 anaconda3 虚拟环境下执行。 激活虚拟环境 conda activate test_python_env 或 source activate test_python_env工具: WinSCP Visual Studio Code 这里笔者使用 WinSCP 工具连接,编辑工具是 Visual Studio Code 一、字体…

mysql(六)读写分离

目录 前言 一、概述 二、配置JAVA环境及安装阿米巴 三、配置阿米巴 四、测试 总结 前言 MySQL读写分离是一种常见的数据库架构设计模式,旨在提高系统的性能和可用性。它通过将读操作和写操作分离到不同的MySQL实例上来实现。 读写分离的原理是: 1. 主…

UE5.1.1 创建C++项目失败

因一直使用Unity开发环境,安装Unreal后,并未详细配置过其开发环境,默认创建蓝图工程无异常,但创建UE C项目时总共遇到两个错误: 错误一 Running /Epic/UE/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -…

郑州主域名和多个子域名的泛域名https证书

随着网络的发展,一个站长往往会创建多个域名网站,为了与主站有联系,站长会选择主站域名的二级域名来创建网站,比如主站是www .***. com,那么新创建的网站的域名就是top .***. com、vip .***. com等。 1.在安装部署htt…

原生求生记:揭秘UniApp的原生能力限制

文章目录 1. 样式适配问题2. 性能问题3. 原生能力限制4. 插件兼容性问题5. 第三方组件库兼容性问题6. 全局变量污染7. 调试和定位问题8. 版本兼容性问题9. 前端生态限制10. 文档和支持附录:「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

网络安全/信息安全(黑客技术)自学笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化 不知道上一讲的大段代码大家看晕了没有。但是如果你仔细看了会发现,其实代码还是不全的。比如分词器我们就没讲。 另外,13B比7B的改进点也没有讲。 再有,对于13B需要多少显存我们…

记录每日LeetCode 141.环形链表 Java实现

题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链…

【RTT驱动框架分析00】-应用层函数调用流程-串口为例

应用层函数调用流程分析以-串口为例 1. rt_device_find调用流程 RTT内部有一个全局变量数组rt_object_container数组的数量就是 rt_object_info_type 内核对象的种类,其中包含一个RT_USING_DEVICE (设备的数据类型),数组内部的每一个变量包含一个链表&…

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C\C++内存管理

目录 1.C/C内存分布2.C语言中动态内存管理方式3.C中动态内存管理3.1new/delete内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数4.2重载operator new与operator delete(了解) 5.new和delete的实现原理5.1内置类型5.2 自定义类…

【动态规划part12】| 309.买卖股票的最佳时机含冷冻期、714.买卖股票的最佳时机含手续费

目录 🎈LeetCode309.最佳买卖股票时机含冷冻期 🎈LeetCode714.买卖股票的最佳时机含手续费 🎈LeetCode309.最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计…

【计算机视觉中的 GAN 】如何稳定GAN训练(3)

一、说明 在上一篇文章中,我们达到了理解未配对图像到图像翻译的地步。尽管如此,在实现自己的超酷深度GAN模型之前,您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入:Wasserstein distance,boundary eq…

element时间选择器的默认值

概览:vue使用element组件,需要给时间选择器设置默认值,场景一:默认时间选择器,场景二:时间范围选择器,开始时间和结束时间。 一、默认时间选择器 实现思路: element组件的v-model绑…

DevOps-Jenkins

Jenkins Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 官网 应用场景 场景一 研发人员上传开发好的代码到github代码仓库需要将代码下载nginx服务器部署手动下载再…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1:限于研究水平,分析难免不当,欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵,若的特征值为,则称为矩阵的奇异值。 0.2 SVD(分解)定理 设,则…

Open3D-ML自动驾驶点云目标检测与分割入门

当开始新的研究时,我的方法通常是测试不同的相关事物,直到有足够的经验让我开始将这些点联系起来。 在开始构建用于 3D 对象检测的自定义模型之前,我购买了一台 LiDAR 并处理了一些数据。 下一个明显的步骤是在我为自己的数据贴标签之前找出研…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器,属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos,ribbon还没有被替换。 使用: 在配置类中:LoadBalanced BeanLoadBalancedpublic RestTemplate restT…