Openai神作Dalle2

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Openai神作Dalle2理论和代码复现
论文:https://cdn.openai.com/papers/dall-e-2.pdf
代码:https://github.com/lucidrains/DALLE2-pytorch
#博学谷IT学习技术支持#


文章目录

  • Openai神作Dalle2
  • 前言
  • 一、Dalle2模型整体框架
  • 二、预训练模型CLIP
    • 1.主要代码
  • 三、先验模型
    • 1.主要代码
  • 四、Decoder解码模型
  • 总结

前言

今天和大家分享的是一篇2022Openai神作Dalle2,如何输入一句话,生成非常有趣的图片过程。
先来看看论文的最终效果图。

是不是非常有趣?让我们看看Openai团队是如何做到的。


一、Dalle2模型整体框架


其实论文整体架构并不是很复杂,主要是运用
1.对比学习为主的CLIP
2.生成模型Diffusion Model
把这两个技术栈结合起来,这两个技术栈在我之前的博客中都已经有说明。大家可以先看一下。否则可能有一点抽象。
https://blog.csdn.net/weixin_53280379/article/details/125585445?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_53280379/article/details/126250598?spm=1001.2014.3001.5502

二、预训练模型CLIP


这里模型的上半部分,就是用预训练模型CLIP的结果,得到2个向量

  1. 第一个是text_embed,他是一个(2乘512)的tensor,2表示batch_size,512表示特征向量的维度,text_embed可以看作是对输入这句话的总结。
  2. 第二个是text_encodings,他是一个(2乘256乘512)的tensor,他是输入这句话每个词的特征。2表示batch_size,256表示这句话的长度不够用0代替,512表示特征向量的维度。

对应原文中的:

所以这里预训练模型CLIP的作用就是:输入一句话,通过CLIP,得到2个更接近图片的向量。把这两个向量运用到实际的下游任务中。

1.主要代码

text_embed, text_encodings = self.clip.embed_text(text)

三、先验模型

有了上面通过CLIP得到的2个文本特征向量以后,通过生成模型Diffusion Model,进一步对特征进行处理。

这一步主要就是运用Diffusion Model,但是和传统的Diffusion Model又有一点不一样,原文当中有说,传统的Diffusion Model是通过unet等网络,学到一个噪音,通过噪音一步步进行迭代,而Dalle2没有学噪音,而是直接学习得到x0,省去了中间的计算过程。


通过CLIP得到的2个文本特征向量,1个随机初始的噪音和一个时间步特征学习这个x0,有了这个x0,就和Diffusion Model模型一样,通过xt可以推出xt-1的分布了,在对xt-1的分布经过正太分布重采样技巧,就可以一步步迭代往前推,得到最终的特征向量了。
如何训练得到x0,主要就是通过一个transformer网络:

1.主要代码

这里x是随机初始的噪音,t是时间步特征,text_cond是CLIP文本特征。得到pred就是预测上一步所需要的x0特征。

pred = self.net.forward_with_cond_scale(x, t, cond_scale = cond_scale, **text_cond)

有了x0特征以后,根据Diffusion Model公式推出xt-1的分布,正太分布主要是一个期望和方差。和Diffusion Model公式完全一样。

