什么是生成对抗网络 (GAN)?

news2024/12/24 10:24:40

什么是生成对抗网络 (GAN)?

钦吉兹·赛义德贝利

·

一、说明

        GAN(Generative Adversarial Network)网络是一种深度学习模型,由两个神经网络——生成器和判别器组成。生成器负责生成虚假的数据,而判别器负责判断数据的真实性。它们之间通过对抗学习的方式相互影响和学习,最终生成器能够生成更加真实的数据,而判别器能够更准确地判断数据的真伪。GAN网络被认为是生成式模型中最具有潜力的一种方法之一。

二、GAN概论

        GAN或生成对抗网络是一种神经网络架构,由两个主要组件组成:生成器网络和鉴别器网络。GAN 的目的是生成模拟输入数据分布的真实数据。

        生成器网络采用随机噪声向量作为输入,并生成一个旨在类似于输入数据分布的新数据点。鉴别器网络从输入分布中获取生成的数据点和真实数据点,并预测每个输入是真实的还是生成的。

        在训练期间,生成器网络生成一个数据点,鉴别器网络预测它是真实的还是生成的。然后,生成器网络根据鉴别器的输出接收有关其生成的数据的真实程度的反馈。重复此过程,直到生成器网络能够产生判别器网络无法与真实数据区分开来的真实数据。

        GAN的训练过程可以被描述为一个双人游戏,其中生成器和鉴别器网络不断尝试相互智取。生成器网络旨在生成足够逼真的数据以欺骗鉴别器网络,而鉴别器网络试图正确识别给定的数据点是真实的还是生成的。

        训练后,生成器网络可用于生成类似于输入数据分布的新数据。GAN 已成功用于各种应用,包括图像和视频生成、文本生成和音乐生成。然而,GAN 的训练也可能具有挑战性,并且容易出现模式崩溃等问题,其中发电机网络产生的输出范围有限。

        GAN应用程序的一个例子是图像生成。在此方案中,生成器网络接收随机噪声向量并生成类似于输入图像分布的新图像。鉴别器网络从输入分布中获取生成的图像和真实图像,并预测每个图像是真实的还是生成的。

        在训练期间,生成器网络生成图像,鉴别器网络预测它是真实的还是生成的。然后,生成器网络根据鉴别器的输出接收有关其生成的图像逼真的反馈。重复此过程,直到生成器网络能够生成判别器网络无法与真实图像区分的真实图像。

        训练后,生成器网络可用于生成类似于输入图像分布的新图像。例如,可以在名人面孔数据集上训练 GAN,然后用于生成新的、逼真的名人面孔。GAN还用于其他与图像相关的任务,例如图像到图像的转换,其中GAN用于将图像从一个域(例如,白天)转换为另一个域(例如,夜间),同时保持图像的内容。

        让我们为 GAN 网络编写一个伪代码

Initialize the generator network G with random weights
Initialize the discriminator network D with random weights
Set the learning rate for both networks
Set the number of training epochs
Set the batch size

for epoch in range(num_epochs):
    for batch in data:
        # Train the discriminator network
        Sample a batch of real images from the training data
        Generate a batch of fake images from the generator network
        Train the discriminator network on the real and fake images
        Compute the discriminator loss
        
        # Train the generator network
        Generate a new batch of fake images from the generator network
        Compute the generator loss based on the discriminator's output
        Backpropagate the loss and update the generator's weights
        
        # Update the discriminator's weights
        Backpropagate the loss and update the discriminator's weights
    
    # Generate a sample of fake images from the generator
    Save the generator's weights

三、GAN 编码与 Python

        要为GAN编写完整的Python代码,需要大量的时间和资源。但是,我可以简要概述使用 PyTorch 库训练 GAN 所涉及的步骤:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

使用 PyTorch 定义生成器和鉴别器网络:nn.Module

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        # Define the layers of the generator network
        
    def forward(self, z):
        # Define the forward pass of the generator network
        
class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        # Define the layers of the discriminator network
        
    def forward(self, x):
        # Define the forward pass of the discriminator network

定义超参数:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
batch_size = 128
num_epochs = 100
learning_rate = 2e-4
latent_size = 100
image_size = 28*28

加载 MNIST 数据集并创建数据加载器:

