#  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]

Reply via email to