MXNET深度學習框架-10-使用正則化方法解決過擬合問題(以使用gluon的線性迴歸爲例)

上一章沒有使用gluon實現了L2正則化解決過擬合問題,本章使用過gluon來實現以下相關代碼:

import mxnet.ndarray as nd
import mxnet.autograd as ag
import mxnet.gluon as gn
import matplotlib.pyplot as plt
import random

n_train, n_test, num_inputs = 20, 100, 200
true_w, true_b = nd.ones((num_inputs, 1)) * 0.01, 0.05

features = nd.random.normal(shape=(n_train + n_test, num_inputs))
labels = nd.dot(features, true_w) + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)
train_features, test_features = features[:n_train, :], features[n_train:, :]
train_labels, test_labels = labels[:n_train], labels[n_train:]
'''---數據讀取---'''
# 定義一個函數讓它每批次讀取數據(batch_size)
batch_size=10
dataset=gn.data.ArrayDataset(train_features,train_labels)
data_iter=gn.data.DataLoader(dataset=dataset,batch_size=batch_size,shuffle=True)
# 損失函數定義

square_loss=gn.loss.L2Loss()
'''--------L2範數正則化----------'''
def test(net,X,y):
    return square_loss(y,net(X)).mean().asscalar()
def train(weight_decay):
    net = gn.nn.Sequential()
    net.add(gn.nn.Dense(1))
    net.initialize()
    trainer = gn.Trainer(net.collect_params(), "sgd",
                         {"learning_rate": 0.005, "wd": weight_decay})
    train_loss, test_loss = [], []
    for _ in range(10):
        for X, y in data_iter:
            with ag.record():
                l = square_loss(y,net(X))
            l.backward()
            # 對兩個Trainer實例分別調用step函數,從而分別更新權重和偏差
            trainer.step(batch_size)

        train_loss.append(test(net, train_features, train_labels))
        test_loss.append(test(net, test_features, test_labels))
    plt.plot(train_loss)
    plt.plot(test_loss)
    plt.legend(["train", "test"])
    plt.show()
    print(net[0].weight.data()[:, 10], net[0].bias.data())  # 取出所在層的權重
train(0)  # 不使用懲罰項
# train(3)  # 使用懲罰項


運行結果:
在這裏插入圖片描述
當使用了正則化後:

train(3)  # 使用懲罰項

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章