人工智能作业7

该代码示例展示了如何用PyTorch构建一个生成对抗网络(GAN),其中生成器(G)试图模仿著名艺术家的作品风格,而判别器(D)则尝试区分真实作品和生成的作品。网络参数包括学习率、想法数量和艺术作品的组件。在训练过程中,G和D相互博弈,逐渐提高生成作品的质量。
摘要由CSDN通过智能技术生成

import osos.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"import torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as plt torch.manual_seed(1) reproducible np.random.seed(1) Hyper ParametersBATCH_SIZE = 64LR_G = 0.0001 learning rate for generatorLR_D = 0.0001 learning rate for discriminatorN_IDEAS = 5 think of this as number of ideas for generating an art work (Generator)ART_COMPONENTS = 15 it could be total point G can draw in the canvasPAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATCH_SIZE)]) show our beautiful painting range plt.plot(PAINT_POINTS[0], 2 * np.power(PAINT_POINTS[0], 2) + 1, c='74BCFF', lw=3, label='upper bound') plt.plot(PAINT_POINTS[0], 1 * np.power(PAINT_POINTS[0], 2) + 0, c='FF9359', lw=3, label='lower bound') plt.legend(loc='upper right') plt.show()def artist_works(): painting from the famous artist (real target) a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis] paintings = a * np.power(PAINT_POINTS, 2) + (a - 1) paintings = torch.from_numpy(paintings).float() return paintingsG = nn.Sequential( Generator nn.Linear(N_IDEAS, 128), random ideas (could from normal distribution) nn.ReLU(), nn.Linear(128, ART_COMPONENTS), making a painting from these random ideas)D = nn.Sequential( Discriminator nn.Linear(ART_COMPONENTS, 128), receive art work either from the famous artist or a newbie like G nn.ReLU(), nn.Linear(128, 1), nn.Sigmoid(), tell the probability that the art work is made by artist)opt_D = torch.optim.Adam(D.parameters(), lr=LR_D)opt_G = torch.optim.Adam(G.parameters(), lr=LR_G)plt.ion() something about continuous plottingfor step in range(10000): artist_paintings = artist_works() real painting from artist G_ideas = torch.randn(BATCH_SIZE, N_IDEAS, requires_grad=True) random ideas\n G_paintings = G(G_ideas) fake painting from G (random ideas) prob_artist1 = D(G_paintings) D try to reduce this prob G_loss = torch.mean(torch.log(1. - prob_artist1)) opt_G.zero_grad() G_loss.backward() opt_G.step() prob_artist0 = D(artist_paintings) D try to increase this prob prob_artist1 = D(G_paintings.detach()) D try to reduce this prob D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1)) opt_D.zero_grad() D_loss.backward(retain_graph=True) reusing computational graph opt_D.step() if step % 50 == 0: plotting plt.cla() plt.plot(PAINT_POINTS[0], G_paintings.data.numpy()[0], c='4AD631', lw=3, label='Generated painting', ) plt.plot(PAINT_POINTS[0], 2 * np.power(PAINT_POINTS[0], 2) + 1, c='74BCFF', lw=3, label='upper bound') plt.plot(PAINT_POINTS[0], 1 * np.power(PAINT_POINTS[0], 2) + 0, c='FF9359', lw=3, label='lower bound') plt.text(-.5, 2.3, 'D accuracy=%.2f (0.5 for D to converge)' % prob_artist0.data.numpy().mean(), fontdict={'size': 13}) plt.text(-.5, 2, 'D score= %.2f (-1.38 for G to converge)' % -D_loss.data.numpy(), fontdict={'size': 13}) plt.ylim((0, 3)); plt.legend(loc='upper right', fontsize=10); plt.draw(); plt.pause(0.01)plt.ioff()plt.show()

adeff19315b64b9493a29082a14ad4b6.jpg

204e8256097b4da8b7d25ee18eedee45.jpg 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值