网站分为哪几种类型湖州外贸网站建设
2026/5/21 10:35:01 网站建设 项目流程
网站分为哪几种类型,湖州外贸网站建设,wordpress会员页面,广州小程序技术开发知识点回顾#xff1a; #xfeff;#xfeff;对抗生成网络的思想#xff1a;关注损失从何而来#xfeff;#xfeff;#xfeff;生成器、判别器#xfeff;#xfeff;#xfeff;nn.sequential 容器#xff1a;适合于按顺序运算的情况#xff0c;简化前向传播…知识点回顾对抗生成网络的思想关注损失从何而来生成器、判别器nn.sequential 容器适合于按顺序运算的情况简化前向传播写法leakyReLU介绍避免relu 的神经元失活现象ps如果你学有余力对于 gan的损失函数的理解建议去找找视频看看如果只是用没必要学零基础学 GAN从 “造假币” 到代码落地超通俗版先跟你说清楚咱们今天学的 “对抗生成网络GAN” 一点都不玄核心就是两个角色的博弈再加上两个实用的 PyTorch 工具nn.Sequential、LeakyReLU。我会用 “造假币 vs 警察” 的例子贯穿全程代码只写核心逻辑每一行都解释保证你能懂。一、先搞懂GAN 的核心思想 损失从哪来1. GAN 的本质“造假的” 和 “打假的” 互卷想象一个场景造假币的人生成器 G目标是造出和真币一模一样的假币骗过大爷判别器 D。警察大爷判别器 D目标是一眼分清真币和假币绝不被骗。对抗过程造假的越造越像警察越辨越准最后造假的能造出 “以假乱真” 的假币GAN 训练完成。这就是 GAN 的核心生成器和判别器互相 “对着干”各自优化自己最终达到一个平衡。2. 损失Loss“没做好的程度”关键“损失” 就是 “没达到目标的差距”比如你考试想考 100 分只考了 80 分那 “损失” 就是 20 分。GAN 里的损失分两种对应两个角色角色目标损失来源没做好的地方损失越小说明啥判别器 D真币判 1假币判 00 假1 真1. 把真币当成假币判成 02. 把假币当成真币判成 1判别得越准生成器 G让 D 把自己造的假币判成 1D 给假币判的分数离 1 越远损失越大假币造得越像真币举个具体例子警察 D 拿到一张真币却判成了 0以为是假的→ D 的损失变大造假者 G 造的假币被 D 判成了 0.1几乎一眼识破→ G 的损失变大慢慢训练后G 造的假币被 D 判成 0.9快骗过了→ G 的损失变小D 的损失也变小因为 D 对真币判 1对假币判 0.9虽然没完全准但比之前好。总结GAN 的损失就是 “两个角色没完成自己目标的程度”训练的过程就是让两者的损失都慢慢降到合理水平。二、生成器G和判别器D具体干啥还是用 “假币” 例子把两个角色的工作流程说透对应机器学习里的 “数据流程”1. 先明确 “原材料”真币库央行印的真钱对应机器学习里的 “真实样本”比如真实的猫咪图片、手写数字随机数造假者随便画的线条对应 GAN 里的 “噪声”一串随机数字是生成器的输入。2. 生成器G的工作流程输入一堆随机数噪声→ 经过层层处理 → 输出假币和真币长得像的 “假样本”。比如输入 [0.2, 0.5, -0.1] → G 处理后 → 输出一张 “看起来像真钱的假钱”。3. 判别器D的工作流程输入要么是真币真实样本要么是 G 造的假币生成样本→ 经过层层处理 → 输出0~1 之间的数0 肯定假1 肯定真。比如输入真币 → D 输出 0.98几乎确定是真的输入 G 刚造的假币 → D 输出 0.1几乎确定是假的输入 G 训练后的假币 → D 输出 0.5分不清真假了GAN 训练到位了。一句话总结G 拼命 “仿造” 真样本D 拼命 “分辨” 真 / 假样本两者对抗着进步。三、nn.Sequential 容器神经网络的 “流水线”学完 G 和 D接下来学写代码的工具nn.SequentialPyTorch 里的工具。1. 先类比做奶茶的流水线你做奶茶的步骤是加茶底 → 加牛奶 → 加糖 → 加珍珠 → 摇匀。如果不用 “流水线”你得手动一步步写如果用 “流水线Sequential”直接把步骤打包成一个 “奶茶机”按一下就自动做完2. nn.Sequential 的作用神经网络的层是按顺序执行的比如先做线性变换再做激活再做归一化nn.Sequential 就是把这些层 “串起来”形成一个 “神经网络流水线”不用手动写每一层的输入输出简化代码。3. 代码例子对比版假设我们要写一个简单的判别器 D包含 3 层第一层线性变换把输入的 784 个数变成 128 个数第二层激活函数LeakyReLU后面讲第三层线性变换把 128 个数变成 1 个数输出 0~1。不用 Sequential 的写法繁琐import torch import torch.nn as nn # 定义判别器 class Discriminator(nn.Module): def __init__(self): super().__init__() # 定义每层 self.layer1 nn.Linear(784, 128) # 线性层784→128 self.act nn.LeakyReLU(0.01) # 激活层LeakyReLU self.layer2 nn.Linear(128, 1) # 线性层128→1 # 前向传播手动写每一步 def forward(self, x): x self.layer1(x) # 第一步过线性层1 x self.act(x) # 第二步过激活层 x self.layer2(x) # 第三步过线性层2 return x # 测试 d Discriminator() input_data torch.randn(1, 784) # 随机输入模拟一张图片784个像素 output d(input_data) print(output) # 输出一个数判别结果用 Sequential 的写法简洁import torch import torch.nn as nn # 定义判别器用Sequential打包层 class Discriminator(nn.Module): def __init__(self): super().__init__() # 把层按顺序打包成一个“流水线” self.model nn.Sequential( nn.Linear(784, 128), # 第一步线性层 nn.LeakyReLU(0.01), # 第二步激活层 nn.Linear(128, 1) # 第三步线性层 ) # 前向传播直接过流水线 def forward(self, x): return self.model(x) # 测试 d Discriminator() input_data torch.randn(1, 784) output d(input_data) print(output) # 和上面结果一样但代码少了很多核心总结nn.Sequential 就是 “按顺序执行的层容器”适合层与层之间是 “串行” 的情况能大幅简化代码不用手动写每一层的前向传播。四、LeakyReLU让神经元 “不躺平” 的激活函数先搞懂激活函数是干啥的→ 给神经网络加 “非线性”让网络能学复杂的规律比如区分真币和假币的复杂特征。1. 先看 ReLULeakyReLU 的 “前辈”ReLU 是最常用的激活函数规则超简单输入 0 → 输出 输入比如输入 5→5输入 0.8→0.8输入≤0 → 输出 0比如输入 - 3→0输入 - 0.5→0。ReLU 的问题神经元 “躺平失活”比如有个神经元每次输入都是负数比如一直输入 - 2、-1、-5那它永远输出 0相当于 “彻底摆烂不干活了”这个神经元就废了失活再也学不到东西。2. LeakyReLU给 “躺平的神经元” 发低保LeakyReLU 是 ReLU 的改进版规则输入 0 → 输出 输入和 ReLU 一样输入≤0 → 输出 输入 × 一个很小的数比如 0.01比如输入 - 3→-3×0.01-0.03输入 - 0.5→-0.005。类比理解ReLU“工资 0 才上班工资≤0 就彻底旷工一分钱不赚”LeakyReLU“工资≤0 也不旷工拿 0.01 倍的低保很小的钱还是来上班”。这样一来即使神经元输入一直是负数也不会完全 “躺平”还能参与学习避免失活。3. 代码例子直观对比import torch import torch.nn as nn # 定义ReLU和LeakyReLU relu nn.ReLU() leaky_relu nn.LeakyReLU(0.01) # 0.01是“低保系数”常用0.01 # 测试输入包含正数、负数、0 inputs torch.tensor([5, -3, 0, -0.5, 2.8]) # 计算输出 relu_out relu(inputs) leaky_relu_out leaky_relu(inputs) print(输入, inputs) print(ReLU输出, relu_out) # 输出[5., 0., 0., 0., 2.8] print(LeakyReLU输出, leaky_relu_out) # 输出[5.0000, -0.0300, 0.0000, -0.0050, 2.8000]看结果就知道LeakyReLU 对负数输入没有输出 0而是输出了一个很小的负数神经元就不会完全失活了。五、把所有知识点串起来极简 GAN 代码框架现在把生成器、判别器、nn.Sequential、LeakyReLU 整合写一个最简化的 GAN 代码注释超详细零基础能看懂。完整代码复制就能跑import torch import torch.nn as nn import torch.optim as optim # 优化器用来更新网络参数 # ---------------------- 1. 定义生成器G造假币的 ---------------------- class Generator(nn.Module): def __init__(self): super().__init__() # 用Sequential打包生成器的层流水线 self.model nn.Sequential( nn.Linear(100, 256), # 输入100维随机噪声 → 256维 nn.LeakyReLU(0.01), # 激活避免神经元失活 nn.Linear(256, 784), # 输出784维对应28×28的手写数字图片 nn.Tanh() # 把输出限制在[-1,1]方便后续处理 ) def forward(self, x): return self.model(x) # 直接过流水线 # ---------------------- 2. 定义判别器D警察 ---------------------- class Discriminator(nn.Module): def __init__(self): super().__init__() # 用Sequential打包判别器的层流水线 self.model nn.Sequential( nn.Linear(784, 256), # 输入784维图片 → 256维 nn.LeakyReLU(0.01), # 激活避免神经元失活 nn.Linear(256, 1), # 输出1个数判别结果 nn.Sigmoid() # 把输出限制在[0,1]0假1真 ) def forward(self, x): return self.model(x) # 直接过流水线 # ---------------------- 3. 初始化角色 损失函数 优化器 ---------------------- # 初始化生成器和判别器 G Generator() D Discriminator() # 损失函数二分类交叉熵适合判断“真/假” loss_fn nn.BCELoss() # 优化器用来更新G和D的参数让它们慢慢变好 opt_G optim.Adam(G.parameters(), lr0.0002) # G的优化器 opt_D optim.Adam(D.parameters(), lr0.0002) # D的优化器 # ---------------------- 4. 模拟一次训练核心逻辑 ---------------------- # 1. 准备数据真实样本模拟手写数字784维 随机噪声G的输入 real_data torch.randn(1, 784) # 真实样本1个784维 noise torch.randn(1, 100) # 随机噪声1个100维 # 2. 训练判别器D让D分清真/假 fake_data G(noise) # G用噪声生成假样本 d_real_out D(real_data) # D判真实样本 d_fake_out D(fake_data) # D判假样本 # D的损失真样本希望判1假样本希望判0 loss_D loss_fn(d_real_out, torch.ones_like(d_real_out)) \ loss_fn(d_fake_out, torch.zeros_like(d_fake_out)) # 更新D的参数让D更准 opt_D.zero_grad() # 清空梯度 loss_D.backward() # 计算梯度 opt_D.step() # 更新参数 # 3. 训练生成器G让G骗过多D fake_data G(noise) # G重新生成假样本 d_fake_out D(fake_data) # D判新的假样本 # G的损失希望D把假样本判1 loss_G loss_fn(d_fake_out, torch.ones_like(d_fake_out)) # 更新G的参数让G造的假样本更像真的 opt_G.zero_grad() loss_G.backward() opt_G.step() # 打印损失看训练效果 print(判别器损失, loss_D.item()) print(生成器损失, loss_G.item())代码核心解释六、最后总结零基础必记GAN 的思想生成器造假和判别器打假对抗损失是 “没达到目标的差距”D 判错、G 骗不过都算损失生成器 / 判别器G 输随机数出假样本D 输样本出 0~1 的判别结果nn.Sequential神经网络的 “流水线”按顺序串层简化代码LeakyReLUReLU 的改进版负数输入不输出 0避免神经元 “躺平”。你现在不用纠结代码的细节比如优化器、损失函数先记住核心角色和工具的作用后续我们可以一步步细化训练过程。作业对于心脏病数据集对于病人这个不平衡的样本用GAN 来学习并生成病人样本观察不用 GAN 和用 GAN的 F1 分数差异。Mac OS VS Code 实战GAN 解决心脏病数据集不平衡问题零基础版全程适配 Mac 系统Intel/M1/M2/M3 通用代码每行带注释步骤拆到 “复制就能跑” 的程度核心复用今天学的 GAN 思想、生成器 / 判别器、nn.Sequential、LeakyReLU 知识点。核心目标心脏病数据集里 “有心脏病病人” 是少数类“无心脏病健康人” 是多数类 → 用 GAN 生成模拟的病人样本扩充训练集 → 对比 “不用 GAN原始数据” 和 “用 GAN扩充后数据” 的分类 F1 分数F1 是衡量不平衡数据分类效果的核心指标。第一步Mac 环境准备VS Code1. 打开终端Mac 自带Spotlight 搜 “终端”2. 可选但推荐创建虚拟环境避免库版本冲突3. 安装必备库Mac 通用复制到终端回车4. VS Code 准备打开 VS Code → 新建文件夹比如gan_heart_project→ 新建 Python 文件比如gan_heart.py→ 后续代码都写在这里。可选VS Code 安装 Python 插件微软官方的 Python 插件搜 “Python” 安装方便运行代码。第二步数据集准备与预处理核心处理不平衡 标准化数据集说明用 UCI 公开的心脏病数据集不用手动下载代码自动加载标签target1 有心脏病少数类0 无心脏病多数类。代码段 1加载并预处理数据import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import f1_score from sklearn.linear_model import LogisticRegression # 简单分类器易理解 # ---------------------- 1. 加载心脏病数据集 ---------------------- # 自动下载UCI心脏病数据集Mac网络正常即可 url https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data # 定义列名数据集无表头手动指定 columns [ age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal, target ] # 加载数据 df pd.read_csv(url, namescolumns) # ---------------------- 2. 处理缺失值数据集里用?表示缺失 ---------------------- df df.replace(?, np.nan) # 把?换成NaN df df.dropna() # 删掉缺失值行零基础先这么做简单 # ---------------------- 3. 处理标签把target0都算有心脏病统一为1 ---------------------- # 原数据集target是0无、1/2/3/4不同程度心脏病简化为二分类 df[target] df[target].apply(lambda x: 1 if x 0 else 0) # ---------------------- 4. 查看样本不平衡情况关键 ---------------------- print( 原始样本分布 ) print(df[target].value_counts()) # 输出示例0健康约200个1病人约100个明显不平衡 # ---------------------- 5. 划分特征和标签 标准化 ---------------------- # 特征去掉标签列 X df.drop(target, axis1).values # 标签 y df[target].values # 标准化GAN对数值范围敏感必须做 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 所有特征缩放到均值0方差1 # 划分训练集和测试集测试集不用扩充用来评估 X_train, X_test, y_train, y_test train_test_split( X_scaled, y_scaled, test_size0.2, random_state42 # 固定随机数结果可复现 ) # ---------------------- 6. 分离少数类病人样本GAN的训练目标 ---------------------- # 取出训练集中的病人样本y_train1 X_train_patient X_train[y_train 1] print(f\n训练集中病人样本数{len(X_train_patient)}) # 示例约80个第三步构建 GAN 模型复用今天学的知识点核心生成器输入随机噪声输出和特征维度13 维一致的 “模拟病人样本”判别器区分 “真实病人样本” 和 “GAN 生成的假病人样本”。代码段 2构建 GAN生成器 判别器import torch import torch.nn as nn import torch.optim as optim # ---------------------- 1. 定义超参数零基础先不用改 ---------------------- NOISE_DIM 100 # 噪声维度随便选100是常用值 FEATURE_DIM X_train_patient.shape[1] # 特征维度13维 BATCH_SIZE 8 # 批次大小Mac内存小就选8大就选16 EPOCHS 500 # 训练轮数越多生成越像但耗时久 LR 0.0002 # 学习率越小越稳定 # ---------------------- 2. 定义生成器G生成模拟病人样本 ---------------------- # 用今天学的nn.Sequential打包层LeakyReLU避免神经元失活 class Generator(nn.Module): def __init__(self): super().__init__() self.model nn.Sequential( # 输入100维噪声 → 64维隐藏层 nn.Linear(NOISE_DIM, 64), nn.LeakyReLU(0.01), # 低保系数0.01和今天学的一致 # 中间层64→32 nn.Linear(64, 32), nn.LeakyReLU(0.01), # 输出32→13和特征维度一致 nn.Linear(32, FEATURE_DIM) ) def forward(self, x): return self.model(x) # 流水线式前向传播 # ---------------------- 3. 定义判别器D区分真实/生成的病人样本 ---------------------- class Discriminator(nn.Module): def __init__(self): super().__init__() self.model nn.Sequential( # 输入13维特征 → 32维 nn.Linear(FEATURE_DIM, 32), nn.LeakyReLU(0.01), # 中间层32→16 nn.Linear(32, 16), nn.LeakyReLU(0.01), # 输出16→10~1的判别结果 nn.Linear(16, 1), nn.Sigmoid() # 把输出限制在0~1 ) def forward(self, x): return self.model(x) # ---------------------- 4. 初始化GAN 损失函数 优化器 ---------------------- # 初始化生成器和判别器Mac默认用CPU不用改 G Generator() D Discriminator() # 损失函数二分类交叉熵适合真/假判断 loss_fn nn.BCELoss() # 优化器Adam常用且稳定 opt_G optim.Adam(G.parameters(), lrLR) opt_D optim.Adam(D.parameters(), lrLR) # 把病人样本转成PyTorch张量GAN需要张量格式 X_patient_tensor torch.tensor(X_train_patient, dtypetorch.float32)第四步训练 GAN生成模拟病人样本核心逻辑交替训练判别器D和生成器G和今天学的 “造假币 vs 警察” 逻辑完全一致。代码段 3训练 GAN# ---------------------- 训练GAN主循环 ---------------------- print(\n 开始训练GAN ) for epoch in range(EPOCHS): # ---------------------- 1. 训练判别器D区分真实/假样本 ---------------------- # 步骤1用真实病人样本训练D → 希望D判1 real_labels torch.ones(BATCH_SIZE, 1) # 真实样本标签1 # 随机选一批真实病人样本 idx torch.randint(0, len(X_patient_tensor), (BATCH_SIZE,)) real_samples X_patient_tensor[idx] # D判真实样本 d_real_out D(real_samples) # D的真实样本损失 d_loss_real loss_fn(d_real_out, real_labels) # 步骤2用生成的假样本训练D → 希望D判0 fake_labels torch.zeros(BATCH_SIZE, 1) # 假样本标签0 # 生成随机噪声 noise torch.randn(BATCH_SIZE, NOISE_DIM) # G生成假样本 fake_samples G(noise) # D判假样本detach()不让G的梯度更新只训D d_fake_out D(fake_samples.detach()) # D的假样本损失 d_loss_fake loss_fn(d_fake_out, fake_labels) # 总D损失 更新D参数 d_loss d_loss_real d_loss_fake opt_D.zero_grad() # 清空梯度 d_loss.backward() # 计算梯度 opt_D.step() # 更新参数 # ---------------------- 2. 训练生成器G骗过多D ---------------------- # G生成新的假样本希望D判1 noise torch.randn(BATCH_SIZE, NOISE_DIM) fake_samples G(noise) d_fake_out D(fake_samples) # G的损失希望D把假样本判1 g_loss loss_fn(d_fake_out, real_labels) # 更新G参数 opt_G.zero_grad() g_loss.backward() opt_G.step() # ---------------------- 3. 打印训练进度每50轮打印一次 ---------------------- if (epoch 1) % 50 0: print(f第{epoch1}轮 | D损失{d_loss.item():.4f} | G损失{g_loss.item():.4f}) # ---------------------- 生成模拟病人样本训练完GAN后 ---------------------- # 生成多少个补到和健康样本数量差不多比如原始病人80个生成120个凑200个 num_generate len(X_train[y_train 0]) - len(X_train[y_train 1]) # 生成随机噪声 noise torch.randn(num_generate, NOISE_DIM) # G生成模拟病人样本转成numpy数组 generated_patients G(noise).detach().numpy() print(f\n GAN生成完成 ) print(f生成的模拟病人样本数{len(generated_patients)})第五步数据扩充 对比 F1 分数核心把 “原始健康样本 生成的病人样本” 组成新训练集对比原始数据和扩充数据的 F1 分数。代码段 4评估 F1 分数# ---------------------- 1. 构建扩充后的训练集 ---------------------- # 原始训练集健康样本y_train0 X_train_healthy X_train[y_train 0] y_train_healthy y_train[y_train 0] # 扩充后训练集原始健康样本 生成的病人样本 原始病人样本 X_train_aug np.concatenate([X_train_healthy, generated_patients, X_train_patient]) y_train_aug np.concatenate([ y_train_healthy, np.ones(len(generated_patients)), # 生成的样本标签1 np.ones(len(X_train_patient)) # 原始病人标签1 ]) print(\n 扩充后训练集分布 ) print(f健康样本数{len(X_train_healthy)}) print(f病人样本数原始生成{len(X_train_patient) len(generated_patients)}) # ---------------------- 2. 训练分类器并计算F1 ---------------------- # 定义简单的分类器逻辑回归零基础易理解 clf LogisticRegression(random_state42) # 情况1不用GAN原始数据训练 clf.fit(X_train, y_train) y_pred_original clf.predict(X_test) f1_original f1_score(y_test, y_pred_original) # 情况2用GAN扩充后数据训练 clf.fit(X_train_aug, y_train_aug) y_pred_aug clf.predict(X_test) f1_aug f1_score(y_test, y_pred_aug) # ---------------------- 3. 输出对比结果 ---------------------- print(\n F1分数对比 ) print(f不用GAN的F1分数{f1_original:.4f}) print(f用GAN的F1分数{f1_aug:.4f}) # 可视化对比可选更直观 import matplotlib.pyplot as plt plt.figure(figsize(8, 4)) plt.bar([不用GAN, 用GAN], [f1_original, f1_aug], color[red, green]) plt.ylabel(F1分数) plt.title(心脏病数据集F1分数对比越高越好) plt.ylim(0, 1) # F1范围0~1 plt.show()第六步Mac 下运行代码关键把上面所有代码段合并到gan_heart.py文件中按顺序拼接打开终端 → 进入代码所在文件夹比如cd ~/Desktop/gan_heart_project确保虚拟环境已激活终端开头有(gan_heart)运行代码预期结果解释原始数据的 F1 分数较低比如 0.6~0.7因为样本不平衡分类器偏向多数类健康人容易漏判病人用 GAN 扩充后F1 分数会提升比如 0.75~0.85因为病人样本变多分类器能更好地识别病人如果 F1 提升不明显可以调大EPOCHS比如 1000或BATCH_SIZE比如 16或换更复杂的生成器 / 判别器结构。零基础常见问题解决Mac 运行时提示 “找不到模块”检查虚拟环境是否激活重新安装对应库比如pip3 install pandas数据下载失败Mac 换个网络比如手机热点或手动下载数据集链接https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data放到代码同文件夹修改加载代码为df pd.read_csv(processed.cleveland.data, namescolumns)内存不足把BATCH_SIZE改小比如 4EPOCHS改小比如 200PyTorch 报错确保安装的是 Mac 版 PyTorch重新执行安装命令核心知识点复用回顾GAN 思想生成器造病人样本vs 判别器辨真假病人样本损失来自 “判别器判错” 或 “生成器骗不过”生成器 / 判别器生成器输入噪声输出假样本判别器输入样本输出 0~1 判别结果nn.Sequential把线性层、LeakyReLU 按顺序打包简化前向传播LeakyReLU在生成器 / 判别器中都用了避免神经元失活让 GAN 训练更稳定。浙大疏锦行

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询