Scalable Diffusion Models with Transformers(DIT)代码笔记

完整代码来源:DiT
DiT模型主要是在diffusion中,使用transformer模型替换了UNet模型,使用class来控制图像生成。
根据论文,模型越大,patch size 越小,FID越小。
模型越大,参数越多,patch size越小,参与计算的信息就越多,模型效果越好。

在这里插入图片描述

模型使用了Imagenet 训练,有1000个分类,class_labels是0到999的整数,无条件类则必须是1000,在class embedding的时候定义了 nn.Embedding(1000+1,1152)。

在模型初始化的时候,DiTBlock和FinalLayer的参数中weight和bias被置为0,也就是adaLN_zero。
在DiTBlock 中,参数 c = t + y ,也就是 class embedding和 t embedding的和,然后通过线性映射生成shift,scale,和gate。


def modulate(x, shift, scale):
    return x * (1 + scale.unsqueeze(1)) + shift.unsqueeze(1)

class DiTBlock(nn.Module):
    """
    A DiT block with adaptive layer norm zero (adaLN-Zero) conditioning.
    """
    def __init__(self, hidden_size, num_heads, mlp_ratio=4.0, **block_kwargs):
        super().__init__()
        self.norm1 = nn.LayerNorm(hidden_size, elementwise_affine=False, eps=1e-6)
        self.attn = Attention(hidden_size, num_heads=num_heads, qkv_bias=True, **block_kwargs)
        self.norm2 = nn.LayerNorm(hidden_size, elementwise_affine=False, eps=1e-6)
        mlp_hidden_dim = int(hidden_size * mlp_ratio)
        approx_gelu = lambda: nn.GELU(approximate="tanh")
        self.mlp = Mlp(in_features=hidden_size, hidden_features=mlp_hidden_dim, act_layer=approx_gelu, drop=0)
        self.adaLN_modulation = nn.Sequential(
            nn.SiLU(),
            nn.Linear(hidden_size, 6 * hidden_size, bias=True)
        )

    def forward(self, x, c):
        shift_msa, scale_msa, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.adaLN_modulation(c).chunk(6, dim=1)
        x = x + gate_msa.unsqueeze(1) * self.attn(modulate(self.norm1(x), shift_msa, scale_msa))
        x = x + gate_mlp.unsqueeze(1) * self.mlp(modulate(self.norm2(x), shift_mlp, scale_mlp))
        return x


 # Zero-out adaLN modulation layers in DiT blocks:
 for block in self.blocks:
     nn.init.constant_(block.adaLN_modulation[-1].weight, 0)
     nn.init.constant_(block.adaLN_modulation[-1].bias, 0)
     
 # Zero-out output layers:
 nn.init.constant_(self.final_layer.adaLN_modulation[-1].weight, 0)
 nn.init.constant_(self.final_layer.adaLN_modulation[-1].bias, 0)
 nn.init.constant_(self.final_layer.linear.weight, 0)
 nn.init.constant_(self.final_layer.linear.bias, 0)
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高度可扩展的可搜索对称加密是一种安全的加密算法,具备对数据进行搜索操作的能力,并支持布尔查询。 可扩展性是指该算法在处理大规模数据时不会受到性能限制。它可以对大量数据进行高效加密和解密,而不会影响系统的响应时间和吞吐量。 对称加密是指使用相同的密钥进行加密和解密的加密方式。使用对称加密算法,用户可以使用相同的密钥对数据进行加密和解密操作,从而确保数据的机密性和完整性。对称加密算法通常具有较高的加密和解密速度,适用于需要高效加密大量数据的场景。 可搜索性是指加密后的数据仍然可以通过一定的方式进行搜索和查询。在传统的加密算法中,加密后的数据无法进行搜索操作,只能对整个数据集进行解密后再进行搜索。但高度可扩展的可搜索对称加密算法则允许用户对加密的数据进行搜索操作,而无需解密整个数据集。这种算法通过引入附加的索引数据结构,可以将搜索和加密操作有效地结合在一起,从而实现对加密数据的搜索。 布尔查询是指支持逻辑运算符(如AND、OR、NOT)进行搜索的能力。高度可扩展的可搜索对称加密算法不仅可以进行简单的精确匹配搜索,还可以进行复杂的布尔查询。用户可以使用逻辑运算符将多个搜索条件进行组合,从而实现更精准和灵活的搜索操作。 因此,高度可扩展的可搜索对称加密算法具备较高的可扩展性、对称加密和可搜索性,并支持布尔查询。它可以在保证数据安全的前提下,提供高效的数据搜索和查询功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值