test
12345678910111213141516171819202122232425262728293031323334353637383940414243444546class TimeEmbedding(nn.Module): """ ### Embeddings for $t$ """ def __init__(self, n_channels: int): """ * `n_channels` is the number of dimensions in the embedding """ super().__init__() self.n_channels = n_channels # First linear layer self.lin1 = nn.Linear(self.n_channels // 4, self.n_channels ...
python与torch
一名柏柏尔人带领骆驼队穿越撒哈拉沙漠,摄于摩洛哥。
python用法
map()函数
map 的作用是依次将可迭代对象里的元素传给 map 中的函数,返回一个迭代器。
一个参数的情况
1234567891011121314# 定义一个函数def square(x): return x**2 # 序列nums = [1, 2, 3, 4, 5] # 对nums序列每个数求平方,返回迭代器nums_squared = map(square, nums) # 输出结果for num in nums_squared: print(num)
输出结果:
123451491625
当然我们也可以将上面例子中的 square 函数用 lambda 代码,例子如下:
1234567nums = [1, 2, 3, 4, 5] nums_squared = map(lambda x: x*x, nums) for num in nums_squared: print(num)
多个参数情况
12345678910111213141516# 定义一个函数# 该函数必须采用两个参数 ...
实现ddpm中学习到的知识
斯洛文尼亚布莱德湖上的布莱德岛鸟瞰图。
前言
在实现 DDPM 代码的过程中,发现了很多可以补充自己代码能力的知识点,在此简单记录一下,顺带也是自己加深印象,不至于学完就忘。然后也借着这个文章,梳理一下在实现 DDPM 中很多自己遇到的困难,以及我自己的解决方案。
参考资料
1. 微信公众号文章:深入浅出扩散模型,代码篇
2. 科学空间:生成扩散模型漫谈(三):DDPM = 贝叶斯 + 去噪
3. Labml 复现 DDPM 代码
其他
torch 数据类型转换
1. gather()函数
先学习一个小知识,torch.gather 用法,对于 Tensor 中的数据进行切片的一个方式。
torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
含义:对于输入 input 的 dim 维度取 index 对应的元素。
输入:可以是 torch.gather() ,也可以是某个实例化张量调用 tensor.gather(),省去了 input 参数。
输出:对 input 张量进行数据切片的结果 ...
ViT
盖朗厄尔峡湾位于挪威,两岸耸立着海拔1500米以上的群山。
前言
在阅读相关 diffusion 论文时,经常会遇见许多自己之前不了解的知识,这是很正常的现象。既不用过度担心,也不要躺平,而是要在空闲的时候把不会的知识补上。
这里学习的是关于 Attention is all you need. 论文在视觉方向的应用 ViT。关于 Attention,最主要学习的内容就是 self-attention 实现细节,以及 Multi-Head self-attention。
这里的学习内容主要参考的是:
【李宏毅】讲解Attention论文
【霹雳啪啦】使用pytorch搭建ViT模型
Attention 回顾
self-attention 回顾
在这里首先回顾一下 self-attention 的实现。图片参考文章。
首先我们要在脑海中始终清楚一件事:self-attention 信息处理流程:
借助矩阵并行化,我们可以把权重矩阵 q k v 实现上写作一个矩阵 W,并且 W 针对不同的序列而言是共享的存在,例子中的两个序列 a1a_1a1 和 a2a_2a2 与 W 作矩阵 ...
Diffusion相关参考
日出时可多帕西火山,厄瓜多尔科多帕希国家公园。
Diffusion Model 相关文章参考
【知乎】Diffusion Models必读的10篇经典论文
【综述】Diffusion Models发展
【知乎】DDPM与DDIN
提问:怎么理解ELOB公式?
ELBO(Evidence Lower Bound)是VAE模型中优化的目标函数,它可以用来近似原始的对数似然函数(log-likelihood),从而进行模型的训练。
ELBO的公式为:
Eqϕ(z∣x)[logp(x,z)qϕ(z∣x)]\mathbb{E}_{q \phi(z|x)}\left[\log\frac{p(x,z)}{q_\phi(z|x)}\right]
Eqϕ(z∣x)[logqϕ(z∣x)p(x,z)]
其中,p(x,z)p(x,z)p(x,z)表示联合分布,qϕ(z∣x)q_\phi(z|x)qϕ(z∣x)表示后验分布,即在给定输入数据xxx的情况下,潜在变量zzz的分布。ELBO可以理解为对数似然函数的下界,它的计算过程如下:
首先,将联合分布p(x,z)p(x,z)p(x,z)拆开,得到: ...
损失函数
损失函数
极大似然估计法
什么是似然值?似然值是现实情况已经发生,接着我们假设现实情况对应着有许多理论模型的概率分布,在某一个理论上的概率模型下,求得的现实情况发生概率。
既然有了似然值,最大似然估计法就应运而生了。既然在现实情况的已经发生的情况下,如何用现实情况推导理论总结?如何使用现实主义估测理论主义的结果?虽然我们没法永远准确地确定理论世界的事情发生的概率分布,但是根据求得的不同似然值中,选择似然值最大的模型,是一种理智的做法。
总结一下,当我们已知现实事情发生的结果,进而去反推产生此结果的概率模型的时候,往往用到极大似然估计法。
分类问题的损失函数
在这里以二分类的例子为切入点进行理解,例如设计一个神经网络尝试去分辨图片中的生物是不是猫。
假设我们的训练样本是 (xi,yi)(x_i,y_i)(xi,yi),神经网络的输出经过 sigmoid 归一化后的输出是 yi^\hat{y_i}yi^,我们可以这样认为:yi^\hat{y_i}yi^ 的值是神经网络认为输入的 xix_ixi 是一只猫(yiy_iyi=1)的概率,这样的话,1−yi^1-\hat{y_i} ...
谷歌轻量化网络MobileNetV1
秋天的图林根森林与瓦特堡城堡,德国 (© ezypix/Getty Images)
MobileNet V1
适用于移动端本地进行实时边缘计算,不需要上传到云服务器中。一来是保障了实时性,二是保障了一些隐私的信息。在终端需要更大的计算能力,同时我们的模型也要更加的轻量化,这就对我们的软硬件都提出了较高的要求。端云结合,云端训练模型,得到的模型部署在终端。那么轻量化网络可以优化的具体方向有哪些呢?例如对深度学习框架进行CUDA加速、因为轻量化网络比较精简,所以该模型会不会被欺骗?这就引入了对抗学习。
Depthwise separable convolution
MobileNet 基于深度可分离卷积对卷积层进行优化和改进,从而降低参数量减少计算量,使网络更加轻量化,这是 MobileNet 核心思想。深度可分离卷积的图示如下:
正常的卷积是卷积核是w∗h∗cin∗coutw*h*c_{in}*c_{out}w∗h∗cin∗cout,在这张图片的cinc_{in}cin是3。每一次卷积都生成 feature_map 中的一个值,最后将 coutc_{out}cout 个 f ...
迁移学习
迁移学习与fine tuning
这里记录一下在 bilibili up同济子豪兄迁移学习视频笔记。迁移学习是指,把他人已经训练好的模型,泛化到我们自己的数据集上,也就是训练一个 CNN 网络并不是非要需要大量的数据集。
当我们的数据集比较小,而且与 ImageNet 数据集的数据分布十分相像(例如我们的数据集也是动物、生活用品),而不是特殊场景(例如工业钢轨缺陷检测)时,我们可以仅修改分类器的最后一层并训练更新其参数,同时冻结其他所有的层(保留结构和参数),
当我们的数据集很大,数据分布相似,我们可以解冻分类器的 FC 层,冻结特征提取网络,最后更新解冻层的参数即可。
当我们的数据集很大,但是数据很不相似,例如医疗数据的诊断,我们需要往前训练更多的层,同时预训练权重可以是 ImageNet 数据集上已有的权重,在我们自己的数据集上更新我们的参数权重。
常见的可供迁移学习的优秀主干网络取下。也就是说,无论是 ImageNet 还是皮肤癌图像分类等等问题,我们认为,以下这些主干网络提取到的特征都是通用的,我们借助提取到的通用的特征之后,在分类器上做处理。
动态规划
银河下的哈纳雷湾 背景主题图源自美国夏威夷·哈纳雷
动态规划
动态规划这个概念十分有趣。举一个例子来说,在我本科学习“栈的应用”这部分内容的时候,提到了可以用栈实现“走迷宫”的问题。也就是在代码中,如果我们发现某一条路径进入死胡同的时候,要按原路回退。回退的前提是我们有一个数据结构——栈,用它来保存我们之前的行走路径。如果没有栈应用在迷宫问题,那不得不回退到起点再重新执行,这将很麻烦。所以,这里提到了一个重要的思想:保留之前运算的结果,不进行重复冗余的计算。
动态规划在我的理解而言,可以想象为:有某种问题看似很复杂,但是可以分解为较小的子问题进行求解。最小的子问题是方便求解的,同时存储中间子问题的计算结果。当然最重要的是,可以寻找到“该问题”和“分解的子问题”之间的递推关系表达式。
上面是我自己的理解,下面的内容摘录自书中规范化表述
和分治法一样,动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。(此处“programming”是指–种规划,而不是指写计算机代码)。分治法算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题 ...
树
红黑树
为何引入红黑树(RBT)
平衡二叉树AVL:插入/删除很容易破坏“平衡”特性,需要频繁调整树的形态。如:插入操作导致不平衡,则需要先计算平衡因子,找到最小不平衡子树(时间开销大),再进行LL/RR/LR/RL调整。
红黑树RBT:插入/删除很多时候不会破坏“红黑”特性,无需频繁调整树的形态。即便需要调整,一般都可以在常数级时间内完成
RBT定义
首先,红黑树是一个二叉排序树。其次,需要满足以下的条件:
①每个结点或是红色,或是黑色的
②根节点是黑色的
③叶结点(外部结点、NULL结点、失败结点)均是黑色的
④不存在两个相邻的红结点(即红结点的父节点和孩子结点均是黑色)
⑤对每个结点,从该节点到任一叶结点的简单路径上,所含黑结点的数目相同
这里需要注意的是,我们所说的第三条指的是查找失败的节点均是黑色的,如下图所示:
RBT的插入规则
先查找,确定插入位置(原理同二叉排序树)。
插入新结点是根——染为黑色;新结点非根——染为红色。
若插入新结点后依然满足红黑树定义,则插入结束。
若插入新结点后不满足红黑树定义,需要调整,使其重新满足红黑树定义。
叔叔结点是黑色:旋转+ ...