【深度学习】线性回归(三)使用MXNet深度学习框架实现线性回归

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28869927/article/details/84962428

文章目录

概述

这篇文章使用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())

实验结果如下,红线标出了我们得到的参数值,很真实值已经很接近了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_28869927/article/details/84962428