# have an mxnet error ,can anyone help me to fix it ?thanks a lot!!
from __future__ import print_function
import matplotlib as mpl
from matplotlib import pyplot as plt
import mxnet as mx
from mxnet import gluon, autograd, nd
from mxnet.gluon import nn
import numpy as np
# In[2]:
# Hyper Parameters
BATCH_SIZE = 64
LR_G = 0.0001 # learning rate for generator
LR_D = 0.0001 # learning rate for discriminator
N_IDEAS = 55 # 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 canvas
PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in
range(BATCH_SIZE)])
PAINT_POINTS = nd.array(PAINT_POINTS) # 64*15 为所要绘制的所有的点的数目
# In[3]:
# show our beautiful painting range
plt.plot(PAINT_POINTS[0].asnumpy(), (2 * PAINT_POINTS[0] ** 2 + 1).asnumpy(),
c='#74BCFF', lw=3, label='upper bound')
plt.plot(PAINT_POINTS[0].asnumpy(), (1 * PAINT_POINTS[0] ** 2 + 0).asnumpy(),
c='#FF9359', lw=3, label='lower bound')
plt.legend(loc='upper right')
plt.show()
print(PAINT_POINTS.shape)
# In[4]:
def artist_works(): # painting from the famous artist (real target)
a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis]
a = nd.array(a)
paintings = a * PAINT_POINTS[0] ** 2 + (a - 1)
# paintings = torch.from_numpy(paintings).float()
return paintings
G = nn.Sequential()
with G.name_scope():
G.add(nn.Dense(128, activation='relu'), nn.Dense(ART_COMPONENTS))
D = nn.Sequential()
with D.name_scope():
D.add(nn.Dense(128, activation='relu'), nn.Dense(1, activation='sigmoid'))
ctx = mx.cpu()
# initialize the generator and the discriminator
G.initialize(mx.init.Normal(0.02), ctx=ctx)
D.initialize(mx.init.Normal(0.02), ctx=ctx)
loss = gluon.loss.SoftmaxCrossEntropyLoss()
# trainer for the generator and the discriminator
trainerG = gluon.Trainer(G.collect_params(), 'adam', {'learning_rate': LR_G})
trainerD = gluon.Trainer(D.collect_params(), 'adam', {'learning_rate': LR_D})
# In[6]:
for step in range(10000):
artist_paintings = artist_works() # real painting from artist shape:64*15
G_ideas = nd.random_normal(shape=(BATCH_SIZE, N_IDEAS))
G_paintings = G(G_ideas) # fake painting from G (random ideas)
prob_artist0 = D(artist_paintings) # D try to increase this prob
prob_artist1 = D(G_paintings) # D try to decreases this prob
# start the process of training
with autograd.record():
D_loss = -nd.mean(nd.log(prob_artist0) + nd.log((1 - prob_artist1)))
D_loss.backward()
trainerD.step(N_IDEAS)
with autograd.record():
G_loss = nd.mean(nd.log(1. - prob_artist1))
G_loss.backward()
trainerG.step(N_IDEAS)
if step % 1000 == 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].asnumpy(), (2 * PAINT_POINTS[0] ** 2 +
1).asnumpy(), c='#74BCFF', lw=3,
label='upper bound')
plt.plot(PAINT_POINTS[0].asnumpy(), (1 * PAINT_POINTS[0] ** 2 +
0).asnumpy(), c='#FF9359', lw=3,
label='lower bound')
plt.legend(loc='upper right')
plt.text(-.5, 2.3, 'D accuracy=%.2f (0.5 for D to converge)' %
prob_artist0.data.numpy().mean(),
fontdict={'size': 15})
plt.text(-.5, 2, 'D score= %.2f (-1.38 for G to converge)' %
-D_loss.data.numpy(), fontdict={'size': 15})
plt.ylim((0, 3));
plt.legend(loc='upper right', fontsize=12);
plt.draw();
plt.pause(0.01)
plt.show()
[ Full content available at:
https://github.com/apache/incubator-mxnet/issues/12366 ]
This message was relayed via gitbox.apache.org for [email protected]