使用mxnet拟合一个二次函数

Start

学习mxnet有了一段时间了,想要稍微实践一下。遂准备拟合一个二次函数。

y=ax^2+ax+b

使用gluon建立以下的网络:

net = gluon.nn.Sequential()
with net.name_scope():
    net.add(gluon.nn.Dense(40, activation='tanh'))
    net.add(gluon.nn.Dense(80, activation='relu'))
    net.add(gluon.nn.Dense(1))
net.initialize()

其实这个网络只需要一层带非线性因素的隐藏层即可,神经单元数量10个以上。

生成数据

num_inputs_y = 1
num_inputs_x = 10000

true_w = 3.9
true_b = 6.2

X = mx.nd.random_normal(shape=(num_inputs_x, num_inputs_y))
y = true_w * X[:,0] * X[:,0] + true_w * X[:,0] + true_b
y += 0.01 * mx.nd.random_normal(shape=y.shape)

准备训练

l2_loss = gluon.loss.L2Loss()

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate':0.07})

开始的时候,learning rate设置的数值是0.5,然后梯度消失.
调小学习率之后就可以了。说明学习率是一个非常重要的超参数.

开始训练


epoch = 600

for e in range(epoch):
    total_loss = 0.
    for data, label in data_iter:
        with autograd.record():
            output = net(data)
            loss = l2_loss(output, label)
        loss.backward()
        trainer.step(batch_size)
        total_loss += mx.nd.mean(loss).asscalar()
    plt.scatter(X.asnumpy(), y.asnumpy(), c='blue')
    plt.scatter(X.asnumpy(), net(X).asnumpy(), c='red')
    plt.show()
    print("epoch %d, loss %f, average loss %f" % (e, total_loss,  total_loss/num_inputs_x))

使用L2来计算损失.
其中简单的使用图表来观察训练情况:
第一个epoch:


使用mxnet拟合一个二次函数_第1张图片
image.png

第三个epoch:


使用mxnet拟合一个二次函数_第2张图片
image.png

之后的某一次的epoch:


使用mxnet拟合一个二次函数_第3张图片
image.png

End

至此,就是这次拟合一个二次函数的小实验的结束了。

你可能感兴趣的:(使用mxnet拟合一个二次函数)