寫在前面
同最開始的兩篇文章
完整程序及注釋
'''
導入使用的庫
'''
# 基本
from mxnet import autograd, nd, gluon
# 模型、網絡
from mxnet.gluon import nn
from mxnet import init
# 學習
from mxnet.gluon import loss as gloss
# 數據集
from mxnet.gluon import data as gdata
'''
生成測試數據集
'''
# 被擬合參數
true_w = [2, -3.4] # 特征的權重系數
true_b = 4.2 # 整體模型的偏置
# 創建訓練數據集
num_inputs = 2
num_examples = 1000
features = nd.random.normal(loc=0, scale=1, shape=(num_examples, num_inputs)) # 均值為0,標準差為1
labels = true_w[0]*features[:,0] + true_w[1]*features[:,1] + true_b
labels_noise = labels + nd.random.normal()
'''
確定模型
'''
net = nn.Sequential() # 聲明一個Sequential容器,存放Neural Network
net.add(nn.Dense(1)) # 向容器中添加一個全連接層,且不使用激活函數,“1”表示該全連接層的輸出神經元有1個
net.initialize(init.Normal(sigma=0.01)) # 權重參數隨機取自均值=0,標準差=0.01的高斯分布,bias默認=0
'''
確定學習方式
'''
loss = gloss.L2Loss() # L2范數損失 等價于 平方損失
# .collect_params()方法獲取net實例的全部參數,并提供給trainer
# 選擇小批量隨機梯度下降法(sgd)尋優,學習率為0.03
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})
'''
數據集采樣
'''
batch_size = 10
dataset = gdata.ArrayDataset(features, labels_noise) # 將標簽和特征組合成完整數據集
# DataLoader返回一個迭代器,每次從數據集中提取一個長度為batch_size的子集出來
data_iter = gdata.DataLoader(dataset, batch_size, shuffle=True) # shuffle=True 打亂數據集(隨機采樣)
'''
開始訓練
'''
num_epoch = 3 # 訓練輪次
for epoch in range(0, num_epoch):for x, y in data_iter: # 隨機取出一組小批量,同時做到遍歷with autograd.record(): # 自動保存梯度數據l = loss(net(x), y) # 將得到的一組特征放入網絡,求得到的輸出與對應的標簽(含噪聲)的損失l.backward() # 計算該次損失的梯度trainer.step(batch_size) # 反向傳播,基于l.backward()得到的梯度來更新模型的參數l = loss(net(features), labels_noise) # 該輪訓練結束后,求網絡對數據集特征的輸出,再求輸出和含噪聲標簽的損失print('epoch %d, mean loss: %f' % (epoch+1, l.mean().asnumpy())) # 展示訓練輪次和數據集損失的平均
具體函數解釋
trainer.step(batch_size)
:batch_size指定了當前批的大小,用于計算這次梯度下降的步長
with autograd.record():
這行代碼的作用是在其作用域內的計算將會被記錄下來,以便自動求導