【深度学习】diffusers 学习过程记录,StableDiffusion扩散原理

news2024/9/28 13:17:42

教程地址:https://huggingface.co/docs/diffusers/quicktour

文章目录

  • 环境
  • 扩散模型
  • 噪声残差的作用
  • 原理,文字编码如何给入Unet
  • scheduler
  • guidance_scale
  • scheduler.init_noise_sigma
  • 训练时候的反向传播

环境

python3.10安装环境:

pip install --upgrade diffusers accelerate transformers

扩散模型

不同的调度器具有不同的去噪速度和质量权衡。找出哪种对您最有效的方法是尝试它们!🧨 Diffusers 的主要特点之一是允许您轻松切换调度器。例如,要用 EulerDiscreteScheduler 替换默认的 PNDMScheduler,请使用 from_config() 方法加载它:

扩散模型(如Stable Diffusion)通过逐步添加和去除噪声的过程生成数据(如图像或音频)。这一过程包括两个主要阶段:正向扩散(forward diffusion)和逆向扩散(reverse diffusion)。
正向扩散(添加噪声)

正向扩散阶段是一个逐步的过程,其中原始数据(比如一张图像)逐渐被加入噪声,直到完全变为随机噪声。这一过程通常通过多个时间步骤进行,每一步都会在图像上添加一层噪声。正向扩散的最终结果是一张与原始图像毫无关系的纯随机噪声图像。这个过程是预设的,并不涉及学习。
逆向扩散(去除噪声)

逆向扩散是一个更为复杂的过程,其目的是将加噪后的图像逐步恢复到原始状态或生成新的数据。这个过程从纯噪声开始,逐步去除噪声,最终生成清晰的图像或数据。逆向扩散的每一步都需要预测给定噪声图像与其更少噪声状态之间的噪声残差,然后使用这个预测来更新当前噪声图像,使其更接近无噪声的状态。这一步骤是通过训练深度学习模型完成的,模型学会如何基于当前的噪声图像预测噪声残差。

噪声残差的作用

在逆向扩散过程中,噪声残差的概念至关重要。噪声残差是指当前噪声图像与去除一定噪声后应有的状态之间的差异。模型的任务是预测这一残差,然后用它来更新当前的噪声图像,从而一步步减少图像中的噪声。通过这种方式,模型能够从纯随机噪声中逐步构造出有意义的图像或数据。
总之,扩散模型通过正向扩散将数据转换为噪声,然后通过训练一个深度学习模型来逆向这一过程,从噪声中恢复出有意义的数据。噪声残差的预测是逆向扩散阶段的核心,使模型能够逐步减少噪声,最终生成清晰的图像或其他类型的数据。

原理,文字编码如何给入Unet

http://shiyanjun.cn/archives/2212.html

在这里插入图片描述

scheduler

scheduler.timesteps是什么,为什么是这样的数字:
[980, 960, 940, 920, 900, 880, 860, 840, 820, 800, 780, 760, 740, 720,
700, 680, 660, 640, 620, 600, 580, 560, 540, 520, 500, 480, 460, 440,
420, 400, 380, 360, 340, 320, 300, 280, 260, 240, 220, 200, 180, 160,
140, 120, 100, 80, 60, 40, 20, 0]

scheduler.timesteps 是一组数字,代表在扩散过程中使用的时间步。这些数字从高到低排列,表示从纯噪声开始逐步去除噪声的过程,直至生成最终图像。数字之所以是这样的(从980递减到0),是因为它们代表了不同的噪声级别。在扩散模型中,较高的数字对应于更多的噪声,而0表示没有噪声。这个序列是根据模型的训练和预期输出精细调整的,以最优化图像生成过程。

**scheduler(调度器)**的作用是在每个时间步管理噪声的减少过程。具体来说,scheduler.step函数接受模型预测的噪声残差、当前时间步t和当前的图像(或噪声)状态input,然后计算并返回下一个时间步的图像状态。这个步骤是通过将预测的噪声残差与当前状态结合,按照时间步指示的噪声级别调整,从而实现逐步去噪的目的。

