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
至此,就是这次拟合一个二次函数的小实验的结束了。
网友评论