美文网首页
使用mxnet拟合一个二次函数

使用mxnet拟合一个二次函数

作者: 远古胖达 | 来源:发表于2018-01-18 20:08 被阅读0次

    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:


    image.png

    第三个epoch:


    image.png

    之后的某一次的epoch:


    image.png

    End

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

    相关文章

      网友评论

          本文标题:使用mxnet拟合一个二次函数

          本文链接:https://www.haomeiwen.com/subject/bhtgoxtx.html