guidance_scale

guidance_scale 是一个参数,它控制了在生成图像时,文本提示(prompt)的权重有多大。较高的guidance_scale值意味着文本提示将对生成的图像有更大的影响,这通常用于提高图像与文本描述之间的一致性。这是一种在无条件和有条件路径之间进行权衡的方法,可以帮助模型更准确地按照文本提示生成图像。

noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)

通过加权调整这两部分的差异,应用引导尺度(guidance_scale),增强文本条件对最终生成效果的影响。这个过程有助于在遵循文本提示的同时,增加生成图像的多样性和质量。

scheduler.init_noise_sigma

latents = latents * scheduler.init_noise_sigma 这一步意味着用初始噪声标准差(init_noise_sigma)缩放随机噪声(latents)。init_noise_sigma是一个预设值,决定了随机噪声的初始强度,对应于扩散过程的开始。这是准备初始随机噪声以匹配模型期望的噪声分布的一种方式。

训练时候的反向传播

https://huggingface.co/docs/diffusers/tutorials/basic_training

在这个程序中,反向传播的过程是通过 accelerator.backward(loss) 实现的。首先,来看一下整个训练循环中与反向传播相关的几个关键步骤,并解释其中的每一步。

关键步骤解释

正向传播(Forward Pass): 在正向传播阶段,模型接收带有噪声的图像 noisy_images 和对应的时间步 timesteps 作为输入,然后输出预测的噪声 noise_pred。
noise_pred = model(noisy_images, timesteps, return_dict=False)[0]

损失计算: 使用预测的噪声和实际加到干净图像上的噪声之间的均方误差(Mean Squared Error, MSE)来计算损失。
loss = F.mse_loss(noise_pred, noise)

F.mse_loss 计算预测噪声和实际噪声之间的差异,这是模型优化的目标。

反向传播(Backward Pass): 通过 accelerator.backward(loss) 调用反向传播。这一步计算了 loss 相对于模型参数的梯度。
accelerator.backward(loss)

在这里,accelerator 对象自动处理了梯度的计算和反向传播。accelerator 是 Accelerate 库的一个组件,它简化了在不同硬件上进行混合精度训练和梯度累积的复杂性。

梯度裁剪: 为了防止梯度爆炸,对模型参数的梯度进行裁剪。
accelerator.clip_grad_norm_(model.parameters(), 1.0)

参数更新: 使用优化器(如SGD、Adam等)更新模型参数。
optimizer.step()

在这一步中,根据梯度和学习率调整模型权重,以最小化损失函数。

学习率调整: 根据学习率调度器更新学习率,以改善训练过程中的学习效率。
lr_scheduler.step()

梯度清零: 在下一次训练迭代开始前,清除旧的梯度,防止梯度累加。
optimizer.zero_grad()

在这里插入图片描述

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

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

相关文章

影城管理系统|基于springboot框架+ Mysql+Java+B/S架构的影城管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

基于Spring Boot的社区团购系统,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1767743385296252930

搭建项目前端系统基础架构

Vue是什么 Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。目前市面上有很多基于Vue重新封装的各种前端UI框…

暗光增强——IAT网络推理测试(详细图文教程)

IAT模型由两个独立的分支组成,局部分支用于像素调整,并输出两个用于加法和乘法的特征图。全局分支用于全局调整并输出颜色矩阵和gamma值,全局分支受DETR启发,网络通过动态查询学习的方式更新颜色矩阵和gamma值。整个模型只有超过9…

Day63:WEB攻防-JS应用算法逆向三重断点调试调用堆栈BP插件发包安全结合