def q_posterior(self, x_start, x_t, t):posterior_mean = (extract(self.posterior_mean_coef1, t, x_t.shape) * x_start +extract(self.posterior_mean_coef2, t, x_t.shape) * x_t)posterior_variance = extract(self.posterior_variance, t, x_t.shape)posterior_log_variance_clipped = extract(self.posterior_log_variance_clippedmodel_mean, posterior_variance, posterior_log_variance = self.noise_scheduler.q_posterior(x_start=x_recon, x_t=x, t=t)

这里就是重采样操作,得到xt-1特征图的image_embed

def p_sample(self, x, t, text_cond = None, clip_denoised = True, cond_scale = 1.):b, *_, device = *x.shape, x.devicemodel_mean, _, model_log_variance = self.p_mean_variance(x = x, t = t, text_cond = text_cond, clip_denoised = clip_denoised, cond_scale = cond_scale)noise = torch.randn_like(x)# no noise when t == 0nonzero_mask = (1 - (t == 0).float()).reshape(b, *((1,) * (len(x.shape) - 1)))return model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise#采样 (0.5 * model_log_variance).exp()计算得到标准差
image_embed = self.p_sample(image_embed, times, text_cond = text_cond, cond_scale = cond_scale)

最终不停迭代n次得到先验模型最终的特征图输出

for i in tqdm(reversed(range(0, self.noise_scheduler.num_timesteps)), desc='sampling loop time step', total=self.noise_scheduler.num_timesteps):times = torch.full((batch,), i, device = device, dtype = torch.long)image_embed = self.p_sample(image_embed, times, text_cond = text_cond, cond_scale = cond_scale)

四、Decoder解码模型


Decoder解码模型和先验模型类似也是运用Diffusion Model,但是运用了2个Diffusion Model,可能一个效果一般,但是这样速度就变慢了。


模型最后做了各种对比实验发现,Diffusion Model会比自回归的方法效果更好。


总结

今天和大家分享一下Openai神作Dalle2理论和代码复现,有点难度,有点抽象,主要是需要有对比学习为主的CLIP和生成模型Diffusion Model的基础,然后把两者所结合起来。文章主要是给大家分享了一下主要思想,还有细节没写。有时间可以读一下,有疑问可以留言进行讨论。

Openai神作Dalle2理论和代码复现相关推荐

  1. DALL·E才发布两天就被复现?官方论文还没出,大神们就在自制代码和视频了

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 没想到,OpenAI刚公布DALL·E,就已经有人在复现了. 虽然还是个半成品,不过大体框架已经搭建好了,一位第三方作者Philip Wan ...

  2. 经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)

    前言 今天我们一起来学习何恺明大神的又一经典之作: ResNeXt(<Aggregated Residual Transformations for Deep Neural Networks&g ...

  3. 理论+技术+代码已经准备完毕!2021年啃透花书!

    2021年的学习Flag已经立好了么? 这个时代正在以我们跟不上的步伐迅猛地发展,使我们陷入莫名的烦躁! 但归根结底不是你在懒惰别人在勤奋,而是都在勤奋,别人的效率却是你的10倍! 存着2058G的网 ...

  4. 最强神作 Crysis深度剖析与优化指南

    题目:最强神作!Crysis深度剖析与优化指南 作者:小熊在线--WolStame 介绍:最强游戏Crysis全方位剖析与深度优化指南 关键:CRYSIS/DX10游戏/技术剖析/优化 原创:小熊在线 ...

  5. 最强神作!Crysis深度剖析与优化指南

    题目:最强神作!Crysis深度剖析与优化指南 作者:小熊在线--WolStame 介绍:最强游戏Crysis全方位剖析与深度优化指南 关键:CRYSIS/DX10游戏/技术剖析/优化 原创:小熊在线 ...

  6. 最强神作!Crysis深度剖析与优化指南(1-8)

    题目:最强神作!Crysis深度剖析与优化指南 作者:小熊在线--WolStame 介绍:最强游戏Crysis全方位剖析与深度优化指南 关键:CRYSIS/DX10游戏/技术剖析/优化 原创:小熊在线 ...

  7. 豆瓣9.3,这部神作终于升级了!

    不久前,自称"业余up主"的AI大神李沐开源了一个剪辑神器 ,再圈一波技术粉! 图1:该项目在github上的页面展示 事实上,这位up主可并不业余,反而是妥妥的AI界卓越先驱.对 ...

  8. 【文末送书】豆瓣9.3,这部神作终于出新版了!

    不久前,自称"业余up主"的AI大神李沐开源了一个剪辑神器 ,再圈一波技术粉! 图1:该项目在github上的页面展示 事实上,这位up主可并不业余,反而是妥妥的AI界卓越先驱.对 ...

  9. 《预训练周刊》第9期:TABBIE:表格数据的预训练表示、「视觉预训练神作」:不用图片却训出图像识别SOTA?...

    No.09 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第9期< ...

最新文章

  1. 无法打开源文件 “iostream.h“
  2. hdu 1495 非常可乐 (bfs)
  3. .NET WinForm中给DataGridView自定义ToolTip并设置ToolTip的样式
  4. Sniffer pro 找不到网卡的解决方法
  5. 皮一皮:一直情绪不稳的原因终于找到了!
  6. python数据科学导论 中南_Python数据科学导论
  7. java数字转换为日期_Java 日期字符串date与数字long之间的转换
  8. 解决li在ie,firefox中行高不一致问题
  9. 诺顿误杀事件造成“疑似病毒大爆发”恐慌
  10. 为什么选择Mapabc
  11. 用单分子测序(single-molecule sequencing)和局部敏感哈希(locality-sensitive hashing)来组装大型基因组...
  12. T2695 桶哥的问题——吃桶
  13. win7主机 ubuntu10.04虚拟机 共享文件夹设置
  14. 新手求教。。有关onPreviewFrame未被调用的问题
  15. 史上最全网址导航大全,让世上没有找不到的好东西
  16. Android ROM适配基础
  17. KubeCon + CloudNativeCon + Open Source Summit 2019大会上海开幕看点不断!
  18. 康乐不风流之爱解题的pde灌水王张祖锦
  19. Stripe完善账户与使用(重点)
  20. 剖析Vue实现双向数据绑定原理

热门文章

  1. Java-四位电话号码加密
  2. 【from Spark!】音视频中的码率控制(CBR、VBR、CVBR、FIXQP)
  3. 双核服务器和双路服务器三大区别
  4. UIViewController内存警告管理
  5. windows操作系统的自启动项
  6. Web开发中的AJAX技术介绍
  7. 水浒传思维导图绘制方法分享
  8. 图情笔记 | 图书馆“空间再造”问题答题思路
  9. Codeforces Round #819 C - D
  10. war3_WAR文件与带有嵌入式服务器的Java应用程序