動手學深度學習(一)——邏輯迴歸(gluon)
阿新 • • 發佈:2019-01-02
文章作者: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