文章目录
-
- 概述
- 代码
概述
这篇文章使用MXNet深度学习框架中的Gluon包实现小批量随机梯度下降的线性回归问题。可以参考我的上一篇文章【深度学习】线性回归(二)小批量随机梯度下降及其python实现。
主要包括:
- Gluon提供了data来读取数据
- Gluon的nn(neural network)模块定义了大量神经网络的层
- Gluon的initialize模块提供了模型参数初始化的方法
- Gluon的loss模块提供了各种损失函数
代码
# coding=utf-8
# author: BebDong
# 2018.12.11
# 使用MXNet的Gluon包来实现线性回归:y=w1x1+w2x2+b
# Gluon提供了data来读取数据
# Gluon的nn(neural network)模块定义了大量神经网络的层
# Gluon的initialize模块提供了模型参数初始化的方法
# Gluon的loss模块提供了各种损失函数
from mxnet import autograd, nd
from mxnet import init
from mxnet import gluon
from mxnet.gluon import data as gdata
from mxnet.gluon import nn
from mxnet.gluon import loss as gloss
# 生成数据集:y=w1x1+w2x2+b+e,其中e表示随机噪声,服从均值为0标准差为0.01的正态分布
num_inputs = 2 # 特征数为2,x1和x2两个特征
num_example = 1000 # 训练数据集1000个样本
true_w = [2, -3.4] # 模型中的真实参数
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_example, num_inputs)) # 随机生成测试数据集
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape) # 添加随机噪声
batch_size = 10
# 将训练数据集的特征和标签组合
dataset = gdata.ArrayDataset(features, labels)
# 随机读取小批量
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True)
# nn中的Sequential实例是一个串联各个层的容器:构造模型时,往此容器中以此添加层
net = nn.Sequential()
# 线性模型可以看成单层神经网络,其输出层是全连接层,仅有1个输出节点,Gluon中全连接层是一个Dense实例
net.add(nn.Dense(1))
# 初始化模型参数:均值为0标准差为0.01正态分布
net.initialize(init.Normal(sigma=0.01))
# 定义损失函数:平方损失也称之为L2范数损失
loss = gloss.L2Loss()
# 通过Gluon的Trainer实例定义优化算法(这里使用小批量随机梯度下降sgd)
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})
# 训练模型
epochs = 10
for epoch in range(0, epochs):
for X, y in data_iter:
with autograd.record():
l = loss(net(X), y)
l.backward()
trainer.step(batch_size)
l = loss(net(features), labels)
print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy()))
# 输出
dense = net[0]
print(true_w, dense.weight.data())
print(true_b, dense.bias.data())
实验结果如下,红线标出了我们得到的参数值,很真实值已经很接近了。