昇思25天打卡营-mindspore-ML- Day20-应用实践-生成式-Diffusion扩散模型

学习笔记

今天学习了扩散模型(Diffusion Model),这是一种基于概率论的生成模型,通过不断添加噪声和去噪的过程,最终生成与真实数据分布相似的新数据样本。

文档中提到了两个数据集,分别是:

  • Fashion-MNIST 数据集: 这是一个由 Zalando 提供的服装图片数据集,包含 10 个类别,每个类别 7,000 张图片,图片大小为 28x28。该数据集用于训练扩散模型,并生成新的服装图片。
  • ImageNet 数据集: 这是一个由斯坦福大学提供的图像数据集,包含 1,000 个类别,每个类别数百万张图片。文档中提到使用 ImageNet 数据集进行实验,展示了扩散模型正向添加噪声的过程。

简单的例子

想象一下,我们想要生成新的猫猫图片。扩散模型会先随机选择一张真实的猫猫图片,然后逐步添加噪声,使其变得越来越模糊,直到完全变成一团噪声。接下来,模型会学习如何从这个噪声中恢复出猫猫图片的细节,最终生成一张新的猫猫图片,看起来就像是从真实数据中抽取的一样。

算法解决的问题

扩散模型主要解决的是数据生成问题,它可以生成与真实数据分布相似的新数据样本,这在图像生成、音频生成、视频生成等领域都有广泛的应用。

类似的算法

  • 生成对抗网络 (GANs): GANs 通过训练一个生成器和一个判别器,使生成器能够生成逼真的数据样本。但 GANs 难以训练,容易出现模式崩溃等问题。
  • 变分自编码器 (VAEs): VAEs 通过学习数据分布的潜在表示,并从中采样生成新的数据样本。但 VAEs 生成的样本质量通常不如 GANs。

代码实现

代码主要实现了以下功能:

  1. 构建 U-Net 网络结构: U-Net 是一种卷积神经网络,用于预测添加到噪声图像中的噪声。
  2. 定义扩散过程: 扩散过程包括正向扩散(添加噪声)和逆向扩散(去噪)两个步骤。
  3. 定义损失函数: 损失函数用于衡量预测噪声和真实噪声之间的差异。
  4. 训练模型: 使用梯度下降法训练 U-Net 模型,使其能够更好地预测噪声。
  5. 生成新数据: 从噪声中采样并逐步去噪,最终生成新的数据样本。

代码解释

代码较长,简单说明几个关键步骤:

  • 定义 U-Net 模型: 代码中定义了 Unet 类,它包含多个卷积层、注意力模块和残差连接。
  • 定义扩散过程: 代码中定义了 q_sample 函数,用于根据噪声水平和真实图像生成噪声图像。
  • 定义损失函数: 代码中定义了 p_losses 函数,它计算预测噪声和真实噪声之间的 Huber 损失。
  • 训练模型: 代码中使用梯度下降法训练 U-Net 模型,使其能够更好地预测噪声。
  • 生成新数据: 代码中使用 sample 函数从噪声中采样并逐步去噪,最终生成新的数据样本。

医学图像中的应用

扩散模型在医学图像中也有潜在的应用,例如:

  • 医学图像生成: 可以生成新的医学图像,用于训练医学诊断模型或进行医学研究。
  • 医学图像修复: 可以修复医学图像中的缺失或损坏部分,提高医学图像的质量。
  • 医学图像分割: 可以将医学图像中的不同组织或器官分割出来,用于医学诊断或治疗。

研究进展

目前,扩散模型在医学图像中的应用还处于起步阶段,但已经有学者开始探索其在医学图像生成和修复等方面的应用。

个人研究方向

  • 探索更先进的扩散模型架构: 例如,可以尝试使用更复杂的网络结构或注意力机制,以提高模型生成医学图像的质量。
  • 研究扩散模型在特定医学图像上的应用: 例如,可以研究扩散模型在生成特定类型医学图像(如 MRI、CT 等)上的效果。
  • 将扩散模型与其他医学图像分析技术结合: 例如,可以将扩散模型与深度学习模型或其他图像处理技术结合,以提高医学图像分析的性能。

详细代码和文档:

【腾讯文档】Diffusion扩散模型2
https://docs.qq.com/pdf/DUmtGRlZJd1FKR3FW?

%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14

# 查看当前 mindspore 版本
!pip show mindspore

import math
from functools import partial
%matplotlib inline
import matplotlib.pyplot as plt
from tqdm.auto import tqdm
import numpy as np
from multiprocessing import cpu_count
from download import download

import mindspore as ms
import mindspore.nn as nn
import mindspore.ops as ops
from mindspore import Tensor, Parameter
from mindspore import dtype as mstype
from mindspore.dataset.vision import Resize, Inter, CenterCrop, ToTensor, RandomHorizontalFlip, ToPIL
from mindspore.common.initializer import initializer
from mindspore.amp import DynamicLossScaler

ms.set_seed(0)


def rearrange(head, inputs):
    b, hc, x, y = inputs.shape
    c = hc // head
    return inputs.reshape((b, head, c, x * y))

def rsqrt(x):
    res = ops.sqrt(x)
    return ops.inv(res)

def randn_like(x, dtype=None):
    if dtype is None:
        dtype = x.dtype
    res = ops.standard_normal(x.shape).astype(dtype)
    return res

def randn(shape, dtype=None):
    if dtype is None:
        dtype = ms.float32
    res = ops.standard_normal(shape).astype(dtype)
    return res

def randint(low, high, size, dtype=ms.int32):
    res = ops.uniform(size, Tensor(low, dtype), Tensor(high, dtype), dtype=dtype)
    return res

def exists(x):
    return x is not None

def default(val, d):
    if exists(val):
        return val
    return d() if callable(d) else d

def _check_dtype(d1, d2):
    if ms.float32 in 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值