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

教程地址: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()

在这里插入图片描述

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

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

相关文章

Gitee配置SSH登录

一、背景 新入手的电脑,需要对Gitee上存放的项目进行更改上传,发现上传不了需要登录,便采用SSH密钥进行登录,防止远程管理工程中的信息泄露 二、前提 电脑已下载Git Bash工具,在项目下点击鼠标右键,进入…

halconOCR文字识别

1、OCR文字识别 FontFile : Universal_0-9_NoRej dev_update_window (off) read_image (bottle, bottle2) get_image_size (bottle, Width, Height) dev_open_window (0, 0, Width, Height, black, WindowHandle) set_display_font (WindowHandle, 16, mono, true, false) dev…

适用于系统版本:CentOS 6/7/8的基线安全检测脚本

#!/bin/bash #适用于系统版本:CentOS 6/7/8 echo "----------------检测是否符合密码复杂度要求----------------" #把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊…

JVM及垃圾回收算法

一、JVM 1、jvm的内存组成 五大内存区域,分1.7和1.8 1.堆内存:引用类型的数据,内部组成:1.新生代(伊甸区和幸存者区)2.老年代。该区域经常发生垃圾回收的操作 堆是JVM中最大的一块内存区域,用…

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda,恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件,将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

声卡喊话IP喇叭,IP网络吸顶天花喇叭

声卡喊话IP喇叭,IP网络吸顶天花喇叭 SV-7043VP是一款ip/sip网络吸顶喇叭,具有10/100M以太网接口,从网络接口接收网络的音频数据后播放。本网络吸顶喇叭可以与其他广播主机、服务器软件和采播主机配合使用,实现音频的播放&#xf…

【DL经典回顾】深度学习概述

深度学习概述 一、引言 在过去的几年里,深度学习已经从学术研究的领域走向了主流,彻底改变了我们对人工智能的认识和应用。这种强大的技术,以其独特的能力模仿人脑处理和分析复杂数据的方式,不仅在科学界引起了革命,…

ThingsBoard Edge 安装部署

文章目录 一、概述1.官方文档2.部署说明3.安装准备3.1. 克隆服务器3.2.安装 Docker3.3.安装 Java 113.4.安装 PostgreSQL3.5.下载安装包 二、安装部署1.创建 Edge 实例2.创建数据库3.Edge 服务安装3.1.安装服务3.2.配置 Edge3.3.运行安装脚本3.4.重新启动服务 4.访问 Edge5.故障…

基于PHP的数字化档案管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的数字化档案管理系统 一 介绍 此数字化档案管理系统基于原生PHP,MVC架构开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 php(mvc)mysqlbootstrapphpstudyvscode 二 功能 …

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用,用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性,并提高代码的可读性。 安装 要使用 django-comment-migrate,您需要…

Arcgis新建位置分配求解最佳商店位置

背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…

C++学习随笔(5)——类和对象的深窥

本章我们来学习一下更深入了解一下类和对象! 目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载…

一键切割,激发无限创意:体验全新图片批量编辑器

在数字创意的时代,图片编辑成为了表达个性和创造力的关键。然而,传统的图片编辑工具常常让人望而生畏,复杂的操作和高门槛的技术要求使得许多人望而却步。现在,我们为您带来一款全新的图片批量编辑器,只需一键切割&…

vivo统一接入网关VUA转发性能优化实践

作者:vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology(QAT)来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能,并探讨QAT在不同应用场景中的表现。最…

Abaqus三维梯度泰森多边形插件:Voronoi FGM 3D(Mesh)- AbyssFish

插件介绍 Voronoi FGM 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus软件内生成梯度分布的三维泰森多边形长方体模型。插件可用于梯度功能材料(Functionally Gradient Materials)、梯度纳米金属材料、梯度金属结构等梯度晶体模型的建立。模型基于背景网格实现,通过单…

分布式数据处理MapReduce简单了解

文章目录 产生背景编程模型统计词频案例 实现机制容错机制Master的容错机制Worker的容错机制 产生背景 MapReduce是一种分布式数据处理模型和编程技术,由Google开发,旨在简化大规模数据集的处理。产生MapReduce的背景: 数据量的急剧增长&…

RAID技术知识详解到RAID 10的linux实现过程

1.RAID技术简介 RAID(Redundant Array of Independent Disks)独立磁盘冗余阵列。通俗来说就是将多个硬盘通过软件或硬件结合成虚拟单台大容量的硬盘使用。 RAID技术的特点: 可以自动检测故障硬盘; 可以重建硬盘坏道的资料&…

深度学习模型部署-番外-TVM机器学习编译

什么是机器学习编译器/AI编译? 图片来自知乎大佬的文章 机器学习编译是指:将模型从训练形式转变为部署模式 训练模式:使用训练框架定义的模型部署模式:部署所需要的模式,包括模型每个步骤的实现代码,管理资…

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

简单的思考(一):MATLAB实现心形线

今天刷B站的时候看见了&#xff1a; 于是想着自己能不能也做出来 clc;clear; % 定义x的范围 x -2:0.01:2;% 初始化图形 figure; set(gcf,position,[0,0,800,600],color,w); h1 plot(x,abs(x).^(2/3) (0.9*sqrt((3.3-x.^2))).*sin(0.1*pi*x),r,LineWidth,3); hold on xlim(…