目录 前置知识 JS调试分析 JS分析调试结合Burp JS分析调试知识点: 1、JavaScript-作用域&调用堆栈 2、JavaScript-断点调试&全局搜索 3、JavaScript-Burp算法模块使用 前置知识 JS加密数据走向 浏览器调试 1、作用域:(本地&全…

Infineon_TC264智能车代码初探及C语言深度学习(二)

本篇文章记录我在智能车竞赛中,对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析,C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录分享一下。 目录 ​编辑 一、代码段分析 NO.1 指向结构体…

Python 合并两张图片

发现一个很有意思的图片处理包PIL,可以将两张图片合并成一张,而且很好看。代码如下 from PIL import Image# 打开两张图片 image1 Image.open("1.jpg").convert("RGBA") image2 Image.open("2.jpg").convert("RGB…

Siamese Network(孪生神经网络)详解

Siamese和Chinese有点像。Siam是古时候泰国的称呼,中文译作暹罗。Siamese也就是“暹罗”人或“泰国”人。Siamese在英语中是“孪生”、“连体”的意思,这是为什么呢?十九世纪泰国出生了一对连体婴儿,当时的医学技术无法使两人分离…

设置浏览器显示小于12px以下字体

问题 我们在项目开发过程中有时候会遇到设计师给的小于12px的字体,IE、火狐浏览器、移动端等小于12px的字号大小还是可以正常显示的,但是谷歌浏览器上显示字体最小为12px,css设置font-size:10px,运行代码显示结果仍然…

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

网络原理(网络协议初识)

目录 1.网络通信基础 1.1IP地址 1.2端口号 1.3认识协议 1.4五元组 1.5 协议分层 2.TCP/IP五层(或四层)模型 2.1网络设备所在分层 2.2网络分层对应 3.封装和分用 1.网络通信基础 网络互连的目的是进行网络通信,也即是网络数据传输&#…

[Kali] 安装Nessus及使用

在官方网站下载对应的 Nessus 版本:Download Tenable Nessus | TenableDownload Nessus and Nessus Managerhttp://www.tenable.com/products/nessus/select-your-operating-system这里选择 Kali 对应的版本 一、安装 Nessus 1、下载得到的是 deb 文件,与

solana 入门 1

solana-co-learn Solana 开发学习笔记(一)——从 Hello World 出发 安装开发环境 windows下环境配置 wsl First start with installing WSL on your system. wsl --install wsl安装Ubuntu 列出可用的分发版 wsl.exe --list --online显示: 以下是可安装的有效…

LLM推理框架Triton Inference Server学习笔记(一): Triton Inference Server整体架构初识

官方文档查阅: TritonInferenceServer文档 1. 写在前面 这篇文章开始进行大语言模型(Large Language Model, LLM)的学习笔记整理,这次想从Triton Inference Server框架开始,因为最近工作上用到了一些大模型部署方面的知识, 所以就快速补充了…

SpringBoot配置资源文件自动热更新

1、修改启动配置 On update action 和 On frame deactivation 添加 update classes and resources 配置 2、IDEA菜单栏File->setting->Build,Execution,Deployment->Compiler 勾选Build project automatically 3、禁用Thymeleaf的缓存 在开发环境中,通过…

点云处理ransac算法

参考资料: 点云处理入门 RANSAC & ICP with PCL Demo - 知乎 ransac是什么? 随机采样一致算法(RANdom SAmple Consensus)RANSAC。该算法可以从一组观测数据中(包含离群点),查找出符合某个数…

圈子社交系统-多人语音-交友-陪玩-活动报名-商城-二手论坛-源码交付,支持二开!

圈子小程序适用于多种场景,涵盖了各个领域的社交需求。以下是一些常见的适用场景: 兴趣社区: 用户可以加入自己感兴趣的圈子,与志同道合的人一起讨论交流,分享经验和知识。 行业交流: 各个行业可以建立自…

【C++map和set容器:AVL树、红黑树详解并封装实现map和set】

[本节目标] map和set底层结构 AVL树 红黑树 红黑树模拟实现STL中的map和set 1.底层结构 前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个 共同点是:其底层都是按照二叉搜索树来实现的,但…

【C++】string的底层剖析以及模拟实现

一、字符串类的认识 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&a…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法(递归实现)的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…