LR_D=0.001
LR_G=0.001
batch_size=64
art_components=15 #生成的15个线段
N_IDEAS=5 #随机灵感
paint_points=np.vstack([np.linspace(-1,1,art_components) for _ in range(batch_size)]) #在-1到1的线段中有15个点
def artist_works(): #产生数据--著名画家
a=np.random.uniform(1,2,size=batch_size)[:,np.newaxis] #生成1到2的随机数,尺寸为batchsize,[]内为维度
paintings=a*np.power(paint_points,2)+(a-1) #曲线中15个点产生一元二次函数,a*x^2+a-1
paintings=torch.feom_torch(paintings).float()
return Variable(paintings)
G=nn.Sequential(nn.Linear(N_IDEAS,128), nn.ReLU(),nn.Linear(128,art_components))
D=nn.Sequential(nn.Linear(art_components,128),nn.ReLU(),nn.Linear(128,1),nn.Sigmoid()) #sigmoid转为概率
#优化参数
opt_D=torch.optim.Adam(D.parameters(),lr=LR_D)
opt_G=torch.optim.Adam(G.parameters(),lr=LR_G)
for step in range(10000): #训练
artist_paintings=artist_works() #随机生成的作品--著名画家
G_ideas=Variable(torch.randn(batch_size,N_IDEAS)) #随机生成
G_paintings=G(G_ideas) #新手画家
prob_artist0=D(artist_paintings)
prob_artist1=D(G_paintings)
D_loss=- torch.mean(torch.log(prob_artist0)+torch.log(1-prob_artist1)) #提高著名画家被认为著名画家,减少新手画家被认为著名画家
G_loss=torch.mean(torch.log(1-prob_artist1)) #提高新手画家被认为著名画家
#初始化
opt_D.zero_grad()
D_loss.backward()
opt_D.step()
opt_G.zero_grad()
G_loss.backward()
opt_G.step()
深度学习--GAN
最新推荐文章于 2024-08-21 17:50:19 发布