Diffusion添加噪声noise的方式有哪些?怎么向图像中添加噪声?

添加噪声的方式大致分为两种,一种是每张图像在任意timestep都加入一样的均匀噪声,另一种是按照timestep添加不同程度的噪声

一、在任意timestep都加入一样的noise

batch_size = 32x_start = torch.rand(batch_size,3,256,256)
noise = torch.randn_like(x_start)
x_noisy = x_start + noiseprint(x_noisy)

二、按照timestep添加不同程度的noise

插入的方式有很多:(linear、cosine、sqrt_linear、sqrt),不论哪种方式插入noise,都是按照以下的公式进行的噪声插入,只不过是β在每个timestep的值不一样,从而造成不同timestep有不同程度的噪声

这里的x0可以是不同的东西,加入噪声可以有多种应用,例如最常见的输入图像(bz, 3, 256, 256)【经典的diffusion论文】、输入图像经过pretrain encoder后的表征(bz, 512, 1, 1)【RCG论文】...

1、最简单的写法(linear)

通过线性的方式(torch.linspace)插入noise

import torch## ----------------------------- 确定超参数的值 ----------------------------- ##
num_steps = 100# 制定每一步的beta
betas = torch.linspace(-6, 6, num_steps)
betas = torch.sigmoid(betas) * (0.5e-2 - 1e-5) + 1e-5
alphas = 1 - betas
alphas_prod = torch.cumprod(alphas, 0)# 定义调整noise的常量
alphas_bar_sqrt = torch.sqrt(alphas_prod)
one_minus_alphas_bar_sqrt = torch.sqrt(1 - alphas_prod)

## ----------------------------- 确定扩散前向过程任意时刻的采样值 x[t]: x[0] + t --> x[t] ----------------------------- ##
def q_x(x_0, t):"""x[0] + t --> x[t]:param x_0:初始数据:param t:任意时刻"""noise = torch.randn_like(x_0)# 取出在某个时刻t所对应的alphas_t、alphas_1_m_t的值alphas_t = alphas_bar_sqrt[t]alphas_1_m_t = one_minus_alphas_bar_sqrt[t]x_t = alphas_t * x_0 + alphas_1_m_t * noisereturn x_tbatch_size = 32
x_start = torch.rand(batch_size,3,256,256)
# 给x_start加上在timestep 65 的时候噪声
x_noisy = q_x(x_start, 65)

一文弄懂 Diffusion Model(DDPM)+ 代码实现-CSDN博客

 

2、可选不同的β策略

不同的β策略

import torch
from inspect import isfunction
from functools import partial
import numpy as npto_torch = partial(torch.tensor, dtype=torch.float32)
def make_beta_schedule(schedule, n_timestep, linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3):"""设置β的调度值"""if schedule == "linear":betas = (torch.linspace(linear_start ** 0.5, linear_end ** 0.5, n_timestep, dtype=torch.float64) ** 2)elif schedule == "cosine":timesteps = (torch.arange(n_timestep + 1, dtype=torch.float64) / n_timestep + cosine_s)alphas = timesteps / (1 + cosine_s) * np.pi / 2alphas = torch.cos(alphas).pow(2)alphas = alphas / alphas[0]betas = 1 - alphas[1:] / alphas[:-1]betas = np.clip(betas, a_min=0, a_max=0.999)elif schedule == "sqrt_linear":betas = torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64)elif schedule == "sqrt":betas = torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64) ** 0.5else:raise ValueError(f"schedule '{schedule}' unknown.")return betas.numpy()

定义超参数 