train_dataset = datasets.MNIST(root='data/', train=True, transform=transforms.ToTensor(), download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

定义损失函数和优化器:

criterion = nn.BCELoss()
d_optimizer = optim.Adam(discriminator.parameters(), lr=learning_rate, betas=(0.5, 0.999))
g_optimizer = optim.Adam(generator.parameters(), lr=learning_rate, betas=(0.5, 0.999))

训练 GAN:

for epoch in range(num_epochs):
    for batch_idx, (real_images, _) in enumerate(train_loader):
        # Train discriminator with real images
        real_images = real_images.view(-1, image_size).to(device)
        real_labels = torch.ones(batch_size, 1).to(device)
        fake_labels = torch.zeros(batch_size, 1).to(device)

        # Train discriminator with fake images
        z = torch.randn(batch_size, latent_size).to(device)
        fake_images = generator(z)
        d_real_loss = criterion(discriminator(real_images), real_labels)
        d_fake_loss = criterion(discriminator(fake_images), fake_labels)
        d_loss = d_real_loss + d_fake_loss
        d_optimizer.zero_grad()
        d_loss.backward()
        d_optimizer.step()

        # Train generator
        z = torch.randn(batch_size, latent_size).to(device)
        fake_images = generator(z)
        g_loss = criterion(discriminator(fake_images), real_labels)
        g_optimizer.zero_grad()
        g_loss.backward()
        g_optimizer.step()

使用经过训练的生成器生成新图像:

z = torch.randn(64, latent_size).to(device)
generated_images = generator(z)

请注意,上面的代码只是一个简短的概述,对于 GAN 的特定用例,可能需要额外的步骤和修改。

让我们在代码中填写空白:)

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# Define the generator network
class Generator(nn.Module):
    def __init__(self, input_size=100, output_size=784):
        super(Generator, self).__init__()
        self.input_size = input_size
        self.output_size = output_size
        
        self.fc1 = nn.Linear(input_size, 256)
        self.bn1 = nn.BatchNorm1d(256)
        self.fc2 = nn.Linear(256, 512)
        self.bn2 = nn.BatchNorm1d(512)
        self.fc3 = nn.Linear(512, 1024)
        self.bn3 = nn.BatchNorm1d(1024)
        self.fc4 = nn.Linear(1024, output_size)
        self.activation = nn.Tanh()
        
    def forward(self, x):
        x = self.fc1(x)
        x = self.bn1(x)
        x = self.activation(x)
        x = self.fc2(x)
        x = self.bn2(x)
        x = self.activation(x)
        x = self.fc3(x)
        x = self.bn3(x)
        x = self.activation(x)
        x = self.fc4(x)
        x = self.activation(x)
        return x

# Define the discriminator network
class Discriminator(nn.Module):
    def __init__(self, input_size=784, output_size=1):
        super(Discriminator, self).__init__()
        self.input_size = input_size
        self.output_size = output_size
        
        self.fc1 = nn.Linear(input_size, 1024)
        self.activation = nn.LeakyReLU(0.2)
        self.fc2 = nn.Linear(1024, 512)
        self.fc3 = nn.Linear(512, 256)
        self.fc4 = nn.Linear(256, output_size)
        self.sigmoid = nn.Sigmoid()
        
    def forward(self, x):
        x = self.fc1(x)
        x = self.activation(x)
        x = self.fc2(x)
        x = self.activation(x)
        x = self.fc3(x)
        x = self.activation(x)
        x = self.fc4(x)
        x = self.sigmoid(x)
        return x

# Define the hyperparameters
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
batch_size = 128
num_epochs = 50
learning_rate = 0.0002
input_size = 100
image_size = 28 * 28

# Load the MNIST dataset
train_dataset = datasets.MNIST(root="./data", train=True, transform=transforms.ToTensor(), download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

# Initialize the generator and discriminator networks
generator = Generator(input_size).to(device)
discriminator = Discriminator().to(device)

# Define the loss functions and optimizers
criterion = nn.BCELoss()
g_optimizer = optim.Adam(generator.parameters(), lr=learning_rate)
d_optimizer = optim.Adam(discriminator.parameters(), lr=learning_rate)

# Train the GAN
for epoch in range(num_epochs):
    for batch_idx, (real_images, _) in enumerate(train_loader):
        real_images = real_images.view(-1, image_size).to(device)
        batch_size = real_images.shape[0]
        
        # Train the discriminator network
        d_optimizer.zero_grad()
        
        # Train on real images
        real_labels = torch.ones(batch
生成对抗
赣语
神经网络
词典数据集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)

Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等) 准备文件,这里我放在resource下的templates路径 在pom中配置构建打包的资源,更新maven 如果使用了assembly打包插件这样配置可能仍不生效&#…

Windows+Pycharm 如何创建虚拟环境

当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…

基于FPGA的图像指数对比度增强算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1图像指数对比度增强概述 4.2基于FPGA的图像指数对比度增强 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns…

Redis——渐进式遍历和数据库管理命令

介绍 如果使用keys * 这样的操作,将Redis中所有的key都获取到,由于Redis是单线程工作,这个操作本身又要消耗很多时间,那么就会导致Redis服务器阻塞,后续的操作无法正常执行 而渐进式遍历,通过多次执行遍历…

虹科展会丨9月19号工博会启航:虹科五大团队携20+产品,双展台+两场演讲等您来!

2023年9月19-23日,第23届中国国际工业博览会即将在上海国家会展中心拉开帷幕。本届工博会以“碳循新工业、数聚新经济”为主题,展览面积30万平方米,吸引了来自全球27个国家和地区超2600家企业参展,共设置九大专业展区,…

电子游戏冷知识

电子游戏一直在试图用技术还原一个真实或虚幻的世界,并在其中演绎和倾诉人类种种的情感和欲望。 对信息技术发展的贡献 游戏推动了芯片、网络、VR/AR等领域的技术进步和创新。根据中科院的研究报告,游戏技术对芯片产业的科技进步贡献率是14.9%&#xff…

