【深度學習】線性迴歸(三)使用MXNet深度學習框架實現線性迴歸
阿新 • • 發佈:2018-12-15
文章目錄
概述
這篇文章使用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())
實驗結果如下,紅線標出了我們得到的引數值,很真實值已經很接近了。