betas = make_beta_schedule(schedule="linear", n_timestep=1000, linear_start=0.0015, linear_end=0.0195, cosine_s=0.008)alphas = 1. - betas
alphas_cumprod = np.cumprod(alphas, axis=0)
alphas_cumprod = to_torch(alphas_cumprod)
sqrt_alphas_cumprod = to_torch(np.sqrt(alphas_cumprod))
sqrt_one_minus_alphas_cumprod = to_torch(np.sqrt(1. - alphas_cumprod))batch_size = 32
# x_start = torch.rand(batch_size,512,1,1)
x_start = torch.rand(batch_size,3,256,256)
noise = torch.randn_like(x_start)
t = torch.randint(0, 1000, (batch_size,)).long()def exists(x):return x is not Nonedef default(val, d):if exists(val):return valreturn d() if isfunction(d) else ddef extract_into_tensor(a, t, x_shape):b, *_ = t.shapeout = a.gather(-1, t)return out.reshape(b, *((1,) * (len(x_shape) - 1)))def q_sample(x_start, t, noise=None):noise = default(noise, lambda: torch.randn_like(x_start))return (extract_into_tensor(sqrt_alphas_cumprod, t, x_start.shape) * x_start +extract_into_tensor(sqrt_one_minus_alphas_cumprod, t, x_start.shape) * noise)x_noisy = q_sample(x_start=x_start, t=t, noise=noise)

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

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

相关文章

css的各种样式

一,css的样式选择器 1.1 字体相关 font font-fanmily 字体的样式默认为黑体font-size 字体大小font-style 字体风格 斜体font-width 字体的宽度 默认为400 1.2 文本相关 text-transform capitalize 首字母大写lowercase 全部小写uppercase 全部大写 text-alig…

.NET DES加密算法实现

简介: DES(Data Encryption Standard)加密算法作为一种历史悠久的对称加密算法,自1972年由美国国家标准局(NBS)发布以来,广泛应用于各种数据安全场景。本文将从算法原理、优缺点及替代方案等方…

