首页 > 编程语言 >【每日算法】常见AIGC模型; 刷题:力扣单调栈

【每日算法】常见AIGC模型; 刷题:力扣单调栈

时间:2024-03-17 12:32:11浏览次数:18  
标签:柱子 模型 元素 AIGC height 力扣 图像 stack 刷题

上期文章

【每日算法】理论:生成模型基础; 刷题:力扣单调栈

文章目录


一、上期问题

【每日算法】理论:生成模型基础; 刷题:力扣单调栈

  • 怎么理解重参数化技术
  • KL散度是什么
  • DDPM
  • 什么是马尔可夫过程
  • GAN模型
  • VAE模型

二、理论问题

1、stable diffusion模型的网络架构

Stable Diffusion模型整体上是一个End-to-End模型,主要由VAE,U-Net以及CLIP Text Encoder三个核心组件构成。一般来讲,模型会有两个输入,即文本和图像输入。图像编码器VAE Encoder会将输入的图像转换为低维的Latent特征,而文本信息则会通过CLIP Text Encoder模型进行编码,处理过后的文本信息和图像信息会输入到图像优化模块中,图像优化模块进行优化迭代后,将其输出的低维Latent特征输入回图像解码器(VAE Decoder)中,重建成像素级图。
Stable Diffusion(SD)核心基础知识——(文生图、图生图)

2、T5的网络架构(Text-To-Text Transfer Transformer模型)

T5是谷歌在19年发布一个的一个模型,最主要的贡献是给整个 NLP 预训练模型领域提供了一个通用框架,将所有 NLP 任务都转化成 Text-to-Text任务。T5使用的就是Transformer标准的基本结构,分成 Encoder 和 Decoder 两部分,但有所区别:对于Encoder部分,是双向注意力,词与词之间互相可见,之后结果输给Decoder, Decoder部分当前时间步的词汇只能看到之前时间步的词汇。

3、SDXL模型

Stable Diffusion XL是一个二阶段的级联扩散模型,包括Base模型和Refiner模型。其中Base模型的主要工作和Stable Diffusion一致,具备文生图,图生图,图像inpainting等能力。在Base模型之后,级联了Refiner模型,对Base模型生成的图像Latent特征进行精细化,其本质上是在做图生图的工作。与Stable Diffusion模型相比,SDXL不论是模型架构上还是训练策略上都做了优化。在模型架构上,SDXL对原先sd的U-Net,VAE,CLIP Text Encoder三个部分都做了改进,在训练策略上,SDXL设计了很多训练策略,包括图像尺寸条件化策略,图像裁剪参数条件化以及多尺度训练等。
Stable Diffusion XL(SDXL)核心基础知识

4、DALLE

DALL·E 是 OpenAI 的多模态预训练模型,它的目标是将文本token和图像token当成一个数据序列,通过Transformer进行自回归。DALL-E 是一个两阶段的模型:它的第一个阶段是离散变分自编码器(Discrete Variance Auto-Encoder,dVAE),用于生成图像的token。它的第二个阶段是混合了图像和文本特征的,以Transformer为基础的生成模型。在训练阶段,模型会将文本编码和图像编码的结果进行拼接,用拼接的数据训练一个自回归transformer来建模文本和图片token的联合分布;在推理阶段,模型将输入文本编码成特征向量之后送入到自回归的Transformer中可以生成图像的token,将图像的token送入到dVAE的解码器中得到多组生成图像,此时再通过CLIP对生成样本进行评估,得到最终的生成结果。

【论文精读】DALLE: Zero-Shot Text-to-Image Generation零样本文本到图像生成

5、BPE编码

BPE(Byte Pair Encoding)编码是一种常用的无损数据压缩算法,也常被用于自然语言处理中的词汇表示和分词任务。它基于统计的方法,通过不断合并数据中出现频率最高的字节对来构建编码表。

6、为什么DDPM加噪声的幅度是不一致的?

