DDPM玩具代码调试过程(三)

1.在zymddpm虚拟环境中,报错:
Traceback (most recent call last):
  File "scripts/train_cifar.py", line 8, in <module>
    from ddpm import script_utils
ModuleNotFoundError: No module named 'ddpm'

和(一)中的解决方法一样,对于zymddpm这个新环境添加环境变量,输入:

export PYTHONPATH=/data/zym/ddpm/DDPM-main:$PYTHONPATH
python scripts/train_cifar.py

2.报错:

Traceback (most recent call last):
  File "scripts/train_cifar.py", line 164, in <module>
    main()
  File "scripts/train_cifar.py", line 29, in main
    run = wandb.init(
AttributeError: module 'wandb' has no attribute 'init'

命令行输入:

pip install wandb

3.运行成功,但中间出现一个fail:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./cifar_train/cifar-10-python.tar.gz
100.0%
Extracting ./cifar_train/cifar-10-python.tar.gz to ./cifar_train
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./cifar_test/cifar-10-python.tar.gz
100.0%
Extracting ./cifar_test/cifar-10-python.tar.gz to ./cifar_test
Traceback (most recent call last):
  File "scripts/train_cifar.py", line 164, in <module>
    main()
  File "scripts/train_cifar.py", line 122, in main
    torch.save(diffusion.state_dict(), model_filename)
  File "/home/zhangyiming/.conda/envs/zymddpm/lib/python3.8/site-packages/torch/serialization.py", line 376, in save
    with _open_file_like(f, 'wb') as opened_file:
  File "/home/zhangyiming/.conda/envs/zymddpm/lib/python3.8/site-packages/torch/serialization.py", line 230, in _open_file_like
    return _open_file(name_or_buffer, mode)
  File "/home/zhangyiming/.conda/envs/zymddpm/lib/python3.8/site-packages/torch/serialization.py", line 211, in __init__
    super(_open_file, self).__init__(open(name, mode))
FileNotFoundError: [Errno 2] No such file or directory: '~/ddpm_logs/cifar-ddpm-2023-09-11-14-36-iteration-1000-model.pth'

这个错误表明在 Python 脚本中,尝试保存 PyTorch 模型权重时遇到了文件路径问题。具体来说,它无法找到指定的文件路径 ~/ddpm_logs/cifar-ddpm-2023-09-11-14-36-iteration-1000-model.pth。如果需要消除这个fail,只需要修改代码中save权重的路径就可以了!

4.运行结果:

5.运行结果说明

Media:展示十张在标准正态分布随机采样的图,经过remove noise之后的结果;比较模糊,因为是玩具代码,代码功能能够基本实现DDPM算法的思想即可;

chart:test_loss和train_loss

gradient:以第一个梯度记录图为例,ups.14.residual_connection.bias指示了录的具体参数的名称。该图记录了模型中的某一层(可能是第14个上采样层)的残差连接(residual connection)的偏置参数(bias)。这允许我们跟踪该特定参数在训练过程中的梯度变化。 这个模块主要是记录模型中某一层的权重与偏置参数的梯度变化。

### DDPM (Diffusion Probabilistic Models) 的实现代码及相关资源 扩散概率模型(Denoising Diffusion Probabilistic Models, DDPM)是一种基于变分自编码器理论的生成模型,其核心思想是通过逐步向数据中添加噪声来学习逆过程中的去噪分布。这种技术近年来因其高质量图像生成能力而备受关注。 #### 官方与社区实现 一种广泛使用的官方实现可以参考 labML 提供的开源项目[^1]。该项目不仅提供了详细的文档说明,还包含了多种深度学习算法的实现,其中包括扩散模型的相关部分。labML 的实现注重可读性和教育意义,适合初学者深入理解模型的工作机制。 对于更具体的 DDPM 实现,GitHub 用户 **yuyongsheng1990** 提供了一个专注于扩散模型的学习仓库[^2]。此仓库涵盖了多个版本的 DDPM 模型及其改进版,例如条件扩散模型和分类引导方法。这些代码通常基于 PyTorch 构建,并附带训练脚本以及预处理工具。 以下是基于上述两个引用的一个简单 DDPM 训练框架示例: ```python import torch from torch import nn from torchvision.utils import save_image class UNet(nn.Module): """定义 U-Net 结构作为 DDPM 中的核心网络""" def __init__(self, channels=3): super(UNet, self).__init__() # 这里省略具体层结构... def forward(self, x, timesteps): return x # 返回预测的噪声 def sample_timesteps(batch_size, max_steps): """随机采样时间步用于训练""" return torch.randint(low=1, high=max_steps, size=(batch_size,)) # 初始化模型和其他组件 model = UNet() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) for epoch in range(num_epochs): for images in dataloader: optimizer.zero_grad() # 前向传播计算损失函数 t = sample_timesteps(images.size(0), T) loss = compute_loss(model, images, t) loss.backward() # 反向传播 optimizer.step() # 更新参数 if epoch % log_interval == 0: print(f'Epoch {epoch}, Loss: {loss.item()}') ``` 以上代码片段展示了如何构建一个基础的 DDPM 训练循环。注意实际应用时可能需要调整超参数并引入更多复杂的正则化手段。 #### 推荐阅读的论文 除了实践外,了解原始理论同样重要。Ho et al. 在《Denoising Diffusion Probabilistic Models》一文中首次提出了经典的 DDPM 方法。该文章详细描述了前向扩散过程、反向生成过程的设计原理及优化技巧。另一篇值得研究的是 Dhariwal 和 Nichol 发表于 NeurIPS 2021 的工作——他们提出的 EDM(Efficient Denoising Model),进一步提升了效率与效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值