集团网站建设,江苏常州烽火台网络推广,速贝网站友情链接怎么做,长春最新发布信息获取pdf#xff1a;密码7281 文章目录一#xff1a;数据集介绍二#xff1a;GAN简介#xff08;1#xff09;简介#xff08;2#xff09;损失函数三#xff1a;代码编写#xff08;1#xff09;参数及数据预处理#xff08;2#xff09;生成器与判别器模型#x…获取pdf密码7281 文章目录一数据集介绍二GAN简介1简介2损失函数三代码编写1参数及数据预处理2生成器与判别器模型3优化器和损失函数4训练三效果查看1tensorboard2生成图片效果一数据集介绍
MNIST数据集MNIST是个手写数字图片集每张图片都做了归一化处理大小是28x28并且是灰度图像所以每张图像格式为1x28x28
数据集下载地址
包括如下四个文件 含义如下
类别文件名描述训练集图片train-images-idx3-ubyte.gz9.9M包含60000个样本训练集标签train-labels-idx1-ubyte.gz29KB包含60000个标签测试集图片t10k-images-idx3-ubyte.gz1.6M包含10000个样本测试集标签t10k-labels-idx1-ubyte.gz5KB包含10000个样本
当然torchvision.datasets中也内置了这个数据集可以通过如下代码从网络上下载
train_data dataset.MNIST(root./mnist/,trainTrue,transformtransforms.ToTensor(),downloadTrue)
test_data dataset.MNIST(root./mnist/,trainFalse,transformtransforms.ToTensor(),downloadFalse)root表示数据集待存放的目录train如果为true将会使用训练集的数据集training.pt如果为false将会使用测试集数据集test.ptdownload如果为true将会从网络上下载并放入root中如果数据集已下载则不会再次下载transform接受PIL图片并返回转换后的图片常用的就是转换为tensor这里便会调用torchvision.transform
数据集加载成功后文件布局如下 二GAN简介
1简介
GAN(Generative Adversial Nets生成式对抗网络)这是一种深度学习模型是近年来复杂分布上无监督学习最具前景的方法之一。模型有两个模型生成模型Generative Model和辨别模型Discriminative Model的互相博弈学习产生相当好的输出。实际使用时一般会选择DNN作为G和D
如下图以论文中所述的制作假钞的例子为例进行说明
生成模型G的目的是尽量能够生成足以以假乱真的假钞去欺骗判别模型D让它以为这是真钞判别模型D的目的是尽量能够鉴别出生成模型G生成的假钞是假的 2损失函数
GAN损失函数如下
其中参数含义如下
xxx真实的数据样本zzz噪声从随机分布采集的样本GGG生成模型DDD判别模型G(z)G(z)G(z)输入噪声生成一条样本D(x)D(x)D(x)判别真实样本是否来自真实数据如果是则为1如果不是则为0D(G(z))D(G(z))D(G(z))判别生成样本是否来自真实数据如果是则为1如果不是则为0
该损失函数整体分为两个部分
第一部分给定GGG找到使VVV最大化的DDD因为使VVV最大化的DDD会使判别器效果最好
对于①判别器的输入为真实数据xxxEx∼pdata[logD(x)]E_{x}\sim p_{data}[logD(x)]Ex∼pdata[logD(x)]值越大表示判别器认为输入xxx为真实数据的概率越大也即表示判别器的能力越强所以这一项输出越大对判别器越有利对于②判别器的输入伪造数据G(z)G(z)G(z)此时D(G(z))D(G(z))D(G(z))越小那么就表示判别器将此伪造数据鉴别为真实数据的概率也越小也即表示判别器的能力越强。注意此时第二项是log(1−D(G(z)))log(1-D(G(z)))log(1−D(G(z)))的期望Ex∼pdata[log(1−D(G(z)))]E_{x}\sim p_{data}[log(1-D(G(z)))]Ex∼pdata[log(1−D(G(z)))]。所以当判别器能力越强时D(G(z))D(G(z))D(G(z))越小同时Ex∼pdata[log(1−D(G(z)))]E_{x}\sim p_{data}[log(1-D(G(z)))]Ex∼pdata[log(1−D(G(z)))]也就越大 第二部分给定DDD找到使VVV最小化的GGG因为使VVV最小化的GGG会使生成器效果最好
对于①由于固定了DDD而这一部分只和DDD有关因此这一部分是常量所以可以舍去对于②判别器的输入伪造数据G(z)G(z)G(z)与上面不同的是我们期望生成器的效果要好尽可能骗过辨别器所以D(G(z))D(G(z))D(G(z))要尽可能大D(G(z))D(G(z))D(G(z))越大表示辨别器鉴定此数据为真实数据的概率越大Ex∼pdata[log(1−D(G(z)))]E_{x}\sim p_{data}[log(1-D(G(z)))]Ex∼pdata[log(1−D(G(z)))]也就越小
三代码编写
1参数及数据预处理
# 设备
device cuda if torch.cuda.is_available() else cpu
if device cuda:print(GPU上运行)
else:print(CPU上运行)
# 图片格式
img_size [1, 28, 28]# batchsize
batchsize 64# latent_dim
latent_dim 100# 数据集及变化
data_transforms transforms.Compose([transforms.Resize(28),transforms.ToTensor(),transforms.Normalize([0.5], [0.5])]
)
dataset torchvision.datasets.MNIST(root~/autodl-tmp/dataset, trainTrue, downloadFalse, transformdata_transforms)2生成器与判别器模型
# 生成器模型根据输入生成图像
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()def block(in_feat, out_feat, normalizeTrue):layers [nn.Linear(in_feat, out_feat)]if normalize:layers.append(nn.BatchNorm1d(out_feat, 0.8))layers.append(nn.LeakyReLU(0.2, inplaceTrue))return layersself.model nn.Sequential(*block(latent_dim, 128, normalizeFalse),*block(128, 256),*block(256, 512),*block(512, 1024),nn.Linear(1024, np.prod(img_size, dtypenp.int32)),nn.Tanh())def forward(self, x):# [batchsize, latent_dim]output self.model(x)image output.reshape(x.shape[0], *img_size)return image# 判别器模型判别图像真假class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.model nn.Sequential(nn.Linear( np.prod(img_size, dtypenp.int32), 512),nn.ReLU(inplaceTrue),nn.Linear(512, 256),nn.ReLU(inplaceTrue),nn.Linear(256, 128),nn.ReLU(inplaceTrue),nn.Linear(128, 1),nn.ReLU(inplaceTrue),nn.Sigmoid(),)def forward(self, x):# [batch_size, 1, 28, 28]x x.reshape(x.shape[0], -1)output self.model(x)return output
3优化器和损失函数
# 优化器和损失函数
generator Generator()
generator generator.to(device)
discriminator Discriminator()
discriminator discriminator.to(device)g_optimizer torch.optim.Adam(generator.parameters(), lr0.0001)
d_optimizer torch.optim.Adam(discriminator.parameters(), lr0.0001)
loss_func nn.BCELoss()4训练
def train():step 0dataloader DataLoader(datasetdataset, batch_sizebatchsize, shuffleTrue, drop_lastTrue, num_workers8)for epoch in range(1, 100):print(-----------当前epoch{}-----------.format(epoch))for i, batch in enumerate(dataloader):print(-----------当前batch{}/{}-----------.format(i, (len(dataloader))))# 拿到真实图片X, _ batchX X.to(device)# 采用标准正态分布得到的batchsize × latent_dim的向量z torch.randn(batchsize, latent_dim)z z.to(device)# 送入生成器生成假图片pred_X generator(z)g_optimizer.zero_grad()生成器损失让生成的图像与通过辨别器与torch.ones(batchsize, 1)越接近越好g_loss loss_func(discriminator(pred_X), torch.ones(batchsize, 1).to(device))g_loss.backward()g_optimizer.step()d_optimizer.zero_grad()辨别器损失一方面让真实图片通过辨别器与torch.ones(batchsize, 1)越接近越好另一方面让生成图片通过辨别器与torch.zeros(batchsize, 0)越接近越好d_loss 0.5 * (loss_func(discriminator(X), torch.ones(batchsize, 1).to(device)) loss_func(discriminator(pred_X.detach()), torch.zeros(batchsize, 1).to(device)))d_loss.backward()d_optimizer.step()print(生成器损失{}.format(g_loss), 辨别器损失{}.format(d_loss))logger.add_scalar(g_loss, g_loss, step)logger.add_scalar(d_loss, d_loss, step)step step1if step % 1000 0:save_image(pred_X.data[:25], ./image_save/image_{}.png.format(step), nrow5)三效果查看
1tensorboard 2生成图片效果
每1000个step保存一次照片最后生成了92张图片每张图片由每个batch的前25张图片构成 1000-step
5000-step
10000-step
20000-step
30000-step
50000-step
70000-step 80000-step 90000-step
920000-stepfinal