1.GAN的原理和结构
1.什么是GAN
GAN的全称是Generative adversarial network,中文翻译过来就是生成对抗网络。生成对抗网络其实是两个网络的组合:生成网络(Generator)负责生成模拟数据;判别网络(Discriminator)负责判断输入的数据是真实的还是生成的。生成网络要不断优化自己生成的数据让判别网络判断不出来,判别网络也要优化自己让自己判断得更准确。二者关系形成对抗,因此叫对抗网络。
2.GAN的模型结构

判别器会接受两部分的数据 一部分是真实样本的数据 一部分是生成器生成的假数据
生成器接收噪声之后会生成一个猫的图片 判别器如果预测出真实的就会输出1 如果是假的就会输出0 对于判别器而言 希望将真实的样本判定为1 将生成的样本 判定为0 产生的损失会分别去优化判别器和生成器
3.GAN原理
GAN设计的关键在于损失函数的处理 对于判别模型 损失函数是容易定义的 判别器主要用来判断一张图片是真实的还是生成的 这是一个二分类问题 对于生成模型 损失函数的定义不是那么容易 希望生成器可以生成接近真实的图片 但是对于生成的图片是否像真实的 我们人类肉眼容易判断 但具体到代码中 往往是一个抽象的 难以数学公理化定义的范式 针对这个问题 就把生成模型的输出 交给判别模型的处理 让判别器来判断这是一个真实的图像还是假的图像 因为深度学习模型适合做图片的分类 这样就将生成对抗网络中的两大类模型生成器与判别器紧密联合在一起了
2.GAN的算法流程和公式详解
1.GAN的算法流程
*G是一个生成图片的网络 它接收一个随机的噪声z,通过这个噪声生成图片 叫做G(z)
*D是一个判别网络 判别一张图片是不是真实的 它的输入参数是x x代表一张图片 输出D(x)代表x为真实图片的概率 如果为1 那就代表100%是真实的图片 如果输出为0 那就代表不可能是真实的图片
在训练过程中 将随机噪声输入生成网络G,得到生成的图片; 判别器接收生成的图片和真实的图片 并尽量将两者区分开来 在这个计算过程中 能否正确区分生成的图片和真实的图片将作为判别器的损失 而能否生成近似真实的图片并使得判别器将生成的个图片判定为真将作为生成器的损失
生成器的损失是通过判别器的输出来计算的 而判别器的输出是一个概率值 我们可以通过交叉熵计算
2.GAN公式

公式中x表示真实图片
z表示输入G网络的噪声
G(z)表示G网络生成的图片
D(*)表示D网络判断图片是否真实的概率
*是有可能输入真实的图片有可能输入假的图片
![]()
x代表真实的数据(图片) 整个式子表示从真实的图片中随机挑选一张
Pdata表示真实数据的分布
![]()
z代表噪声 随即输入一个噪声 一般使用正态分布生成随机噪声 交给模型G(z)来生成一张图片 在交给D(G(z))模型调用 来产生判别器的输出
pz(z)表示生成随机噪声的分布
前半部分
对于判别器D,希望可以正确识别真实的数据 下面公式就是判别器对于真实图片的判断 data是数据集

这一部分的含义就是:判别器判别出真实数据的概率 希望这个概率越大越好 也就是说 对于服从Pdata分布的图片x,判别器应该给出预测结果D(x) = 1
后半部分
对于判别器D来说 如果输入的是生成的数据 也就是D(G(z))
判别器的目标是最小化D(G(z)) 因为判别器想要正确识别出生成的假数据 希望它被判定为0 也就是希望 log这一坨越大越好

对于生成器G来说 希望生成的数据被判别器识别为真 希望它被判定为1 也就是希望D(G(z)) = 1
也就是希望log这一坨越小越好
取对数的原因
对数函数在其定义域内是单调递增函数 数据取对数不改变数据间的相对关系 使用log后 可放大损失 便于计算和优化
3.GAN公式理解
可以看到判别器D 和生成器G 对

的优化目标是相反的 这就体现在公式中的:

3.GAN公式总结和GAN的应用

从判别器D的角度 希望最大化 V(D,G)
从生成器G的角度 希望最小化 V(D,G)
GAN的应用领域
1.图像生成
生成一些假的数据 比如海报中的人脸
2.图像增强
从分割图生成假的真实街景 方便训练无人汽车
3.风格化和艺术的图像创造
转换图像风格 修补图像
4.声音的转换
一个人的声音转为另一个的声音 去除噪音等
4.数据加载
代码如下:
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
import torchvision
from torchvision import transforms
#对数据做归一化处理 -1 - 1 之间 这和Gan训练最后要用tanh函数有关 tanh函数取值范围就是-1 - 1之间
transforms = transforms.Compose([
#0-1归一化:将图像中的像素值从原范围(通常是 [0, 255] 或者具体的设备特定范围)转换到 [0, 1]的范围内,方便神经网络模型训练,加速收敛。
#通道顺序调整:图像通常以 HWC(Height, Width, Channel)的形式存在
#ToTensor() 函数会将通道(color channels)移动到最前面,变成标准的 CHW(Channel, Height, Width)格式,这是PyTorch张量的标准格式。
transforms.ToTensor(),
# mean:均值 std:方差 可以将数据转换成-1 - 1之间的数据
transforms.Normalize(0.5,0.5)
])
#加载内置数据集
train_ds = torchvision.datasets.MNIST(root='E:\Pc项目\pythonProjectlw\数据集',
train=True,
transform=transforms,

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



