基于pytorch,帮我编写一个生成时序数据的GAN模型,噪声用正态分布的噪声,并帮我每行都标上注释
时间: 2024-03-23 15:42:19 浏览: 69
使用python实现时间序列白噪声检验方式
5星 · 资源好评率100%
好的,以下是一个基于 PyTorch 的生成时序数据的 GAN 模型,使用正态分布的噪声:
```python
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
# 定义数据维度和噪声维度
data_dim = 1
noise_dim = 10
# 定义生成器模型
class Generator(nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.fc1 = nn.Linear(noise_dim, 64) # 输入层 -> 隐藏层
self.fc2 = nn.Linear(64, 128) # 隐藏层 -> 隐藏层
self.fc3 = nn.Linear(128, data_dim) # 隐藏层 -> 输出层
def forward(self, z):
x = torch.relu(self.fc1(z)) # 输入层 -> 隐藏层,激活函数为 ReLU
x = torch.relu(self.fc2(x)) # 隐藏层 -> 隐藏层,激活函数为 ReLU
x = self.fc3(x) # 隐藏层 -> 输出层,不需要激活函数
return x
# 定义判别器模型
class Discriminator(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
self.fc1 = nn.Linear(data_dim, 64) # 输入层 -> 隐藏层
self.fc2 = nn.Linear(64, 128) # 隐藏层 -> 隐藏层
self.fc3 = nn.Linear(128, 1) # 隐藏层 -> 输出层
def forward(self, x):
x = torch.relu(self.fc1(x)) # 输入层 -> 隐藏层,激活函数为 ReLU
x = torch.relu(self.fc2(x)) # 隐藏层 -> 隐藏层,激活函数为 ReLU
x = torch.sigmoid(self.fc3(x)) # 隐藏层 -> 输出层,激活函数为 Sigmoid
return x
# 创建生成器和判别器的实例
generator = Generator()
discriminator = Discriminator()
# 定义损失函数和优化器
loss_fn = nn.BCELoss()
optimizer_G = torch.optim.Adam(generator.parameters(), lr=0.001)
optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=0.001)
# 定义数据生成函数
def generate_real_data(n_samples):
x = np.linspace(0, 2*np.pi, n_samples)
y = np.sin(x) + np.random.normal(0, 0.1, n_samples)
return y.reshape(-1, data_dim).astype(np.float32)
# 定义生成器的输入噪声生成函数
def generate_noise(n_samples):
return torch.randn(n_samples, noise_dim)
# 定义训练函数
def train(generator, discriminator, loss_fn, optimizer_G, optimizer_D, n_epochs, batch_size):
for epoch in range(n_epochs):
# 生成真实数据和噪声数据
real_data = torch.from_numpy(generate_real_data(batch_size))
noise_data = generate_noise(batch_size)
# 训练判别器
optimizer_D.zero_grad()
# 计算判别器对真实数据的损失
real_preds = discriminator(real_data)
real_loss = loss_fn(real_preds, torch.ones_like(real_preds))
# 计算判别器对生成数据的损失
fake_data = generator(noise_data)
fake_preds = discriminator(fake_data)
fake_loss = loss_fn(fake_preds, torch.zeros_like(fake_preds))
# 计算判别器的总损失并反向传播
total_loss = real_loss + fake_loss
total_loss.backward()
optimizer_D.step()
# 训练生成器
optimizer_G.zero_grad()
# 生成数据并计算生成器的损失
fake_data = generator(noise_data)
fake_preds = discriminator(fake_data)
g_loss = loss_fn(fake_preds, torch.ones_like(fake_preds))
# 反向传播并更新参数
g_loss.backward()
optimizer_G.step()
# 打印损失值
if epoch % 100 == 0:
print("Epoch [{}/{}], d_loss: {:.4f}, g_loss: {:.4f}"
.format(epoch, n_epochs, total_loss.item(), g_loss.item()))
# 训练模型并生成数据
n_epochs = 1000
batch_size = 32
train(generator, discriminator, loss_fn, optimizer_G, optimizer_D, n_epochs, batch_size)
# 生成数据并可视化
n_samples = 100
noise_data = generate_noise(n_samples)
generated_data = generator(noise_data).detach().numpy()
plt.plot(generate_real_data(n_samples), label='real data')
plt.plot(generated_data, label='generated data')
plt.legend()
plt.show()
```
这个模型包含两个神经网络:生成器和判别器。生成器从一个随机噪声向量中生成数据,判别器将输入的数据判别为真实数据或生成数据。在训练过程中,我们通过最小化判别器的损失来让判别器更好地区分真实数据和生成数据,同时通过最小化生成器的损失来让生成器生成更接近真实数据的数据。最终,我们可以使用生成器生成新的数据,并可视化它与真实数据的对比。
阅读全文