具有循环条件gan的实值(医疗)时间序列生成-2017

REAL-VALUED (MEDICAL) TIME SERIES GENERATION WITH RECURRENT CONDITIONAL GANS

ABSTRACT

生成对抗网络(GANs)作为一种训练模型以产生逼真数据的框架已经取得了显著的成功。在这项工作中,我们提出了循环GAN (RGAN)和循环条件GAN (RCGAN)来生成真实的实值多维时间序列,重点研究了它们在医疗数据中的应用。rgan在生成器和鉴别器中使用循环神经网络(RNNs)。在rcgan的情况下,这两个rnn都以辅助信息为条件。我们在一组玩具数据集中演示了我们的模型,在其中我们从视觉上和定量上(使用样本似然和最大平均差异)表明它们可以成功地生成现实的时间序列。我们还描述了针对GANs的新颖评估方法,其中我们生成一个合成标记的训练数据集,并在真实测试集上评估在合成数据上训练的模型的性能,反之亦然。我们用这些指标说明rcgan可以生成对监督训练有用的时间序列数据,而在实际测试数据上的性能仅略有下降。这是通过“序列化”MNIST的数字分类和对来自重症监护室的17,000名患者的医疗数据集进行早期预警系统训练来证明的。我们进一步讨论和分析了使用RCGAN生成真实的合成医疗时间序列数据时可能出现的隐私问题,并演示了RCGAN的差异私人训练的结果。

1 INTRODUCTION

在针对特定领域问题开发机器学习解决方案的过程中,访问数据是瓶颈之一。标准数据集(与相关任务)的可用性有助于提高学习系统在多个任务中的能力。然而,在其他领域,如医学,进展似乎滞后。人们很容易认为医学领域的任务更难——数据更复杂,噪音更大,预测问题的定义更不明确。尽管如此,研究人员获取数据的缺乏阻碍了模型比较、可重复性和最终的科学进步。然而,由于医疗数据的高度敏感性,其访问通常是高度控制的,或需要涉及和可能不完善的去识别。因此,这项工作的动机是利用和开发生成对抗网络(GANs)的框架来生成真实的合成医疗数据。这些数据可以在没有隐私问题的情况下共享和发布,甚至可以用于增加或丰富在不同或较小的患者队列中收集的类似数据集。此外,构建一个能够合成真实医疗数据的系统意味着对生成这些信息的过程进行建模,因此它可以代表开发在医疗环境中创建预测系统的新方法的第一步。

除了对机器学习研究社区的实用之外,这样的工具还有利于医学界在训练模拟器中的使用。在这项工作中,我们专注于合成实值重症监护室(ICU)的时间序列数据。在重症监护室,医生必须在时间压力下迅速做出决定,他们不能犹豫。在医疗培训中,使用模拟来培训医生已经成为标准,但这些模拟往往依赖于手工设计的规则和物理道具。因此,能够生成多样化和现实的ICU情况的模型可以立即应用,特别是当能够根据患者的潜在“状态”进行条件调节时。

GANs在生成逼真图像方面的成功(Radford et al., 2015;Ledig等人,2016;附近,2014;Reed等人,2016)认为它们适用于这项任务,然而有限的工作利用它们来生成时间序列数据。此外,GANs的评估在很大程度上仍然是一个尚未解决的问题,研究人员通常依赖于生成示例的可视化评估,这种方法既不切实际,也不适用于多维医学时间序列。

这项工作的主要贡献是:

1. 演示使用对抗性训练生成实值序列的方法。

2. 展示评估GANs的新方法。

3.生成合成医疗时间序列数据。

4. GANs和差分私有GANs的经验隐私分析。

2 RELATED WORK

自2014年问世以来(Goodfellow et al., 2014), GAN框架吸引了研究界的大量关注,其中大部分工作都集中在图像生成上(Radford et al., 2015;Ledig等人,2016;附近,2014;Reed等人,2016)。值得注意的是,(Choi等人,2017)设计了一种GAN来生成合成电子健康记录(EHR)数据集。这些电子病历包含二进制和计数变量,如ICD-9账单代码、药物和程序代码。他们专注于离散值数据和生成患者快照,这是对我们的实值、时间序列重点的补充。未来的工作可以结合这些方法来生成多模态合成医疗时间序列数据。

