当前位置: 首页 > news >正文

Python训练营打卡 Day53

对抗生成网络

知识点回顾:

  1. 对抗生成网络的思想:关注损失从何而来
  2. 生成器、判别器
  3. nn.sequential容器:适合于按顺序运算的情况,简化前向传播写法
  4. leakyReLU介绍:避免relu的神经元失活现象

对抗生成网络(GAN)

知识点回顾
  1. 对抗生成网络的思想

    • 思想:就像在餐厅中,有一个厨师(生成器)负责制作假菜,一个评论家(判别器)负责区分真菜和假菜。厨师的目标是制作出评论家无法区分的假菜,而评论家的目标是找出假菜。通过不断的对抗训练,厨师的厨艺(生成器的生成能力)和评论家的鉴赏力(判别器的判别能力)都会不断提高。

    • 对抗生成网络(GAN)由两个模型组成:生成器和判别器。生成器的目标是生成尽可能真实的样本,而判别器的目标是区分真实样本和生成样本。两者通过对抗训练不断优化,最终达到纳什均衡。

    • 损失来源:GAN 的损失函数来自生成器和判别器之间的对抗。判别器的损失来自于它对真实样本和生成样本的误判,生成器的损失来自于它生成的样本被判别器识别为假样本。

  2. 生成器和判别器

    • 生成器:厨师,负责制作假菜,目标是让评论家无法区分真假菜。类似于一个“伪造者”,负责生成尽可能真实的样本。

    • 判别器:评论家,负责区分真菜和假菜,目标是找出所有的假菜。类似于一个“警察”,负责区分真实样本和生成样本。

  3. nn.Sequential 容器

    • 定义nn.Sequential 是一个顺序容器,用于按顺序堆叠多个神经网络层。这简化了前向传播的写法,适合于层与层之间按顺序运算的情况。

  4. LeakyReLU 介绍

    • 定义:就像是餐厅的菜谱,按顺序列出每个烹饪步骤,简化了厨师的烹饪流程。LeakyReLU 是 ReLU 的变种,允许一小部分梯度通过,避免神经元失活现象。类似于在烹饪过程中,允许某些食材保留一定的原始风味,避免某些食材完全失活,从而丰富菜品的层次感。

    • 公式LeakyReLU(x) = max(0.01 * x, x),其中 0.01 是负斜率。

作业
  1. 对于心脏病数据集,对于病人这个不平衡的样本用 GAN 来学习并生成病人样本,观察不用 GAN 和用 GAN 的 F1 分数差异

    • 步骤

      1. 数据准备:加载心脏病数据集,处理数据以适应 GAN 的输入要求。

      2. 定义生成器和判别器:使用 nn.Sequential 定义生成器和判别器。

      3. 训练 GAN:通过对抗训练生成器和判别器。

      4. 数据增强:使用生成器生成额外的病人样本,增加数据集的多样性。

      5. 模型训练:使用原始数据集和增强后的数据集分别训练分类模型,比较 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', axis=1)
y = df['target']# 检查缺失值
print("原始数据集中缺失值情况:")
print(df.isnull().sum())# 使用SimpleImputer填补缺失值
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
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, dtype=torch.float32)
X_healthy_tensor = torch.tensor(X_healthy, dtype=torch.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(), lr=lr)
optimizer_d = optim.Adam(discriminator.parameters(), lr=lr)# 训练 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(f'Epoch [{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, columns=df.columns[:-1])
y_generated = pd.Series([1] * num_new_samples, name='target')# 合并原始数据集和生成的数据集
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_size=0.2, random_state=42)
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_size=0.2, random_state=42)
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(f'Original F1 Score: {f1_original:.4f}')
print(f'Augmented 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', axis=1)
y = df['target']# 检查缺失值
print("原始数据集中缺失值情况:")
print(df.isnull().sum())# 使用 SimpleImputer 填补缺失值
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
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, dtype=torch.float32)
X_healthy_tensor = torch.tensor(X_healthy, dtype=torch.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(), lr=lr)
optimizer_d = optim.Adam(discriminator.parameters(), lr=lr)# 训练 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(f'Epoch [{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, columns=X.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_values=np.nan, strategy='mean')
augmented_imputer.fit(X)  # 使用原始特征来拟合
X_augmented_imputed = augmented_imputer.transform(augmented_df.drop('target', axis=1))# 使用原始数据集训练模型
X_train, X_test, y_train, y_test = train_test_split(X_imputed, y, test_size=0.2, random_state=42)
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_size=0.2, random_state=42)
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(f'Original F1 Score: {f1_original:.4f}')
print(f'Augmented F1 Score: {f1_augmented:.4f}')

ps;如果你学有余力对于gan的损失函数的理解,建议去找找视频看看,如果只是用,没必要学

@浙大疏锦行

http://www.xdnf.cn/news/1028197.html

相关文章:

  • 华为数字化转型进阶——精读188页华为EBPM数字化全要素流程管理方法论【附全文阅读】
  • rocketmq producer和consumer连接不同的集群,如何隔离
  • 渗透实战:利用XSS获取cookie和密码
  • JDBC基础关键_002_JDBC 增删改
  • ​​Promise代码理解
  • 如何通过Python从DEM文件生成坡度和坡向数据
  • 读取OpenFOAM二进制polyMesh格式的C/C++程序
  • 手搓中文字符编程语言
  • 一文掌握 Windows 文件传输:5 种命令行工具的原理、参数与示例
  • 中国人工智能证书综合信息表(2025年版)
  • 基于混合预编码的同时进行无线信息和功率传输的毫米波海量MIMO-NOMA
  • 如何确保邮件群发不会被标记为垃圾邮件?
  • 【测试开发】函数高阶-闭包、装饰器
  • P25:LSTM实现糖尿病探索与预测
  • Spring AOP与代理模式
  • 利用 Python 爬虫按关键字搜索 1688 商品
  • mvnd-快速打包maven项目
  • 如何使用自动化测试来提高接口测试的效率
  • 1Panel 618 年中大促|不止半价!
  • 《二叉堆》题集
  • Ubuntu VMware虚拟机卡在/dev/sda1
  • ubuntu调整硬盘大小-使用gparted
  • 板子接入mipi摄像头
  • HTML+CSS 动态菜单和登录框
  • 共建数据强国:政务数据共享的双轮革命
  • 【力扣 简单 C】160. 相交链表
  • C++笔记-C++11(三)
  • 【Spring AI】MCP Server实现多实例部署
  • 【灵动Mini-F5265-OB】ADC之片内温度传感器与参考电压获取
  • springboot+vue大文件断点续传