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

上海网站建设公司服务短剧个人主页简介模板

上海网站建设公司服务,短剧个人主页简介模板,网站外链推广工具,网站建设太金手指六六六PyTorch深度学习实战#xff08;31#xff09;——生成对抗网络 0. 前言1. GAN2. GAN 模型分析3. 利用 GAN 模型生成手写数字小结系列链接 0. 前言 生成对抗网络 (Generative Adversarial Networks, GAN) 是一种由两个相互竞争的神经网络组成的深度学习模型#xff0c;它由… PyTorch深度学习实战31——生成对抗网络 0. 前言1. GAN2. GAN 模型分析3. 利用 GAN 模型生成手写数字小结系列链接 0. 前言 生成对抗网络 (Generative Adversarial Networks, GAN) 是一种由两个相互竞争的神经网络组成的深度学习模型它由一个生成网络和一个判别网络组成通过彼此之间的博弈来提高生成网络的性能。生成对抗网络使用神经网络生成与原始图像集非常相似的新图像它在图像生成中应用广泛且 GAN 的相关研究正在迅速发展以生成与真实图像难以区分的逼真图像。在本节中我们将学习 GAN 网络的原理并使用 PyTorch 实现 GAN。 1. GAN 生成对抗网络 (Generative Adversarial Networks, GAN) 包含两个网络生成网络( Generator也称生成器)和判别网络( discriminator也称判别器)。在 GAN 网络训练过程中需要有一个合理的图像样本数据集生成网络从图像样本中学习图像表示然后生成与图像样本相似的图像。判别网络接收(由生成网络)生成的图像和原始图像样本作为输入并将图像分类为原始(真实)图像或生成(伪造)图像。 生成网络的目标是生成逼真的伪造图像骗过判别网络判别网络的目标是将生成的图像分类为伪造图像将原始图像样本分类为真实图像。本质上GAN 中的对抗表示两个网络的相反性质生成网络生成图像来欺骗判别网络判别网络通过判别图像是生成图像还是原始图像来对输入图像进行分类 在上图中生成网络根据输入随机噪声生成图像判别网络接收生成网络生成的图像并将它们与真实图像样本进行比较以判断生成的图像是真实的还是伪造的。生成网络尝试生成尽可能逼真的图像而判别网络尝试判定生成网络生成图像的真实性从而学习生成尽可能逼真的图像。 GAN 的关键思想是生成网络和判别网络之间的竞争和动态平衡通过不断的训练和迭代生成网络和判别网络会逐渐提高性能生成网络能够生成更加逼真的样本而判别网络则能够更准确地区分真实和伪造的样本。 通常生成网络和判别网络交替训练将生成网络和判别网络视为博弈双方并通过两者之间的对抗来推动模型性能的提升直到生成网络生成的样本能够以假乱真判别网络无法分辨真实样本和生成样本之间的差异 生成网络的训练过程冻结判别网络权重生成网络以噪声 z 作为输入通过最小化生成网络与真实数据之间的差异来学习如何生成更好的样本以便判别网络将图像分类为真实图像判别网络的训练过程冻结生成网络权重判别网络通过最小化真实样本和假样本之间的分类误差来更新判别网络区分真实样本和生成样本将生成网络生成的图像分类为伪造图像 重复训练生成网络与判别网络直到达到平衡当判别网络能够很好地检测到生成的图像时生成网络对应的损失比判别网络对应的损失要高得多。通过不断训练生成网络和判别网络直到生成网络可以生成逼真图像而判别网络无法区分真实图像和生成图像。 2. GAN 模型分析 为了生成手写数字的图像我们采取以下策略 导入 MNIST 数据初始化随机噪声定义生成网络模型定义判别网络模型使用生成网络生成伪造图像生成网络在最初只能生成噪声图像噪声图像是通过将一组噪声值通过权重随机的神经网络得到的图像交替训练两个模型 将生成的图像与原始图像串联起来判别网络预测每个图像是伪造图像还是真实图像对判别网络进行训练判别网络的损失是图像的预测值和实际值(标签)的二进制交叉熵生成的伪造图像的实际值(标签)为 0原始数据集中真实图像的实际值(标签)为 1训练生成网络利用输入噪声生成伪造图像使其看起来更接近真实图像从而使生成图像有可能欺骗判别网络输入噪声通过生成网络传递输出伪造图像将生成网络生成的图像输入到判别网络中此时判别网络权重被冻结因为生成网络的目标是欺骗判别网络因此假设生成的伪造图像实际值(标签)为 1生成网络的损失是判别网络对输入图像的预测值和实际值 (1) 的二进制交叉熵 了解了 GAN 的基本原理后在下一小节我们实现 GAN 生成 MNIST 手写数字图像。 3. 利用 GAN 模型生成手写数字 (1) 导入相关库并定义设备 import torch from torch import nn from torch import optim from matplotlib import pyplot as plt import numpy as np from torchvision.utils import make_grid device cuda if torch.cuda.is_available() else cpufrom torchvision.datasets import MNIST from torchvision import transforms(2) 导入 MNIST 数据定义具有内置数据转换功能的数据加载器以便缩放输入数据 transform transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean(0.5,), std(0.5,)) ])data_loader torch.utils.data.DataLoader(MNIST(MNIST/, trainTrue, downloadTrue, transformtransform),batch_size128, shuffleTrue, drop_lastTrue)(3) 定义判别网络模型类 class Discriminator(nn.Module):def __init__(self):super().__init__()self.model nn.Sequential( nn.Linear(784, 1024),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(1024, 512),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(512, 256),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(256, 1),nn.Sigmoid())def forward(self, x):return self.model(x)在以上代码中使用 LeakyReLU 激活函数替换 ReLU。打印判别网络的简要信息 from torchsummary import summary discriminator Discriminator().to(device) print(summary(discriminator, (1,784)))模型简要信息输出结果如下所示 ----------------------------------------------------------------Layer (type) Output Shape Param # Linear-1 [-1, 1, 1024] 803,840LeakyReLU-2 [-1, 1, 1024] 0Dropout-3 [-1, 1, 1024] 0Linear-4 [-1, 1, 512] 524,800LeakyReLU-5 [-1, 1, 512] 0Dropout-6 [-1, 1, 512] 0Linear-7 [-1, 1, 256] 131,328LeakyReLU-8 [-1, 1, 256] 0Dropout-9 [-1, 1, 256] 0Linear-10 [-1, 1, 1] 257Sigmoid-11 [-1, 1, 1] 0Total params: 1,460,225 Trainable params: 1,460,225 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.00 Forward/backward pass size (MB): 0.04 Params size (MB): 5.57 Estimated Total Size (MB): 5.61 ----------------------------------------------------------------(4) 定义生成网络模型类 Generator class Generator(nn.Module):def __init__(self):super().__init__()self.model nn.Sequential(nn.Linear(100, 256),nn.LeakyReLU(0.2),nn.Linear(256, 512),nn.LeakyReLU(0.2),nn.Linear(512, 1024),nn.LeakyReLU(0.2),nn.Linear(1024, 784),nn.Tanh())def forward(self, x):return self.model(x)生成网络根据 100 维随机噪声输入生成图像。打印生成网络模型的简要信息 generator Generator().to(device) print(summary(generator, (1,100)))模型简要信息输出结果如下所示 ----------------------------------------------------------------Layer (type) Output Shape Param # Linear-1 [-1, 1, 256] 25,856LeakyReLU-2 [-1, 1, 256] 0Linear-3 [-1, 1, 512] 131,584LeakyReLU-4 [-1, 1, 512] 0Linear-5 [-1, 1, 1024] 525,312LeakyReLU-6 [-1, 1, 1024] 0Linear-7 [-1, 1, 784] 803,600Tanh-8 [-1, 1, 784] 0Total params: 1,486,352 Trainable params: 1,486,352 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.00 Forward/backward pass size (MB): 0.04 Params size (MB): 5.67 Estimated Total Size (MB): 5.71 ----------------------------------------------------------------(5) 定义函数生成随机噪声并将其注册到设备中 def noise(size):n torch.randn(size, 100)return n.to(device)(6) 定义函数来训练判别网络。 判别网络训练函数 (discriminator_train_step) 将真实数据 (real_data) 和伪造数据 (fake_data) 作为输入 def discriminator_train_step(real_data, fake_data, loss, d_optimizer):重置优化器梯度 d_optimizer.zero_grad()在对损失值执行反向传播之前预测真实数据 (real_data) 并计算损失 (error_real) prediction_real discriminator(real_data)error_real loss(prediction_real, torch.ones(len(real_data), 1).to(device))error_real.backward()在真实数据上计算判别网络损失时我们期望判别网络预测输出为 1。因此在判别网络的训练过程中使用 torch.ones 作为标签期望判别网络在真实数据上的输出为 1从而计算判别网络在真实数据上的损失。 在对损失值执行反向传播之前预测伪造数据 (fake_data) 并计算损失 (error_fake) prediction_fake discriminator(fake_data)error_fake loss(prediction_fake, torch.zeros(len(fake_data), 1).to(device))error_fake.backward()在伪造数据上计算判别网络损失时我们期望判别网络预测输出为 0。因此在判别网络的训练过程中使用 torch.zeros 作为标签期望判别网络在伪造数据上的输出为 0从而计算判别网络在伪造数据上的损失。 更新权重并返回整体损失(将模型在 real_data 上 error_real 和 fake_data 上 error_fake 的损失值相加) d_optimizer.step()return error_real error_fake(7) 训练生成网络模型。 定义生成网络训练函数 generator_train_step 并传入伪造数据 fake_data 作为参数 def generator_train_step(real_data, fake_data, loss, g_optimizer):重置优化器梯度 g_optimizer.zero_grad()预测判别网络对伪造数据 (fake_data) 的输出 prediction discriminator(fake_data)在计算生成网络的损失时使用 torch.ones 作为标签期望判别网络在伪造数据上的输出为 1以在训练生成网络时欺骗判别网络输出值 1以此来鼓励生成网络生成更加逼真的数据并让判别网络无法区分其真伪 error loss(prediction, torch.ones(len(real_data), 1).to(device))执行反向传播更新权重并返回损失 error.backward()g_optimizer.step()return error(8) 定义模型对象、生成网络和判别网络的优化器以及损失函数 discriminator Discriminator().to(device) generator Generator().to(device) d_optimizer optim.Adam(discriminator.parameters(), lr0.0002) g_optimizer optim.Adam(generator.parameters(), lr0.0002) loss nn.BCELoss()(9) 训练模型。 循环训练模型 200 个 epochs (num_epochs) num_epochs 200d_loss_epoch [] g_loss_epoch [] for epoch in range(num_epochs):N len(data_loader)d_loss_items []g_loss_items []for i, (images, _) in enumerate(data_loader):加载真实数据 (real_data) 和伪造数据其中伪造数据是通过将大小与真实数据样本数相同的噪声数据 (batch_size len(real_data)) 传入生成网络网络获得的。需要注意的是必须调用 fake_data.detach()否则训练无法正常进行。通过 detach() 函数分离出来一个新的张量这样在 discriminator_train_step() 中调用 error.backward() 时与生成网络相关的张量(生成 fake_data )不会受到影响。使用 discriminator_train_step 函数训练判别网络 real_data images.view(len(images), -1).to(device)fake_data generator(noise(len(real_data))).to(device)fake_data fake_data.detach()训练判别网络后继续训练生成网络。从噪声数据生成一组新的伪造图像 (fake_data) 并使用 generator_train_step 函数训练生成网络 fake_data generator(noise(len(real_data))).to(device)g_loss generator_train_step(real_data, fake_data, loss, g_optimizer)记录损失变化 d_loss_items.append(d_loss.item())g_loss_items.append(g_loss.item())d_loss_epoch.append(np.average(d_loss_items))g_loss_epoch.append(np.average(g_loss_items))绘制判别网络和生成网络的损失随训练的变化情况 epochs np.arange(num_epochs)1 plt.plot(epochs, d_loss_epoch, bo, labelDiscriminator Training loss) plt.plot(epochs, g_loss_epoch, r-, labelGenerator Training loss) plt.title(Training and Test loss over increasing epochs) plt.xlabel(Epochs) plt.ylabel(Loss) plt.legend() plt.grid(off) plt.show()(10) 可视化模型训练后生成的伪造数据 z torch.randn(64, 100).to(device) sample_images generator(z).data.cpu().view(64, 1, 28, 28) grid make_grid(sample_images, nrow8, normalizeTrue) plt.imshow(grid.cpu().detach().permute(1,2,0), cmapgray) plt.show()在上图中可以看到利用 GAN 生成逼真的图像但仍有一定的改进空间在之后的学习中我们将介绍更多 GAN 的改进模型生成更逼真的图像。 小结 生成对抗网络是一种强大的深度学习模型由生成器网络和判别器网络组成通过彼此之间的竞争来提高性能已经在图像生成、图像修复、图像转换和自然语言处理等领域取得了巨大的成功。其核心思想是通过生成器和判别器之间的博弈过程来实现真实样本的生成。生成器负责生成逼真的样本而判别器则负责判断样本是真实还是伪造。通过不断的训练和迭代生成器和判别器会相互竞争并逐渐提高性能。 系列链接 PyTorch深度学习实战1——神经网络与模型训练过程详解 PyTorch深度学习实战2——PyTorch基础 PyTorch深度学习实战3——使用PyTorch构建神经网络 PyTorch深度学习实战4——常用激活函数和损失函数详解 PyTorch深度学习实战5——计算机视觉基础 PyTorch深度学习实战6——神经网络性能优化技术 PyTorch深度学习实战7——批大小对神经网络训练的影响 PyTorch深度学习实战8——批归一化 PyTorch深度学习实战9——学习率优化 PyTorch深度学习实战10——过拟合及其解决方法 PyTorch深度学习实战11——卷积神经网络 PyTorch深度学习实战12——数据增强 PyTorch深度学习实战13——可视化神经网络中间层输出 PyTorch深度学习实战14——类激活图 PyTorch深度学习实战15——迁移学习 PyTorch深度学习实战16——面部关键点检测 PyTorch深度学习实战17——多任务学习 PyTorch深度学习实战18——目标检测基础 PyTorch深度学习实战19——从零开始实现R-CNN目标检测 PyTorch深度学习实战20——从零开始实现Fast R-CNN目标检测 PyTorch深度学习实战21——从零开始实现Faster R-CNN目标检测 PyTorch深度学习实战22——从零开始实现YOLO目标检测 PyTorch深度学习实战23——使用U-Net架构进行图像分割 PyTorch深度学习实战24——从零开始实现Mask R-CNN实例分割 PyTorch深度学习实战25——自编码器(Autoencoder) PyTorch深度学习实战26——卷积自编码器(Convolutional Autoencoder) PyTorch深度学习实战27——变分自编码器(Variational Autoencoder, VAE) PyTorch深度学习实战28——对抗攻击(Adversarial Attack) PyTorch深度学习实战29——神经风格迁移 PyTorch深度学习实战30——Deepfakes
http://www.pierceye.com/news/54033/

