核心内容摘要
PsychoPy:心理学实验构建的高效解决方案
基于条件生成对抗网络的风光联合场景生成 处理风光不确定性 复现《基于深度卷积生成对抗网络场景生成的间歇式分布式电源优化配置》中的场景生成方法 通过改进的条件深度卷积生成对抗网络模型对 DG 出力的不确定性进行建模并在模型中加入月份标签信息以生成面向规划的风光联合出力场景 我在该文所使用 条件DCGAN方法 的基础上进行了改进采用 基于条件WGAN-GP方法收敛速度和精度都更优独一无二 语言Python 采用PyTorch框架江湖上最近流行用生成对抗网络搞新能源场景生成今天咱们来扒一扒这个基于条件WGAN-GP的改进方案。
先说痛点风光出力那随机性简直让人头秃传统概率模型根本hold不住那些复杂的时空关联。
去年看到有人用条件DCGAN搞这个效果还行但训练总翻车于是我们团队把WGAN-GP的绝活给缝进去了。
基于条件生成对抗网络的风光联合场景生成 处理风光不确定性 复现《基于深度卷积生成对抗网络场景生成的间歇式分布式电源优化配置》中的场景生成方法 通过改进的条件深度卷积生成对抗网络模型对 DG 出力的不确定性进行建模并在模型中加入月份标签信息以生成面向规划的风光联合出力场景 我在该文所使用 条件DCGAN方法 的基础上进行了改进采用 基于条件WGAN-GP方法收敛速度和精度都更优独一无二 语言Python 采用PyTorch框架先看数据怎么喂给模型。
我们给每个样本绑了月份标签这个trick能让生成器明白季节特性。
PyTorch里搞数据加载得这么玩class ScenarioDataset(Dataset): def __init__(self, data_path, label_path): self.power_data torch.load(data_path) # [N, 2, 24]风光联合数据 self.month_labels torch.load(label_path) # [N] 月份标签 def __getitem__(self, idx): return { data: self.power_data[idx], label: F.one_hot(self.month_labels[idx]-1, num_classes
}生成器的门道在条件融合这块。
我们没用简单的concat而是把月份标签做成了可学习的嵌入向量class Generator(nn.Module): def __init__(self): super().__init__() self.label_embed nn.Embedding(12, 24*
self.main nn.Sequential( nn.ConvTranspose1d(10024*2, 512,
, nn.BatchNorm1d(
, nn.ReLU(), nn.ConvTranspose1d(64, 2, 4, padding
, # 输出风光双通道 nn.Tanh()) def forward(self, z, labels): embedded self.label_embed(labels).view(-1, 24*2,
combined torch.cat([z, embedded], dim
return self.main(combined)判别器这边有个骚操作——梯度惩罚GP这是WGAN-GP的灵魂。
咱们来看个有意思的代码段def compute_gradient_penalty(D, real_data, fake_data, labels): alpha torch.rand(real_data.size(
, 1,
interpolates alpha * real_data (1-alpha) * fake_data interpolates.requires_grad_(True) d_interpolates D(interpolates, labels) gradients autograd.grad( outputsd_interpolates, inputsinterpolates, grad_outputstorch.ones_like(d_interpolates), create_graphTrue, retain_graphTrue, only_inputsTrue )[0] return ((gradients.norm(2, dim
-
**
.mean()这个GP项能让训练稳如老狗有效防止模式崩塌。
对比原论文的DCGAN实现咱们的损失函数也大有不同# 判别器损失 d_loss -torch.mean(real_validity) torch.mean(fake_validity) lambda_gp * gp # 生成器损失 g_loss -torch.mean(fake_validity)没有用sigmoid交叉熵而是直接玩均值这也是Wasserstein距离的精髓。
实际训练中发现把学习率调到5e-5判别器迭代5次生成器迭代1次效果最带劲。
最后说说实际效果。
在江苏某地的风光数据集上测试JS散度比原方法降了38%生成场景的时序波动特性跟真实数据肉眼难辨。
更绝的是训练时间从原来的8小时缩到