清华大学LightGrad-TTS,且流式实现

论文链接: https://arxiv.org/abs/2308.16569 代码地址: https://github.com/thuhcsi/LightGrad 数据支持: 针对BZNSYP和LJSpeech提供训练脚本 针对Grad-TTS提出两个问题: DPMs are not lightweight enough for resource-con…

真空腔体的设计要点

真空腔体是保持内部为真空状态的容器,真空腔体设计制作要考虑容积、材质和形状。 1、根据应用需求选择腔体形状。几种代表性的真空腔体包括垂直真空腔体、水平真空腔体、立方真空腔体和球形真空腔体。 2、根据获得真空度选择腔体材质。钛用于极高真空;…

轻松学习 Spring 事务

文章目录 一. Spring事务简介二. Spring事务使用1. 编程式事务2. 声明式事务 三. Transactional的使用1. 参数作用2. 事务失效的场景3. Transactional工作原理 四. Spring 事务的隔离级别五. Spring事务传播机制 一. Spring事务简介 在之前的博客已经介绍了在 Spring 环境中整…

《向量数据库指南》——Milvus Cloud是如何从 0 到 1 做一款向量数据库的?经过了哪些升级和迭代?

这实际上是一个颇具曲折性和难得性的故事。由于我自己是在公司中间加入的,从 2.0 版本开始参与了 Milvus 的构建,而我们公司在向量数据库领域已经有大约 5 年的历史了。 最初,我们看到了这个机会,并意识到有诸如 Faiss 等引擎在处…

文件属性操作函数

1.access函数 #include <unistd.h> int access(const char *pathname, int mode); 作用&#xff1a;判断某个文件是否有某个权限&#xff0c;或者判断文件是否存在 参数: -pathname:判断的文件路径 -mode: R_OK&#xff1a;判断是否有读权限 W_OK X_OK F_OK&#xff1a;…

vue实现鼠标拖拽div左右移动的功能

直接代码&#xff1a; <template><div class"demo"><div class"third-part" id"发展历程"><div class"title">发展历程</div><div class"content" id"nav" v-if"dataList…

马斯克回应盖茨;谷歌反垄断案开庭;苹果发布 3nm 芯片的 iPhone 15丨RTE开发者日报 Vol.48

开发者朋友们大家好&#xff1a; 这里是「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

液压切管机配套用液压泵站比例阀放大器

液压切管机配套用液压泵站是液压系统的动力源&#xff0c;可按机械设备工况需要提供一定压力、流量和清洁度的工作介质。它由泵组、油箱组件、控温组件、滤油器组件及蓄能器组件等组合而成&#xff0c;液压泵站主要服务于大型管道工程。

L1-020 帅到没朋友 C++解法【全网最全】

一、题目再现 当芸芸众生忙着在朋友圈中发照片的时候&#xff0c;总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;&#xff0c;是已知朋友圈的个数&#xff1b;随后N行…

Oracel ORA-22992 错误的解决方法

在oracle数据库中&#xff0c;可以使用DBLink 进行垮数据库访问。 今天在使用dblink 查询数据时&#xff0c;提示如下&#xff1a;ORA-22992&#xff1a;无法使用从远程表选择的LOB定位器。 无论是查询远程表还是视图&#xff0c;如果里面存在 CLOB类型的字段&#xff0c;就会…

99%的人都不知道的免费在线制作电子画册的网站

你是否曾经想过自己制作一本精美的电子画册&#xff1f; 现在&#xff0c;小编给大家分享一款免费在线制作电子画册的工具&#xff0c;可以帮助你轻松实现。这个网站不仅提供了丰富的模板和素材&#xff0c;还让你在制作过程中可以随时预览和编辑&#xff0c;无需任何排版设计…

fastadmin框架调用model层的方法

当使用FastAdmin框架进行Web应用程序开发时&#xff0c;经常需要与数据库交互以执行各种操作&#xff0c;如获取、创建、更新和删除数据。为了实现这些操作&#xff0c;FastAdmin采用了Model-View-Controller&#xff08;MVC&#xff09;模式&#xff0c;其中Model层负责处理数…

人机融合+学科

人机融合是指人类和机器之间的密切合作和相互补充&#xff0c;在各个学科领域都有广泛的应用&#xff0c;未来将会不断促进各个学科的快速发展&#xff0c;并因此会产生较大的突破。同时&#xff0c;人机融合与各个学科的关系是相辅相成的&#xff0c;其应用涵盖广泛&#xff0…

苹果再发“黑科技”,合合信息扫描全能王新功能支持“360度立体式建模”

9月13日凌晨&#xff0c;搭载iOS 17正式版系统的iPhone 15系列新品正式发布。基于iPhone激光雷达、iOS 17系统&#xff0c;合合信息旗下扫描全能王新推出“物体扫描”功能&#xff0c;用户只需使用手机环绕目标物体扫描&#xff0c;便可实时进行3D建模&#xff0c;完成一次“36…