DDPM前期的加噪幅度会小些,后期会加噪多。前期加噪少是为了保持数据结构的完整性,后期加噪多是为了加速扩散过程,从而使得模型能够更快地从噪声中恢复出清晰的数据。

三、力扣刷题回顾-单调栈部分

上期涉及题目:

本期题目:

42. 接雨水:

  • 给定条件:包含n个非负整数的数组,每个非负整数都表示一个宽度为1的柱子的高度
  • 要求输出:按照上述数组排列出的柱子,在下雨后能够接住多少雨水
    在这里插入图片描述

84.柱状图中最大的矩形:

  • 给定条件:包含n个非负整数的数组,每个非负整数都表示一个宽度为1的柱子的高度
  • 要求输出:求在这个柱状图中可以勾勒出的矩形的最大面积
    在这里插入图片描述

对比分析:
42. 接雨水这道题需要分别寻找元素右边和左边的最大元素来计算雨水面积,由于单调栈的作用是寻找一个元素右边或者左边第一个比自己大或者小的元素的位置,所以单调栈保存的标号主要是用来求雨水面积中的行。对于列的计算需要考虑两侧柱子的高度,适用到单调栈场景主要是考虑以下三种情况:

  • ①当前遍历的元素(柱子)高度小于栈顶元素的高度:(把这个元素加入栈中,因为栈里本来就要保持从小到大的顺序)
  • ②当前遍历的元素(柱子)高度等于栈顶元素的高度:(更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度)
  • ③当前遍历的元素(柱子)高度大于栈顶元素的高度:(出现凹槽,用栈顶和栈顶的下一个元素以及要入栈的元素三个元素来接水)
    在这里插入图片描述

84.柱状图中最大的矩形和42. 接雨水是遥相呼应的两道题,接雨水是求外,柱状图中最大的矩形是求内。42. 接雨水是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。

42. 接雨水:

  • 情况一时将当前遍历的元素加入栈;情况二时当前柱子高度和栈顶一致,左边的一个是不可能存放雨水的,所以去除左侧柱子,保留右侧新柱子;情况三时将接到的雨水进行计算。
class Solution:
    def trap(self, height: List[int]) -> int:
        # stack储存index,用于计算对应的柱子高度
        stack=[0]
        result=0
        for i in range (1,len(height)):
            # 情况一
            if height[i]<height[stack[-1]]:
                stack.append(i)
            # 情况二
            # 当前柱子高度和栈顶一致时,左边的一个是不可能存放雨水的,所以保留右侧新柱子
            elif height[i]==height[stack[-1]]:
                stack.pop()
                stack.append(i)
            # 情况三
            else:
                while len(stack)!=0 and height[i]>height[stack[-1]]:
                    # 栈顶是中间的柱子,也就是储水的凹槽的底部
                    mid_height=height[stack[-1]]
                    stack.pop()
                    if stack:
                        right_height=height[i]
                        left_height=height[stack[-1]]
                        # 两侧的较矮一方的高度 - 凹槽底部高度
                        h = min(right_height, left_height) - mid_height
                        # 凹槽右侧下标-凹槽左侧下标-1
                        w = i-stack[-1]-1
                        result+=h*w
                stack.append(i)
        return result

84.柱状图中最大的矩形:

  • 和接雨水一样分为三种情况,区别在于需要提前将输入数组首尾补上0,在情况三进行计算时高度的计算方式存在不同,并且接雨水试求面积之和,而本题是求面积的最大值。
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        #输入数组首尾补上0
        heights.insert(0,0)
        heights.append(0)
        result=0
        stack=[0]
        for i in range(1,len(heights)):
            # 情况一
            if heights[i]>heights[stack[-1]]:
                stack.append(i)
            # 情况二
            elif heights[i] == heights[stack[-1]]:
                stack.pop()
                stack.append(i)
            # 情况三
            else:
                while stack and heights[i]<heights[stack[-1]]:
                    # 栈顶是中间的柱子
                    mid_index=stack[-1]
                    stack.pop()
                    if stack:
                        w=i-stack[-1]-1
                        h=heights[mid_index]
                        result=max(result,w*h)
                stack.append(i)
        return result

