上期文章
【每日算法】理论: 扩散模型+深度学习基础 刷题:力扣哈希表回顾
文章目录
- 上期文章
- 一、上期问题
- 二、本期问题
- 1、Classifier-free Guidance和Classifier Guidance
- 2、VAE为什么会导致图像变模糊
- 3、SD,Dall-E2两者的异同
- 4、NMS非极大值抑制
- 5、CNN的特点以及优势
- 6、Stable Diffusion 怎么实现⽂本和图像的条件控制的
- 三、力扣刷题回顾-哈希表
- 1. 两数之和
- 第454题.四数相加II
- 383. 赎金信
一、上期问题
- 交叉熵损失函数
- SAM模型的mask encoder(掩码解码器)
- VQVAE的优化问题
- controlnet模型中的zero convolution模块
- DDIM模型
- BN、LN、IN、GN、SN的对比
二、本期问题
1、Classifier-free Guidance和Classifier Guidance
- Classifier Guidance是在无条件生成的基础上,加上想要的类别的分类器梯度,作为引导(或者称为条件的梯度修正),就可以导出以类别作为条件的生成。首先单独预训练一个噪声鲁棒的分类器模型。然后训练一个普通的无条件Diffusion模型。Diffusion模型生成图像的采样过程中,利 用预训练好的分类器来提供条件信号。具体来说,就是每个采样步骤都计算分类器的输出,获得条件影响项,加入到Diffusion模型的更新公式中。这样就可以利用分类器的条 件信号,实现Diffusion模型在推理阶段条件生成图像的目的。
- Classifier-Free Guidance的总体思想比较简单,不使用分类器,直接使用模型去学习条件。Classifier-Free Guidance 中,⽣成模型不仅仅学习如何根据给定的条件⽣成数据,⽽且还学习如何在没有任何条件输⼊的情况下⽣成数据。换句话说,模型既能进⾏条件⽣成,也能进⾏⽆条件⽣成。CFG的训练过程其实就是对提供的条件输入做随机的dropout,这样就可以得到一个无条件和条件提示的两个输出,然后学习二者之间的方向差指导采样过程。在⽣成过程中,Classifier-Free Guidance 允许我们在没有显式使⽤分类器或判别器的情况下调节条件⽣成的强度。这是通过“调节”(或“混合”)条件⽣成和⽆条件⽣成的输出来实现的,以此来控制⽣成内容的相关性和多样性。
Classifier Guidance 与 Classifier-Free Guidance
2、VAE为什么会导致图像变模糊
VAE编解码整体是⼀个有损过程。VAE尽管是隐变量模型,但只能推断真实分布的近似值,隐变量分布与真实分布之间的 gap 是不可度量的。可以通过优化模型结构、提升采样效率等方法减少损失。完全不减少损失的⽅案就是原图反贴。
前序问题:
- VAE模型
AutoEncoder自动编码器、VAE变分自编码器、VQVAE量子化(离散化)的自编码器
3、SD,Dall-E2两者的异同
Dalle2通过自回归的方式逐个预测像素点,最终生成符合描述的图像。SD加⼊了Latent-Space(⼤幅降低特征维度),以及交叉注意⼒机制+Unet的步骤,更精细更可控。
前序问题:
- DALLE2
- stable diffusion相对于传统的diffusion的区别是什么,有什么改进
- stable diffusion模型的网络架构
- Stable Diffusion模型的图像优化模块是什么架构
【论文精读】DALLE2: Hierarchical Text-Conditional Image Generation with CLIP Latents
Stable Diffusion(SD)核心基础知识——(文生图、图生图)
4、NMS非极大值抑制
大多数目标检测算法(稠密预测)在得到最终的预测结果时,特征图的每个位置都会输出多个检测结果,整个特征图上会出很多个重叠的框。例如要检测一辆车,可能会有多个bbox都把这辆车给框了出来,因此需要从这些bbox中选出框得最好的,删除掉其它的。NMS非极大值抑制的功能就是筛选出一定区域内属于同一种类得分最大的框。NMS算法在每轮选取置信度最大的 Bounding Box ,接着关注所有剩下的 BBox 中与选取的 BBox 有着高重叠(IoU)的,对于IOU>阈值的相邻的检测框,NMS将其得分暴力置零,相当于直接舍弃。这一轮选取的 BBox 会被保留输出,且不会在下一轮出现。接着开始下一轮,重复上述过程:选取置信度最大 BBox ,抑制高 IoU BBox。
NMS 系列:soft,softer,weighted,iou-guided, Diou, Adaptive
5、CNN的特点以及优势
- 局部连接:可以提取局部特征。
- 权值共享:减少参数数量,因此降低训练难度(空间、时间消耗都少了)。
- 可以完全共享,也可以局部共享(比如对人脸,眼睛鼻子嘴由于位置和样式相对固定,可以用和脸部不一样的卷积核)
- 降维:通过池化或卷积stride实现。
- 多层次结构:将低层次的局部特征组合成为较高层次的特征。不同层级的特征可以对应不同任务。
神经网络发展历程:DNN、CNN、RNN
6、Stable Diffusion 怎么实现⽂本和图像的条件控制的
stable diffusion首先通过⽂本/图像编码器将⽂本/图像信息编码,然后利用交叉注意⼒机制将信息引⼊扩散模型。SD 的 U-Net 既用到了自注意力,也用到了交叉注意力。自注意力用于图像特征自己内部信息聚合。交叉注意力用于让生成图像对齐文本,其 Q 来自图像特征,K, V 来自文本编码。
前序问题:
- stable diffusion相对于传统的diffusion的区别是什么,有什么改进
- stable diffusion模型的网络架构
- Stable Diffusion模型的图像优化模块是什么架构
Stable Diffusion(SD)核心基础知识——(文生图、图生图)
三、力扣刷题回顾-哈希表
上期涉及题目:
- 242.有效的字母异位词
- 349. 两个数组的交集
- 第202题. 快乐数
本期题目:
- 1. 两数之和
- 第454题.四数相加II
- 383. 赎金信
1. 两数之和:
- 给定输入:一个整数数组 nums 和一个整数目标值 target
- 要求输出:找出数组中和为目标值target的两个整数,返回这两个整数对应的数组下标
- 补充条件:可以假设每种输入只会对应一个答案,并且可以按任意顺序返回答案,但是数组中同一元素在答案里不同重复出现。
第454题.四数相加II:
- 给定输入:四个整数数组 nums1、nums2、nums3 和 nums4,数组长度都是n
- 要求输出:计算有多少个元组 (i, j, k, l)满足nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
- 注意事项:输出结果中的每个元素一定是唯一的,并且可以不考虑输出结果的顺序
383. 赎金信:
- 给定输入:两个字符串:ransomNote 和 magazine
- 要求输出:返回 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。
- 注意事项:magazine 中的每个字符只能在 ransomNote 中使用一次。
对比分析:
当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。1. 两数之和问题中可以通过一个哈希表来存储已经遍历过的元素对应的下标,就可以在遍历一个元素之后,判断target-当前元素是否也出现在这个哈希表里过,如果出现了就说明存在满足和为target的一个两数组合。第454题.四数相加II问题可以看做是两个数之和的两数之和问题,因此只需要在1. 两数之和问题的基础上增加一层遍历即可。具体来说就是先遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到字典中,然后遍历大C和大D数组,统计0-(c+d) 在dict中出现的情况。383. 赎金信和之前做过的242.有效的字母异位词很像,242.有效的字母异位词相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
1. 两数之和
这里哈希表的作用在于找到需要的值所对应的索引位置。
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:records=dict()for index,value in enumerate(nums):if target-value in records:return [records[target-value],index]records[value]=indexreturn []
第454题.四数相加II
四数相加之和为0,可以拆分成两个两数相加。由于该题的要求是得到满足条件的组合数,因此哈希表的作用在于记录两数相加结果的可能性次数。
class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:record=dict()for i in range(len(nums1)):for j in range(len(nums2)):record[nums1[i]+nums2[j]]=record.get(nums1[i]+nums2[j],0)+1count=0for i in range(len(nums3)):for j in range(len(nums4)):target=nums3[i]+nums4[j]if 0-target in record:count+=record[0-target]return count
383. 赎金信
class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:ransomNote_count=[0]*26magazine_count=[0]*26for i in ransomNote:ransomNote_count[ord(i)-ord('a')]+=1for j in magazine:magazine_count[ord(j)-ord('a')]+=1return all(ransomNote_count[i]<=magazine_count[i] for i in range(26))
参考:
代码随想录算法训练营第五天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结