大多数使用GAN生成的顺序数据集中在对自然语言处理有用的离散令牌上(Y u等人,2016年),其中使用基于强化学习(RL)的替代方法来训练GAN。我们知道只有一项使用GAN生成连续值序列的初步工作,该工作旨在使用带有LSTM生成器和鉴别器的GAN生成复调音乐(Mogren, 2016)。主要的区别是架构上的:我们不使用双向鉴别器,并且生成器的输出不作为下一个时间步骤的输入反馈。此外,我们还介绍了这个循环GAN的条件版本

条件GANs (Mirza & Osindero, 2014;Gauthier, 2014)根据附加信息调整模型,因此允许我们指导数据生成过程。这种方法主要用于图像生成任务(Radford et al., 2015;米尔扎和奥辛德罗,2014年;Antipov等人,2017)。最近,有条件GAN架构也被用于自然语言处理,包括翻译(Yang等人,2017)和对话生成(Li等人,2017),其中没有一个使用RNN作为鉴别器的首选,并且如前所述,由于数据的离散性,使用RL方法来训练模型。

在这项工作中,我们还介绍了一些新的方法来评估GANs,使用生成的合成数据的能力来训练有监督的模型。以相关的方式,在(Salimans et al., 2016)中引入了一种基于gan的半监督学习方法。然而,我们的目标是生成数据,这些数据可用于训练GAN训练时未知任务的模型。

我们简要探讨了使用差分私有随机梯度下降(Abadi et al., 2016)来生成具有更强隐私保证的RGAN,这与敏感的医疗数据尤其相关。另一种方法是使用PATE方法(Papernot et al., 2016)来训练鉴别器。在这种情况下,不是将噪声引入梯度(如(Abadi et al., 2016)),而是训练学生分类器来预测教师集合的噪声投票,每个教师都在不相交的数据集上进行训练。

3 模型:循环gan和循环条件gan

在这项工作中提出的模型遵循规则GAN的架构,其中生成器和鉴别器都被循环神经网络所取代