参考:
代码随想录算法训练营第五十一天|503.下一个更大元素II,42. 接雨水
代码随想录算法训练营第五十二天|84.柱状图中最大的矩形,完结撒花✿✿ヽ(°▽°)ノ✿

标签:柱子,模型,元素,AIGC,height,力扣,图像,stack,刷题
From: https://blog.csdn.net/weixin_47748259/article/details/136774821

相关文章

  • LeetCode精选101刷题必备(C++)-附详细分类及解体说明
    分享一本leetcode刷题必备,互联网就业必备的免费书,非常好,值得推荐。感谢作者高畅无私整理和免费分享。本书介绍    本书分为算法和数据结构两大部分,又细分了十五个章节,详细讲解了刷LeetCode时常用的技巧。我把题目精简到了101道,一是呼应了本书的标题,二是不想让读......
  • Leetcode刷题-动态规划
    爬楼梯链接:70.爬楼梯-力扣(LeetCode)假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可......
  • Offer必备算法14_哈希表_五道力扣题详解(由易到难)
    目录①力扣1.两数之和解析代码②力扣面试题01.02.判定是否互为字符重排解析代码③力扣217.存在重复元素解析代码④力扣219.存在重复元素II解析代码⑤力扣49.字母异位词分组解析代码本篇完。①力扣1.两数之和1.两数之和难度简单给定一个整数数组 nu......
  • 刷题统计
    题目小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做a道题目,周六和周日每天做b道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于n题?题目描述:小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做a道题目,周六......
  • P3374 【模板】树状数组 动态求连续区间和 刷题笔记
    我们创建如下的树状数组来辅助操作该数组每个s[i]处于第几层取决于其二进制最后低位的1处于从右往左数第几列显然所有奇数的最右边一位都是1即其最低位的1处于右边第一列所以所有的奇数处于第一层而2,6,10,14的最低位1处于右边第二列 所以这些数处于第二层 8的最......
  • 日期问题 刷题笔记
    思路枚举19600101到20591231这个区间的数获得年月日 判断是否合法如果合法 关于题目给出的日期有三种可能年/月/日日/月/年月/日/年判断是否和题目给出的日期符合如果符合输出闰年{1.被4整除不被100整除  2.被400整除}补位写法“%02d" 如果不足两位......
  • Leetcode刷题-动态规划-最长回文子串
    链接:5.最长回文子串-力扣(LeetCode)给你一个字符串s,找到s中最长的回文子串,如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s......
  • 【力扣】最长公共子序列(动态规划)(还是得学套路才能会做)
    题目描述分析首先容易想出,dp数组的含义应该是两个字符串的最长公共子序列长度。当两个字符串中的任意一个长度为0时,对应的LCS为0由于同时受到两个数组的影响,所以dp数组应该设置为二维数组,并且有:dp[i][j]代表的是s1的0-i的子序列与s2的0-j的子序列的LCS然后分析递推公式:调......
  • 【专题】2023AIGC人才趋势报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33544自2022年11月ChatGPT发布以来,其超出预期的“涌现”能力彻底点燃了AIGC赛道。从人力资源角度来看,AIGC相关职位数量明显增加,并且人才对于这些职位的投递也更加积极。阅读原文,获取专题报告合集全文,解锁文末190份AIGC行业相关报告。值得注意的是,A......
  • 力扣刷题Days19-637.二叉树的层平均数
    目录1,题目2,代码2.1广度优先遍历2.2深度优先遍历3,学习与总结1,题目给定一个非空二叉树的根节点 root ,以数组的形式返回每一层节点的平均值。2,代码2.1广度优先遍历/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*......