深度學習mxnet::線性迴歸(簡單版本)

線性迴歸(簡單版本)


僅作爲記錄,不作詳解

#導入
from mxnet import autograd,nd
from mxnet import gluon
#生成數據
#模型:y=Xw+b+ϵ
  
#設置特徵數、樣本數
num_inputs=2
num_examples=1000
#設置真實的權值w和偏移b
true_w=[2,-3.4]
true_b=4.2
#隨機生成 兩列1000行的數據,features的每一行是一個長度爲2的向量   (相當於X)
features=nd.random.normal(scale=1,shape=(num_examples,num_inputs))
#標籤生成 ,labels的每一行是一個長度爲1的向量  (相當於Y)
labels=true_w[0]*features[:,0]+true_w[1]*features[:,1]+true_b
labels+=nd.random.normal(scale=0.01,shape=labels.shape)

#輸出看一下
print(features[0], labels[0])

 

#讀取數據
batch_size=10
dataset=gluon.data.ArrayDataset(features,labels)
data_iter=gluon.data.DataLoader(dataset,batch_size,shuffle=True)

#看一下隨機生成的小樣本集
for data,label in data_iter:
    print(data,label)
    break

 

#定義模型
#Sequential()容器,可以不斷加神經網絡的層數
net=gluon.nn.Sequential()
#加入一個dense層,即全連接層
#唯一參數爲輸出節點的個數,線性迴歸中爲1
#不需要輸入節點的個數,這個會自動賦值
net.add(gluon.nn.Dense(1))

#初始化模型參數
net.initialize()
#定義損失函數
square_loss=gluon.loss.L2Loss()

#優化算法,這裏用梯度下降
trainer=gluon.Trainer(
    net.collect_params(),"sgd",{'learning_rate':0.1})
#開始訓練,與0到1建立版本差不多
epochs=5
batch_size=10
for e in range(epochs):
    total_loss=0
    for data,label in data_iter:
        with autograd.record():
            output=net(data)
            loss=square_loss(output,label)
        loss.backward()
        trainer.step(batch_size) #走一步,即訓練--更新參數一次
        #這裏就直接將每次計算的loss加起來
        total_loss+=nd.sum(loss).asscalar()
    #最後再將總的loss/總樣本數得到均值
    #這裏寫法與《線性迴歸從0到1建立》有所不同,但實際上做的是一個事情
    print("epoch %d,average loss:%f"%(e,total_loss/num_examples))

 

#查看訓練後的參數
dense=net[0]
print("model w is:",dense.weight.data())
print("true w is:",true_w)
print("model b is:",dense.bias.data())
print("true b is:",true_b)

 

 

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