相关文章:

  • 郑州模板建站系统公司装修费用怎么做账
  • 湛江建网站天津建设项目验收公示网站
  • 灵璧县住房和城乡建设局网站南昌网站建设工作
  • 网站空间1g多少钱网站模板提供源码
  • 吉林平台网站建设多少钱静态网站论文目录
  • 网站怎么做 流程图做网站容易 但运营难
  • 广州网站建设的公司网站技术培训
  • 广告网站建设方案wordpress 博客系统
  • 嵌入式网站开发网站开发方案案例
  • 哪个网站可以做问卷泰州网站建设公司哪家好
  • php精品网站建设物业公司网站模板
  • 环保部网站建设项目重大变动wordpress点击折叠展开内容
  • 建站需求建设网站市场细分
  • Ul设计网站网站如何做美工
  • 门户网站安全建设方案国家医保服务平台
  • 汽车网站建设论坛网站建设要多少钱品牌
  • 做网站默认城市网络营销有哪些岗位
  • 网站开发基本要求公司免费网站模板
  • 一条龙建站多少钱wordpress主题很慢
  • 做网站设计难吗国外机械做的好的网站
  • 网站建设流程步骤腾讯云重装wordpress
  • 校园网站建设简介有限公司和公司哪个好
  • 东莞网站优化关键词费用建设网络平台 英语
  • 美食网站网页设计代码吕梁seo排名
  • php网站后台怎么登陆企业手机端网站设计模板
  • 简单的网站开发模板锦州做网站
  • 北京市中关村有哪家可以做网站维护关键词推广效果
  • 柯城网站建设wordpress cdn
  • 做网站多少钱?杭州模板建站哪家好
  • 深圳电商网络网站建设网站建设_网站制作公司_捷创