動手學深度學習(一)——線性迴歸(gluon)
阿新 • • 發佈:2018-12-31
文章作者:Tyan
部落格:noahsnail.com | CSDN | 簡書
注:本文為李沐大神的《動手學深度學習》的課程筆記!
建立資料集
# 匯入mxnet
import random
import mxnet as mx
# 匯入mxnet的gluon, ndarray, autograd
from mxnet import gluon
from mxnet import autograd
from mxnet import ndarray as nd
# 設定隨機種子
mx.random.seed(1)
random.seed(1)
# 訓練資料的維度
num_inputs = 2
# 訓練資料的樣本數量
num_examples = 1000
# 實際的權重w
true_w = [2, -3.4]
# 實際的偏置b
true_b = 4.2
# 隨機生成均值為0, 方差為1, 服從正態分佈的訓練資料X,
X = nd.random_normal(shape=(num_examples, num_inputs))
# 根據X, w, b生成對應的輸出y
y = true_w[0] * X[:, 0] + true_w[1] * X[:, 1] + true_b
# 給y加上隨機噪聲
y += 0.01 * nd.random_normal(shape=y.shape)
資料展示
%matplotlib inline
import matplotlib.pyplot as plt
# 繪製資料的散點圖
plt.scatter(X[:, 1].asnumpy(), y.asnumpy())
plt.show()
資料讀取
# 訓練時的批資料大小
batch_size = 10
# 建立資料集
dataset = gluon.data.ArrayDataset(X, y)
# 讀取資料
data_iter = gluon.data.DataLoader(dataset, batch_size, shuffle=True)
# 檢視資料
for data, label in data_iter:
print data, label
break
[[-2.11255503 0.61242002]
[ 2.18546367 -0.48856559]
[ 0.91085583 0.38985687]
[-0.56097323 1.44421673]
[ 0.31765923 -1.75729597]
[-0.57738042 2.03963804]
[-0.91808975 0.64181799]
[-0.20269176 0.21012937]
[-0.22549874 0.19895147]
[ 1.42844415 0.06982213]]
<NDArray 10x2 @cpu(0)>
[ -2.11691356 10.22533131 4.70613146 -1.82755637 10.82125568
-3.88111711 0.17608714 3.07074499 3.06542921 6.82972908]
<NDArray 10 @cpu(0)>
定義模型
# 定義一個空的模型
net = gluon.nn.Sequential()
# 加入一個Dense層
net.add(gluon.nn.Dense(1))
初始化模型引數
net.initialize()
定義損失函式
square_loss = gluon.loss.L2Loss()
優化
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.01})
訓練
# 定義訓練的迭代週期
epochs = 5
# 訓練
for epoch in xrange(epochs):
# 總的loss
total_loss = 0
for data, label in data_iter:
# 記錄梯度
with autograd.record():
# 計算預測值
output = net(data)
# 計算loss
loss = square_loss(output, label)
# 根據loss進行反向傳播計算梯度
loss.backward()
# 更新權重, batch_size用來進行梯度平均
trainer.step(batch_size)
# 計算總的loss
total_loss += nd.sum(loss).asscalar()
print "Epoch %d, average loss: %f" % (epoch, total_loss/num_examples)
Epoch 0, average loss: 7.403182
Epoch 1, average loss: 0.854247
Epoch 2, average loss: 0.099864
Epoch 3, average loss: 0.011887
Epoch 4, average loss: 0.001479