- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Least Squares Generative Adversarial Networks
1.这篇文章主要介绍了什么
在这篇文章中,讲述了LSGAN,它用L2修改了原来的GAN损失而不是日志丢失。L 2的直觉损失可以帮助GAN学习数据的多样性。也看到了为什么GAN不能有效利用log损失的直觉。最后,本文在Pytorch中实现了LSGAN。发现LSGAN的实现比较简单。
2.这篇文章提出算法的过程
与basic GAN 唯一不同在判别器的最后输出不使用 sigmoid 激活,而是使用了线性函数(也即不使用激活)。不同于basic GAN, LSGAN的训练损失函数由交叉熵改为MSE(Mean Squared Error)。LSGAN的主要思想是使用在鉴别器D中提供平滑和非饱和梯度的损失函数。本文要D来“拉”由G产生的数据朝着实际数据流形Pdata(X),所以G生成与Pdata(X)相似的数据。
正如我们所知道的原始GAN,d使用日志丢失。决策边界是这样的:
作为D.使用sigmoid函数,因为它很快饱和,即使是有点小的数据点x也是如此,它会很快忽略x的距离到决策边界w。这意味着它基本上不会惩罚x那离w很远在歧管中。也就是说,只要x是正确的标签,我们很高兴。因此,作为x越来越大,D的梯度迅速下降到0因为日志丢失不在乎距离,只有标志。
为了学习Pdata(X )的流形。G使用D的梯度进行训练。如果D的梯度正饱和到0,那么G将不具有用于学习的必要信息Pdata(X )。
输入L2失利:
在L2损失中,离w很远的数据(在这种情况下,Pdata(X ))将受到与距离成正比的惩罚。因此,渐变只会变成0当w完美捕捉所有的x。这将保证D如果G产生信息梯度还没有捕捉到数据的多样性。
在优化过程中,L2的唯一途径D的损失小G就是做G生成x那样接近w。这样,G实际上将学会匹配Pdata(X )。
LSGAN的整体培训目标可以表述如下:
以上,作者选择b=1说明这是真实的数据。相反,选择a=0因为它是假的数据。但是,这些值并不是唯一有效的值。最终的损失如下:
文章所做的实验结果
下图是训练过程中,由生成器采样的几张示例图片。
在Pytorch中执行LSGAN,概述LSGAN对原始GAN所做的修改:
1.从D删除日志
2.使用L2损失而不是日志丢失
G = torch.nn.Sequential(
torch.nn.Linear(z_dim, h_dim),
torch.nn.ReLU(),
torch.nn.Linear(h_dim, X_dim),
torch.nn.Sigmoid()
)
D = torch.nn.Sequential(
torch.nn.Linear(X_dim, h_dim),
torch.nn.ReLU(),
# No sigmoid
torch.nn.Linear(h_dim, 1),
)
G_solver = optim.Adam(G.parameters(), lr=lr)
D_solver = optim.Adam(D.parameters(), lr=lr)
for it in range(1000000):
# Sample data
z = Variable(torch.randn(mb_size, z_dim))
X, _ = mnist.train.next_batch(mb_size)
X = Variable(torch.from_numpy(X))
# Dicriminator
G_sample = G(z)
D_real = D(X)
D_fake = D(G_sample)
# Discriminator loss
D_loss = 0.5 * (torch.mean((D_real - 1)**2) + torch.mean(D_fake**2))
D_loss.backward()
D_solver.step()
reset_grad()
# Generator
G_sample = G(z)
D_fake = D(G_sample)
# Generator loss
G_loss = 0.5 * torch.mean((D_fake - 1)**2)
G_loss.backward()
G_solver.step()
reset_grad()
1
文档评论(0)