1. 程式人生 > >動手學深度學習(一)——邏輯迴歸(gluon)

動手學深度學習(一)——邏輯迴歸(gluon)

文章作者:Tyan
部落格:noahsnail.com  |  CSDN  |  簡書

注:本文為李沐大神的《動手學深度學習》的課程筆記!

# 匯入mxnet
import mxnet as mx

# 設定隨機種子
mx.random.seed(2)

from mxnet import gluon
from mxnet import ndarray as nd
from mxnet import autograd
from mxnet import image

輔助函式

from utils import load_data_fashion_mnist, accuracy, evaluate_accuracy

獲取和讀取資料

# 批資料大小
batch_size = 256

# 獲取訓練資料和測試資料
train_data, test_data = load_data_fashion_mnist(batch_size)

定義和初始化模型

# 定義一個空的模型
net = gluon.nn.Sequential()

# name_scope作用, 方便管理引數命名
with net.name_scope():
    # 加入一個平鋪層, 其會將輸入資料平鋪為batch_size*?維
    net.add(gluon.nn.Flatten())
    # 加入一個全連線層, 輸出為10類
net.add(gluon.nn.Dense(10)) # 引數初始化 net.initialize()

Softmax和交叉熵損失函式

# 定義交叉熵損失
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()

優化

# 定義訓練器和優化方法
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.1})

訓練

# 定義迭代週期
epochs = 5

# 訓練
for epoch in range(epochs):
    # 訓練損失
train_loss = 0.0 # 訓練集準確率 train_acc = 0.0 # 迭代訓練 for data, label in train_data: # 記錄梯度 with autograd.record(): # 計算輸出 output = net(data) # 計算損失 loss = softmax_cross_entropy(output, label) # 反向傳播求梯度 loss.backward() # 梯度下降 trainer.step(batch_size) # 總的訓練損失 train_loss += nd.mean(loss).asscalar() # 總的訓練準確率 train_acc += accuracy(output, label) # 測試集的準確率 test_acc = evaluate_accuracy(test_data, net) print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % ( epoch, train_loss / len(train_data), train_acc / len(train_data), test_acc))
Epoch 0. Loss: 0.793821, Train acc 0.744107, Test acc 0.786659
Epoch 1. Loss: 0.575076, Train acc 0.809879, Test acc 0.820112
Epoch 2. Loss: 0.530560, Train acc 0.822583, Test acc 0.831731
Epoch 3. Loss: 0.506161, Train acc 0.829728, Test acc 0.835837
Epoch 4. Loss: 0.488752, Train acc 0.834769, Test acc 0.834135