pytorch写对抗神经网络学习波士顿房价,且数据划分为训练集和测试集
时间: 2024-02-18 08:01:58 浏览: 68
波士顿房价数据集,回归练习使用
好的,我可以为您提供一个基本的对抗经网络学习波士顿房价的代码,以及数据划分为训练集和测试集的方法。
首先,我们需要导入所需的库和数据集。在这个例子中,我们将使用PyTorch和sklearn库来加载波士顿房价数据集。
```python
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
```
接下来,我们需要加载数据集并进行预处理。我们将数据集分为训练集和测试集,并对数据进行标准化处理。
```python
# 加载数据集
data = load_boston()
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
# 标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 转换为 Tensor
X_train = torch.from_numpy(X_train).float()
X_test = torch.from_numpy(X_test).float()
y_train = torch.from_numpy(y_train).float()
y_test = torch.from_numpy(y_test).float()
```
接下来,我们需要定义生成器和判别器模型。生成器模型将随机噪声转换为房价预测值,而判别器模型将预测房价是否属于训练集。
```python
# 定义生成器模型
class Generator(nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.fc1 = nn.Linear(100, 256)
self.fc2 = nn.Linear(256, 512)
self.fc3 = nn.Linear(512, 1)
def forward(self, x):
x = nn.functional.leaky_relu(self.fc1(x))
x = nn.functional.leaky_relu(self.fc2(x))
x = self.fc3(x)
return x
# 定义判别器模型
class Discriminator(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
self.fc1 = nn.Linear(14, 256)
self.fc2 = nn.Linear(256, 512)
self.fc3 = nn.Linear(512, 1)
def forward(self, x):
x = nn.functional.leaky_relu(self.fc1(x))
x = nn.functional.leaky_relu(self.fc2(x))
x = torch.sigmoid(self.fc3(x))
return x
```
接下来,我们需要定义损失函数和优化器。对于生成器和判别器模型,我们将使用二元交叉熵损失函数,优化器则分别为Adam。
```python
# 定义二元交叉熵损失函数
criterion = nn.BCELoss()
# 定义生成器和判别器的优化器
g_optimizer = optim.Adam(generator.parameters(), lr=0.0002)
d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002)
```
最后,我们可以开始训练模型。在每个训练周期中,我们将生成器生成的样本与真实样本一起送入判别器进行判别,然后计算生成器和判别器的损失,并进行反向传播和优化。
```python
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
# 训练判别器
discriminator.zero_grad()
real_data = torch.cat((X_train, y_train.reshape(-1, 1)), dim=1)
fake_data = generator(torch.randn(X_train.shape[0], 100))
d_real = discriminator(real_data)
d_fake = discriminator(fake_data.detach())
d_loss = criterion(d_real, torch.ones_like(d_real)) + criterion(d_fake, torch.zeros_like(d_fake))
d_loss.backward()
d_optimizer.step()
# 训练生成器
generator.zero_grad()
fake_data = generator(torch.randn(X_train.shape[0], 100))
d_fake = discriminator(torch.cat((fake_data, y_train.reshape(-1, 1)), dim=1))
g_loss = criterion(d_fake, torch.ones_like(d_fake))
g_loss.backward()
g_optimizer.step()
# 输出损失
if epoch % 100 == 0:
print('Epoch [{}/{}], d_loss: {:.4f}, g_loss: {:.4f}'.format(
epoch, num_epochs, d_loss.item(), g_loss.item()))
```
最后,我们可以使用训练好的生成器模型来生成新的房价预测值,并使用测试集数据来评估模型的性能。
```python
# 生成新的房价预测值
with torch.no_grad():
fake_data = generator(torch.randn(X_test.shape[0], 100))
y_pred = scaler.inverse_transform(torch.cat((X_test, fake_data), dim=1).numpy())[:, -1]
# 评估模型性能
from sklearn.metrics import r2_score, mean_absolute_error
print('R2 score:', r2_score(y_test, y_pred))
print('Mean absolute error:', mean_absolute_error(y_test, y_pred))
```
这样就完成了一个基本的对抗神经网络学习波士顿房价的代码,并对数据进行了训练集和测试集的划分。
阅读全文