[{"data":1,"prerenderedAt":304},["ShallowReactive",2],{"content-query-aB9HGUsi63":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"cover":11,"type":12,"category":13,"body":14,"_type":298,"_id":299,"_source":300,"_file":301,"_stem":302,"_extension":303},"/technology-blogs/zh/3780","zh",false,"","开发者说 | 基于昇思MindSpore实现DDIM扩散模型","作者：Adream   来源：昇思论坛","2025-06-27","https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/07/04/911d6545cd544cbebcd4ba14a6d3b738.png","technology-blogs","开发者说",{"type":15,"children":16,"toc":293},"root",[17,25,31,36,41,50,58,77,82,87,97,102,107,112,120,128,138,143,151,158,165,172,180,188,193,202,222,232,245,253,261,271,280],{"type":18,"tag":19,"props":20,"children":22},"element","h1",{"id":21},"开发者说-基于昇思mindspore实现ddim扩散模型",[23],{"type":24,"value":8},"text",{"type":18,"tag":26,"props":27,"children":28},"p",{},[29],{"type":24,"value":30},"作者：Adream",{"type":18,"tag":26,"props":32,"children":33},{},[34],{"type":24,"value":35},"来源：昇思论坛",{"type":18,"tag":26,"props":37,"children":38},{},[39],{"type":24,"value":40},"昇思MindSpore2024年技术帖分享大会圆满结束！全年收获80+高质量技术帖， 2025年全新升级，推出“2025年昇思干货小卖部，你投我就收！”，活动继续每月征集技术帖。本期技术文章由社区开发者Adrem输出并投稿。如果您对活动感兴趣，欢迎在昇思论坛投稿。",{"type":18,"tag":26,"props":42,"children":43},{},[44],{"type":18,"tag":45,"props":46,"children":47},"strong",{},[48],{"type":24,"value":49},"# 01",{"type":18,"tag":26,"props":51,"children":52},{},[53],{"type":18,"tag":45,"props":54,"children":55},{},[56],{"type":24,"value":57},"概述",{"type":18,"tag":26,"props":59,"children":60},{},[61,63,68,70,75],{"type":24,"value":62},"DDIM 是基于 DDPM 改进的迭代隐式概率扩撒模型，核心目标是",{"type":18,"tag":45,"props":64,"children":65},{},[66],{"type":24,"value":67},"在保持生成质量的同时加速采样过程",{"type":24,"value":69},"。通过引入",{"type":18,"tag":45,"props":71,"children":72},{},[73],{"type":24,"value":74},"非马尔可夫扩散过程和确定性采样机制",{"type":24,"value":76},"，DDIM 允许在去噪时跳过部分时间步，可以显著减少计算量。其核心创新在于：",{"type":18,"tag":26,"props":78,"children":79},{},[80],{"type":24,"value":81},"**1、可调方差参数：**通过控制反向过程的随机性，实现从完全随机（DDPM）到完全确定（无噪声）的采样模式；",{"type":18,"tag":26,"props":83,"children":84},{},[85],{"type":24,"value":86},"**2、跳跃式采样：**无需遍历所有时间步，可直接在预设的关键时间点之间跳转，大幅提升生成速度。",{"type":18,"tag":26,"props":88,"children":89},{},[90,95],{"type":18,"tag":45,"props":91,"children":92},{},[93],{"type":24,"value":94},"DDIM",{"type":24,"value":96}," 的主要特点包括：",{"type":18,"tag":26,"props":98,"children":99},{},[100],{"type":24,"value":101},"**1、****非马尔可夫过程：**打破 DDPM 的严格马尔可夫链限制，允许当前状态依赖任意历史状态；",{"type":18,"tag":26,"props":103,"children":104},{},[105],{"type":24,"value":106},"**2、****确定性采样：**通过设置方差为 0，消除采样过程的随机性，提升生成稳定性；",{"type":18,"tag":26,"props":108,"children":109},{},[110],{"type":24,"value":111},"**3、****采样效率：**支持“跳步”采样，在 10-50 步内即可生成高质量样本（DDPM 需 1000 步）。",{"type":18,"tag":26,"props":113,"children":114},{},[115],{"type":18,"tag":45,"props":116,"children":117},{},[118],{"type":24,"value":119},"# 02",{"type":18,"tag":26,"props":121,"children":122},{},[123],{"type":18,"tag":45,"props":124,"children":125},{},[126],{"type":24,"value":127},"主要步骤",{"type":18,"tag":26,"props":129,"children":130},{},[131,133],{"type":24,"value":132},"**1、**",{"type":18,"tag":45,"props":134,"children":135},{},[136],{"type":24,"value":137},"正向扩散过程",{"type":18,"tag":26,"props":139,"children":140},{},[141],{"type":24,"value":142},"DDIM 的正向扩散过程与 DDPM 一致，都是为了在每个时间步 t 中，逐渐增加噪声的比例，",{"type":18,"tag":26,"props":144,"children":145},{},[146],{"type":18,"tag":147,"props":148,"children":150},"img",{"alt":7,"src":149},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/07/04/70fcbd4804214854805157be17108f11.png",[],{"type":18,"tag":26,"props":152,"children":153},{},[154],{"type":18,"tag":147,"props":155,"children":157},{"alt":7,"src":156},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/07/04/355b7ac2137341e5be1aeadeb706f210.png",[],{"type":18,"tag":26,"props":159,"children":160},{},[161],{"type":18,"tag":147,"props":162,"children":164},{"alt":7,"src":163},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/07/04/7788be003c4f4c8782de887f7ab657ef.png",[],{"type":18,"tag":26,"props":166,"children":167},{},[168],{"type":18,"tag":147,"props":169,"children":171},{"alt":7,"src":170},"https://obs-mindspore-file.obs.cn-north-4.myhuaweicloud.com/file/2025/07/04/8134e4dfbf8040c98f0b8acf0626ee29.png",[],{"type":18,"tag":26,"props":173,"children":174},{},[175],{"type":18,"tag":45,"props":176,"children":177},{},[178],{"type":24,"value":179},"# 04",{"type":18,"tag":26,"props":181,"children":182},{},[183],{"type":18,"tag":45,"props":184,"children":185},{},[186],{"type":24,"value":187},"模型结构",{"type":18,"tag":26,"props":189,"children":190},{},[191],{"type":24,"value":192},"DDIM 沿用 DDPM 的 U-Net 架构作为主干网络，包含对称的编码器-解码器路径和跳跃连接，但针对采样效率进行了轻量化调整：",{"type":18,"tag":26,"props":194,"children":195},{},[196,197],{"type":24,"value":132},{"type":18,"tag":45,"props":198,"children":199},{},[200],{"type":24,"value":201},"网络设计细节",{"type":18,"tag":203,"props":204,"children":205},"ul",{},[206,212,217],{"type":18,"tag":207,"props":208,"children":209},"li",{},[210],{"type":24,"value":211},"**归一化与激活：**使用GroupNorm替代 BatchNorm 用以提升小批量训练稳定性，使用SiLU 激活函数替代 ReLU，增强非线性建模能力；",{"type":18,"tag":207,"props":213,"children":214},{},[215],{"type":24,"value":216},"**时间嵌入：**将时间步 t编码为高维向量（如正弦编码或可学习嵌入），通过线性层与各层特征融合；",{"type":18,"tag":207,"props":218,"children":219},{},[220],{"type":24,"value":221},"**跳跃连接：**保留原来的编码器-解码器的多尺度特征融合，确保细节恢复能力。",{"type":18,"tag":26,"props":223,"children":224},{},[225,227],{"type":24,"value":226},"**2、**",{"type":18,"tag":45,"props":228,"children":229},{},[230],{"type":24,"value":231},"关键模块对比",{"type":18,"tag":203,"props":233,"children":234},{},[235,240],{"type":18,"tag":207,"props":236,"children":237},{},[238],{"type":24,"value":239},"**采样层：**DDIM 的p_sample方法通过判断σₜ是否为 0，决定是否添加随机噪声，默认σₜ=0 时为纯确定性计算；",{"type":18,"tag":207,"props":241,"children":242},{},[243],{"type":24,"value":244},"**时间步处理：**支持任意时间步跳转，无需按顺序遍历，通过预设的时间步列表（如[T_s, T_{s-1}, ..., T_2, T_1]）实现跳步采样。",{"type":18,"tag":26,"props":246,"children":247},{},[248],{"type":18,"tag":45,"props":249,"children":250},{},[251],{"type":24,"value":252},"# 05",{"type":18,"tag":26,"props":254,"children":255},{},[256],{"type":18,"tag":45,"props":257,"children":258},{},[259],{"type":24,"value":260},"MindSpo****re代码实现",{"type":18,"tag":262,"props":263,"children":265},"pre",{"code":264},"# 核心采样逻辑\nclass DDIM(nn.Cell):\n    \"\"\"DDIM核心类，实现跳跃式确定性采样\"\"\"\n    def __init__(self, model, betas, T=1000, sample_steps=50):\n        super().__init__()\n        self.model = model  # U-Net网络\n        self.T = T          # 总时间步\n        self.sample_steps = sample_steps  # 采样时使用的跳步步长\n        self.betas = betas\n        self.alphas = 1. - betas\n        self.alpha_bars = np.cumprod(self.alphas)\n        \n        # 生成跳步时间序列（如从T到0，每隔T/sample_steps步取一个点）\n        self.sampling_timesteps = np.linspace(0, T-1, sample_steps, dtype=np.int64)[::-1]\n   \n    def p_sample(self, x, t):\n        \"\"\"确定性去噪单步（σ=0）\"\"\"\n        alpha = self.alphas[t]\n        alpha_bar = self.alpha_bars[t]\n        sqrt_alpha = ops.sqrt(alpha)\n        sqrt_one_minus_alpha = ops.sqrt(1 - alpha)\n       \n        # 预测噪声并估计原始数据\n        pred_noise = self.model(x, t)\n        pred_x0 = (x - sqrt_one_minus_alpha * pred_noise) / sqrt_alpha\n        \n        # DDIM确定性采样公式\n        alpha_bar_prev = self.alpha_bars[t-1] if t > 0 else 1.0\n        sqrt_alpha_bar_prev = ops.sqrt(alpha_bar_prev)\n        sqrt_one_minus_alpha_bar_prev = ops.sqrt(1 - alpha_bar_prev)\n        \n        x_prev = sqrt_alpha_bar_prev * pred_x0 + sqrt_one_minus_alpha_bar_prev * pred_noise\n        return x_prev\n    \n    def construct(self, x):\n        \"\"\"跳步采样过程（从x_T到x_0）\"\"\"\n        for t in self.sampling_timesteps:\n            x = self.p_sample(x, t)\n        return x\n# U-Net 改进\nclass UNet(nn.Cell):\n    \"\"\"带GroupNorm和SiLU的轻量化U-Net\"\"\"\n    def __init__(self, in_channels=3, channel_dim=128):\n        super().__init__()\n        self.time_embed = nn.SequentialCell(\n            nn.Embedding(1000, channel_dim),\n            nn.SiLU(),\n            nn.Dense(channel_dim, channel_dim * 4)\n        )\n        \n        self.down = nn.SequentialCell(\n            nn.Conv2d(in_channels, channel_dim, 3, padding=1),\n            nn.GroupNorm(32, channel_dim),\n            nn.SiLU(),\n            nn.Conv2d(channel_dim, channel_dim * 2, 3, padding=1, stride=2),\n            nn.GroupNorm(32, channel_dim * 2),\n            nn.SiLU()\n        )\n        \n        self.up = nn.SequentialCell(\n            nn.Conv2dTranspose(channel_dim * 2, channel_dim, 3, stride=2, padding=1),\n            nn.GroupNorm(32, channel_dim),\n            nn.SiLU(),\n            nn.Conv2d(channel_dim, in_channels, 3, padding=1),\n            nn.Tanh()\n        )\n    \n    def construct(self, x, t):\n        t_emb = self.time_embed(t)\n        h = self.down(x) + t_emb.view(-1, h.shape[1], 1, 1)\n        return self.up(h)\n",[266],{"type":18,"tag":267,"props":268,"children":269},"code",{"__ignoreMap":7},[270],{"type":24,"value":264},{"type":18,"tag":272,"props":273,"children":275},"h3",{"id":274},"参考链接",[276],{"type":18,"tag":45,"props":277,"children":278},{},[279],{"type":24,"value":274},{"type":18,"tag":26,"props":281,"children":282},{},[283,285],{"type":24,"value":284},"[1] 论文地址：",{"type":18,"tag":286,"props":287,"children":291},"a",{"href":288,"rel":289},"https://arxiv.org/pdf/2010.02502",[290],"nofollow",[292],{"type":24,"value":288},{"title":7,"searchDepth":294,"depth":294,"links":295},4,[296],{"id":274,"depth":297,"text":274},3,"markdown","content:technology-blogs:zh:3780.md","content","technology-blogs/zh/3780.md","technology-blogs/zh/3780","md",1776506135178]