微信网站开发怎么做,山东省建设工程协会网站,一键查询个人房产,学网站开发培训对抗生成网络 知识点回顾#xff1a; 对抗生成网络的思想#xff1a;关注损失从何而来生成器、判别器nn.sequential容器#xff1a;适合于按顺序运算的情况#xff0c;简化前向传播写法leakyReLU介绍#xff1a;避免relu的神经元失活现象 对抗生成网络#xff08;GAN 对抗生成网络的思想关注损失从何而来生成器、判别器nn.sequential容器适合于按顺序运算的情况简化前向传播写法leakyReLU介绍避免relu的神经元失活现象 对抗生成网络GAN 知识点回顾 对抗生成网络的思想 思想就像在餐厅中有一个厨师生成器负责制作假菜一个评论家判别器负责区分真菜和假菜。厨师的目标是制作出评论家无法区分的假菜而评论家的目标是找出假菜。通过不断的对抗训练厨师的厨艺生成器的生成能力和评论家的鉴赏力判别器的判别能力都会不断提高。 对抗生成网络GAN由两个模型组成生成器和判别器。生成器的目标是生成尽可能真实的样本而判别器的目标是区分真实样本和生成样本。两者通过对抗训练不断优化最终达到纳什均衡。 损失来源GAN 的损失函数来自生成器和判别器之间的对抗。判别器的损失来自于它对真实样本和生成样本的误判生成器的损失来自于它生成的样本被判别器识别为假样本。 生成器和判别器 生成器厨师负责制作假菜目标是让评论家无法区分真假菜。类似于一个“伪造者”负责生成尽可能真实的样本。 判别器评论家负责区分真菜和假菜目标是找出所有的假菜。类似于一个“警察”负责区分真实样本和生成样本。 nn.Sequential 容器 定义nn.Sequential 是一个顺序容器用于按顺序堆叠多个神经网络层。这简化了前向传播的写法适合于层与层之间按顺序运算的情况。 LeakyReLU 介绍 定义就像是餐厅的菜谱按顺序列出每个烹饪步骤简化了厨师的烹饪流程。LeakyReLU 是 ReLU 的变种允许一小部分梯度通过避免神经元失活现象。类似于在烹饪过程中允许某些食材保留一定的原始风味避免某些食材完全失活从而丰富菜品的层次感。 公式LeakyReLU(x) max(0.01 * x, x)其中 0.01 是负斜率。 作业 对于心脏病数据集对于病人这个不平衡的样本用 GAN 来学习并生成病人样本观察不用 GAN 和用 GAN 的 F1 分数差异 步骤 数据准备加载心脏病数据集处理数据以适应 GAN 的输入要求。 定义生成器和判别器使用 nn.Sequential 定义生成器和判别器。 训练 GAN通过对抗训练生成器和判别器。 数据增强使用生成器生成额外的病人样本增加数据集的多样性。 模型训练使用原始数据集和增强后的数据集分别训练分类模型比较 F1 分数。 import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score
from sklearn.impute import SimpleImputer# 加载数据
df pd.read_csv(heart.csv)# 特征和标签分离
X df.drop(target, axis1)
y df[target]# 检查缺失值
print(原始数据集中缺失值情况)
print(df.isnull().sum())# 使用SimpleImputer填补缺失值
imp SimpleImputer(missing_valuesnp.nan, strategymean)
X_imputed imp.fit_transform(X)# 将数据分为病人和健康人
X_patients X_imputed[y 1]
X_healthy X_imputed[y 0]# 特征标准化
scaler StandardScaler()
X_patients scaler.fit_transform(X_patients)
X_healthy scaler.transform(X_healthy)# 将数据转换为PyTorch张量
X_patients_tensor torch.tensor(X_patients, dtypetorch.float32)
X_healthy_tensor torch.tensor(X_healthy, dtypetorch.float32)# 定义生成器
generator nn.Sequential(nn.Linear(100, 128),nn.ReLU(),nn.Linear(128, 256),nn.ReLU(),nn.Linear(256, X_patients.shape[1]),nn.Tanh()
)# 定义判别器
discriminator nn.Sequential(nn.Linear(X_patients.shape[1], 256),nn.LeakyReLU(0.2),nn.Linear(256, 128),nn.LeakyReLU(0.2),nn.Linear(128, 1),nn.Sigmoid()
)# 定义损失函数和优化器
criterion nn.BCELoss()
lr 0.0002
optimizer_g optim.Adam(generator.parameters(), lrlr)
optimizer_d optim.Adam(discriminator.parameters(), lrlr)# 训练 GAN
num_epochs 1000
batch_size 32for epoch in range(num_epochs):# 训练判别器# 真实样本real_data X_patients_tensor[torch.randint(0, X_patients_tensor.shape[0], (batch_size,))]real_labels torch.ones(batch_size, 1)d_real_loss criterion(discriminator(real_data), real_labels)# 生成样本noise torch.randn(batch_size, 100)fake_data generator(noise)fake_labels torch.zeros(batch_size, 1)d_fake_loss criterion(discriminator(fake_data.detach()), fake_labels)# 总损失和优化d_loss d_real_loss d_fake_lossoptimizer_d.zero_grad()d_loss.backward()optimizer_d.step()# 训练生成器noise torch.randn(batch_size, 100)fake_data generator(noise)g_loss criterion(discriminator(fake_data), real_labels)optimizer_g.zero_grad()g_loss.backward()optimizer_g.step()if epoch % 100 0:print(fEpoch [{epoch}/{num_epochs}] | D Loss: {d_loss.item():.4f} | G Loss: {g_loss.item():.4f})# 生成额外的病人样本
num_new_samples 100
noise torch.randn(num_new_samples, 100)
generated_samples generator(noise).detach().numpy()# 反标准化生成的样本
generated_samples scaler.inverse_transform(generated_samples)# 将生成的样本添加到原始数据集中
X_generated pd.DataFrame(generated_samples, columnsdf.columns[:-1])
y_generated pd.Series([1] * num_new_samples, nametarget)# 合并原始数据集和生成的数据集
X_augmented pd.concat([df, X_generated])
y_augmented pd.concat([y, y_generated])# 使用 SimpleImputer 填补增强数据集中的缺失值
X_augmented_imputed imp.transform(X_augmented)# 使用原始数据集训练模型
X_train, X_test, y_train, y_test train_test_split(X_imputed, y, test_size0.2, random_state42)
model LogisticRegression()
model.fit(X_train, y_train)
y_pred model.predict(X_test)
f1_original f1_score(y_test, y_pred)# 使用增强后的数据集训练模型
X_augmented_train, X_augmented_test, y_augmented_train, y_augmented_test train_test_split(X_augmented_imputed, y_augmented, test_size0.2, random_state42)
model_augmented LogisticRegression()
model_augmented.fit(X_augmented_train, y_augmented_train)
y_augmented_pred model_augmented.predict(X_augmented_test)
f1_augmented f1_score(y_augmented_test, y_augmented_pred)print(fOriginal F1 Score: {f1_original:.4f})
print(fAugmented F1 Score: {f1_augmented:.4f}) import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score
from sklearn.impute import SimpleImputer# 加载数据
df pd.read_csv(heart.csv)# 特征和标签分离
X df.drop(target, axis1)
y df[target]# 检查缺失值
print(原始数据集中缺失值情况)
print(df.isnull().sum())# 使用 SimpleImputer 填补缺失值
imp SimpleImputer(missing_valuesnp.nan, strategymean)
X_imputed imp.fit_transform(X)# 将数据分为病人和健康人
X_patients X_imputed[y 1]
X_healthy X_imputed[y 0]# 特征标准化
scaler StandardScaler()
X_patients scaler.fit_transform(X_patients)
X_healthy scaler.transform(X_healthy)# 将数据转换为 PyTorch 张量
X_patients_tensor torch.tensor(X_patients, dtypetorch.float32)
X_healthy_tensor torch.tensor(X_healthy, dtypetorch.float32)# 定义生成器
generator nn.Sequential(nn.Linear(100, 128),nn.ReLU(),nn.Linear(128, 256),nn.ReLU(),nn.Linear(256, X_patients.shape[1]),nn.Tanh()
)# 定义判别器
discriminator nn.Sequential(nn.Linear(X_patients.shape[1], 256),nn.LeakyReLU(0.2),nn.Linear(256, 128),nn.LeakyReLU(0.2),nn.Linear(128, 1),nn.Sigmoid()
)# 定义损失函数和优化器
criterion nn.BCELoss()
lr 0.0002
optimizer_g optim.Adam(generator.parameters(), lrlr)
optimizer_d optim.Adam(discriminator.parameters(), lrlr)# 训练 GAN
num_epochs 1000
batch_size 32for epoch in range(num_epochs):# 训练判别器# 真实样本real_data X_patients_tensor[torch.randint(0, X_patients_tensor.shape[0], (batch_size,))]real_labels torch.ones(batch_size, 1)d_real_loss criterion(discriminator(real_data), real_labels)# 生成样本noise torch.randn(batch_size, 100)fake_data generator(noise)fake_labels torch.zeros(batch_size, 1)d_fake_loss criterion(discriminator(fake_data.detach()), fake_labels)# 总损失和优化d_loss d_real_loss d_fake_lossoptimizer_d.zero_grad()d_loss.backward()optimizer_d.step()# 训练生成器noise torch.randn(batch_size, 100)fake_data generator(noise)g_loss criterion(discriminator(fake_data), real_labels)optimizer_g.zero_grad()g_loss.backward()optimizer_g.step()if epoch % 100 0:print(fEpoch [{epoch}/{num_epochs}] | D Loss: {d_loss.item():.4f} | G Loss: {g_loss.item():.4f})# 生成额外的病人样本
num_new_samples 100
noise torch.randn(num_new_samples, 100)
generated_samples generator(noise).detach().numpy()# 反标准化生成的样本
generated_samples scaler.inverse_transform(generated_samples)# 将生成的样本转换为 DataFrame
generated_df pd.DataFrame(generated_samples, columnsX.columns)# 合并原始数据集和生成的数据集
augmented_df pd.concat([df, generated_df])
augmented_df[target] pd.concat([y, pd.Series([1] * num_new_samples)])# 使用 SimpleImputer 填补增强数据集中的缺失值
augmented_imputer SimpleImputer(missing_valuesnp.nan, strategymean)
augmented_imputer.fit(X) # 使用原始特征来拟合
X_augmented_imputed augmented_imputer.transform(augmented_df.drop(target, axis1))# 使用原始数据集训练模型
X_train, X_test, y_train, y_test train_test_split(X_imputed, y, test_size0.2, random_state42)
model LogisticRegression()
model.fit(X_train, y_train)
y_pred model.predict(X_test)
f1_original f1_score(y_test, y_pred)# 使用增强后的数据集训练模型
X_augmented_train, X_augmented_test, y_augmented_train, y_augmented_test train_test_split(X_augmented_imputed, augmented_df[target], test_size0.2, random_state42)
model_augmented LogisticRegression()
model_augmented.fit(X_augmented_train, y_augmented_train)
y_augmented_pred model_augmented.predict(X_augmented_test)
f1_augmented f1_score(y_augmented_test, y_augmented_pred)print(fOriginal F1 Score: {f1_original:.4f})
print(fAugmented F1 Score: {f1_augmented:.4f}) ps如果你学有余力对于gan的损失函数的理解建议去找找视频看看如果只是用没必要学 浙大疏锦行