XUbuntu22.04之激活Linux最新Typora版本(二百二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

技巧 Win10电脑打开SMB协议共享文件,手机端查看

一. 打开 SMB1.0/CIFS文件共享支持 ⏹如下图所示,打开SMB1.0/CIFS文件共享支持 二. 开启网络发现 ⏹开启网络发现,确保共享的文件能在局域网内被发现 三. 共享文件夹到局域网 ⏹根据需要勾选需要共享的文件夹,共享到局域网 四. 共享文件查…

Linux重点思考(下)--shell脚本使用以及内核开发

Linux重点思考(下)--shell脚本使用和组合拳 shell脚本的基础算法shell脚本写123...n的值,说思路Shell 脚本用于执行服务器性能测试的死循环Shell 脚本备份和定时清理垃圾文件 shell脚本的内核开发正向映射反向映射 shell脚本的基础算法 shell脚本写123……

单点登录原理与实现方案探究(二)

本系列文章简介: 本系列文章将深入探究Java中的单点登录原理与实现方案。首先,我们将介绍单点登录的基本原理,探讨其在多应用环境下的工作流程。然后,我们将详细讨论目前流行的三种单点登录实现方案我们将分析每种实现方案的优缺点…

WARNING: No output specified with docker-container driver

这个警告信息是说 docker build 出现的,指出你没有指定任何输出目的地,因此构建后的镜像不会被持久保存,只会存留在构建缓存中。以至于后面 docker tag 命令会找不到镜像,从而导致build 和push流程失败. 两种解决的做法&#xff…

JDBC远程连接mysql报错:NotBefore: Sat Mar 30 16:37:41 UTC 2024

虚拟机docker已经部署了mysql,用navicat可以直接远程连接,datagrip却不能,如图: 需要在最后加上 ?useSSLfalse , 如:jdbc:mysql://192.168.30.128:3306?useSSLfalse navicat不用加的原因是没有使用jdbc连接&#x…

java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 广度优先双分裂蛇 广度优先双分裂蛇 双分裂蛇:是求二…

Linux 学习之路--工具篇--yum

前面介绍了权限有关的内容&#xff0c;这里继续介绍有关Linux里面常用的工具之一yum 目录 一、简单介绍 <1> 源代码安装 <2>rpm 包安装 <3>yum / apt-get(ubuntu) 安装 二、简单使用 <1>安装包介绍 <2> yum 的基本指令 -- install <…

C++:数据类型—布尔(12)

布尔类型代表就是真和假&#xff08;bool&#xff09; 真就是1&#xff08;true&#xff09; 假就是0&#xff08;false&#xff09; 也可以任务非0即为真 bool 直占用1个字节大小 语法&#xff1a;bool 变量名 (true | false&#xff09; 提示&#xff1a;bool在后期判断也是…

2024年150道高频Java面试题(十)

19. 解释一下 Java 中的封装、继承和多态。 封装、继承和多态是面向对象编程&#xff08;OOP&#xff09;的三个核心概念&#xff0c;在Java中得到了广泛应用。 封装&#xff1a; 概念&#xff1a;封装是指隐藏一个对象的内部细节&#xff0c;仅对外暴露需要公开的部分。这可以…

Capture One Pro 23中文---颠覆性的图像编辑与色彩配置

Capture One Pro 23是一款功能强大且专业的RAW图像编辑处理软件。它拥有全球领先的色彩管理技术和精细的图像编辑工具&#xff0c;可以对图片进行多种精细调整&#xff0c;包括曝光、色温、对比度、锐度等&#xff0c;以满足用户特定的后期处理需求。此外&#xff0c;Capture O…

第二百三十一回

文章目录 1. 概念介绍2. 符号和平台2.1 符号2.2 平台 3. 问题与解决3.1 常见问题3.2 解决方法 4.内容总结 我们在上一章回中介绍了"关于intl报错的问题"相关的内容&#xff0c;本章回中将介绍不同平台上换行的问题.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1…

Excel函数-总

目录 1.概述 2.数组公式 2.1.数组的类别 2.2.数组的构成元素 2.3.数组运算时需要用到的运算符 3.数学与三角函数 3.1.RANDBETWEEN 3.2.ABS 3.3.MOD 3.4.PI ​​​​​​​3.5.PRODUCT ​​​​​​​3.6.RADIANS ​​​​​​​3.7.DEGREES ​​​​​​​3.8.POWER ​​​​​…

FastAPI+React全栈开发17 让我们创建一个React应用

Chapter04 Setting Up a React Workflow 17 Let’s Create a React App FastAPIReact全栈开发17 让我们创建一个React应用 As I mentioned earlier, create-react-app takes away much of the heavy work when starting a project, and we will be using it throughout this…

Python中对象的创建于使用

创建对象 在Python中&#xff0c;创建对象是通过实例化类来完成的。一个类是一个包含属性和方法的蓝图&#xff0c;它定义了一种对象的行为和特征。我们可以使用class关键字来定义一个类&#xff0c;然后使用类的名称和括号来实例化对象。 以下是一个创建对象的例子&#xff…

使用Docker搭建Sonarr

Sonarr是一款用于自动化管理电视节目的开源应用程序。它能够根据用户设定的规则自动搜索、下载并整理电视剧集&#xff0c;支持多用户、多队列管理&#xff0c;并且可以与下载客户端如SABnzbd、NZBGet等集成&#xff0c;以及与媒体服务器如Plex、Emby等配合使用&#xff0c;为用…

【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环

3道链表力扣题 一、删除链表中的节点&#x1f30f; 题目链接&#x1f4d5; 示例&#x1f340; 分析&#x1f4bb; 代码 二、反转链表&#x1f30f; 题目链接&#x1f4d5; 示例&#x1f340; 分析① 递归② 迭代 三、判断一个链表是否有环&#x1f30f; 题目链接&#x1f4d5; …

ES6 模块化操作

ES6模块化主要有两个操作&#xff1a;import 和 export 如果在html文件的script中引用模块的话&#xff0c;要设置<script type"module"> 一种导入导出方法&#xff1a; a.js//分别暴露 export let num 1 export function compute(a, b){return a b }//统…