<think>好的,我现在需要帮助用户找到关于VAE-GAN用于时间序列生成的VSCode示例代码。首先,我需要回忆一下VAE-GAN的基本结构。VAE-GAN结合了变分自编码器(VAE)和生成对抗网络GAN),通常用于生成数据,比如图像或时间序列时间序列生成可能有不同的应用场景,比如金融预测或传感器数据模拟。 用户要求的是在VSCode中的示例代码,所以我应该提供能够在本地运行的代码,可能需要用到Python和深度学习框架如TensorFlow或PyTorch。考虑到用户提到了VSCode,他们可能已经配置好了开发环境,但可能需要安装一些库,比如torch、numpy、matplotlib等。 接下来,我需要确定如何构建VAE-GAN模型的结构。VAE部分负责编码和解码时间序列数据,而GAN的判别器则评估生成数据的真性。时间序列数据通常是连续的,可能具有时间依赖性,因此模型可能需要使用循环神经网络(RNN)或者一维卷积神经网络(CNN)来处理。 然后,我需要考虑数据准备。用户可能需要一个示例数据集,比如合成的时间序列或公开的数据集(如股票价格、传感器读数)。在代码中,可能需要生成一些虚拟数据作为示例,方便用户运行和测试。 接下来是编写代码的大纲。首先导入必要的库,然后定义VAE的编码器和解码器,GAN生成器和判别器。不过,在VAE-GAN中,通常VAE的解码器也作为GAN生成器。因此,可能需要调整结构,将VAE的解码器输出传递给判别器。 然后是训练循环,这部分需要协调VAE的重建损失和GAN的对抗损失。需要定义优化器,比如Adam,并设置训练循环的迭代次数。同时,可能需要调整超参数,如学习率、潜在空间的维度等。 在代码示例中,可能需要包括数据加载、模型定义、训练过程和生成样本的演示。考虑到用户使用VSCode,代码应该能够在本地执行,并且有清晰的输出,比如生成时间序列图表。 此外,用户可能对代码的依赖库和安装步骤有疑问,所以应该提醒他们安装必要的包,比如torch、numpy等。可能还需要指导如何运行代码,比如在VSCode中打开终端,安装依赖,然后执行脚本。 最后,生成相关问题,帮助用户进一步理解VAE-GAN时间序列中的应用,比如调整超参数、处理多变量时间序列、评估生成质量的方法,以及际应用场景。 需要确保代码符合用户的要求,结构清晰,注释详细,方便用户理解和修改。同时,要检查代码是否存在语法错误,确保在VSCode中可以顺利运行。可能还需要引用相关的文献或资源,帮助用户深入学习和解决问题。</think>### VAE-GAN时间序列生成代码现 以下是基于PyTorch的VAE-GAN时间序列生成示例代码,包含VSCode环境配置说明: ```python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # 生成虚拟时间序列数据 def generate_data(num_samples=1000, seq_length=30): time = np.linspace(0, 5*np.pi, seq_length) data = np.array([np.sin(time + np.random.normal(0, 0.5)) for _ in range(num_samples)]) return torch.FloatTensor(data).unsqueeze(-1) # (batch, seq_len, features) # VAE编码器 class Encoder(nn.Module): def __init__(self, input_dim=1, hidden_dim=64, latent_dim=16): super().__init__() self.rnn = nn.GRU(input_dim, hidden_dim, batch_first=True) self.mu = nn.Linear(hidden_dim, latent_dim) self.logvar = nn.Linear(hidden_dim, latent_dim) def forward(self, x): _, h = self.rnn(x) h = h.squeeze(0) return self.mu(h), self.logvar(h) # 解码器/生成器 class Decoder(nn.Module): def __init__(self, latent_dim=16, hidden_dim=64, output_dim=1): super().__init__() self.rnn = nn.GRUCell(latent_dim, hidden_dim) self.fc = nn.Linear(hidden_dim, output_dim) self.seq_len = 30 def forward(self, z): outputs = [] h = self.rnn(z) for _ in range(self.seq_len): h = self.rnn(z, h) outputs.append(self.fc(h)) return torch.stack(outputs, dim=1) # 判别器 class Discriminator(nn.Module): def __init__(self, input_dim=1, hidden_dim=64): super().__init__() self.rnn = nn.GRU(input_dim, hidden_dim, batch_first=True) self.fc = nn.Linear(hidden_dim, 1) def forward(self, x): _, h = self.rnn(x) return torch.sigmoid(self.fc(h.squeeze(0))) # 训练参数 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") encoder = Encoder().to(device) decoder = Decoder().to(device) discriminator = Discriminator().to(device) opt_vae = torch.optim.Adam(list(encoder.parameters())+list(decoder.parameters()), lr=1e-3) opt_disc = torch.optim.Adam(discriminator.parameters(), lr=1e-4) # 训练循环 for epoch in range(100): real_data = generate_data().to(device) # VAE训练 mu, logvar = encoder(real_data) z = mu + torch.exp(0.5*logvar) * torch.randn_like(logvar) recon = decoder(z) recon_loss = nn.MSELoss()(recon, real_data) kld = -0.5 * torch.mean(1 + logvar - mu.pow(2) - logvar.exp()) # GAN对抗训练 validity_real = discriminator(real_data) validity_fake = discriminator(recon.detach()) d_loss = -torch.mean(torch.log(validity_real + 1e-8) + torch.log(1 - validity_fake + 1e-8)) g_loss = -torch.mean(torch.log(validity_fake + 1e-8)) opt_vae.zero_grad() (recon_loss + kld + g_loss).backward() opt_vae.step() opt_disc.zero_grad() d_loss.backward() opt_disc.step() ``` §§环境配置步骤§§ 1. 在VSCode中新建Python文件 2. 打开集成终端(Ctrl+`) 3. 安装依赖: ```bash pip install torch numpy matplotlib ``` 4. 按F5运行代码 §§关键现要点§§ 1. 使用GRU网络处理时序特征[^3] 2. VAE通过重参数化技巧现随机采样 3. 判别器采用序列特征提取+二分类结构 4. 联合优化重构损失、KL散度和对抗损失 §§示例数据可视化§§ ```python # 生成样本可视化 with torch.no_grad(): z_sample = torch.randn(1, 16).to(device) generated = decoder(z_sample).cpu().numpy()[0,:,0] plt.plot(generated, label='Generated') plt.plot(generate_data(1)[0,:,0], label='Real') plt.legend() plt.show() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值