用上帝的戀愛公式講線性迴歸-下

前文:用上帝的戀愛公式講線性迴歸-上

定義模型

net = nn.Sequential(nn.Linear(4, 1,bias=True))

初始化模型

定義模型初始化方式,使用默認的normal方式

def init_weights(layer):
    classname=layer.__class__.__name__
    if classname.find('Linear') != -1:
        I.normal_(layer.weight.data, std=0.1)
        print(layer.weight.data)
        I.normal_(layer.bias.data, std=0.1)
        print(layer.bias.data)

執行初始化:

net.apply(init_weights)

輸出如下:

tensor([[-0.0355, -0.0437, -0.0928,  0.1229]])
tensor([-0.0566])





Sequential(
  (0): Linear(in_features=4, out_features=1, bias=True)
)

查看參數初始化情況:

for name, param in net.named_parameters():
    print(name, param)

輸出如下:

0.weight Parameter containing:
tensor([[-0.0355, -0.0437, -0.0928,  0.1229]], requires_grad=True)
0.bias Parameter containing:
tensor([-0.0566], requires_grad=True)

定義損失函數

loss = torch.nn.MSELoss()

定義優化算法

trainer = torch.optim.SGD(net.parameters(), lr =0.06)

訓練模型

num_epochs = 200

for epoch in range(1, num_epochs+1):
    with torch.autograd.detect_anomaly():
        
        for index, (X, y) in enumerate(train_data_iter):
            #print(net(X))
            trainer.zero_grad()
            l = loss(torch.log(net(X).clamp(min=1e-20)), torch.log( y))
            l.backward()
            trainer.step()
            
        #break
    l = loss(net(test_features), test_labels)
    
    print('epoch %d, loss: %f' % (epoch, l))
epoch 1, loss: 8447828.000000
epoch 2, loss: 7849816.500000
 ......
epoch 194, loss: 2.003807
epoch 195, loss: 2.004321
epoch 196, loss: 2.339057
epoch 197, loss: 2.005957
epoch 198, loss: 2.246327
epoch 199, loss: 2.057835
epoch 200, loss: 2.034282

在驗證集上測試

因爲只是一個簡單的demo,並沒有對模型優化做更多的微調,各位有興趣,可以自行微調,把loss降到更低。

for index, (X, y) in enumerate(test_data_iter):
    print("predict y_hat:", net(X))
    print("ture_y:", y)
    break

從輸出看,我們的預測天數偏差還是比較大的,比如第一條我們預測的是58.65天,而真實情況是66.88天。我們的預測模型在測試集的表現是2,這是一個平均值,他的意義是把整個測試集所有的情況都預測完,總偏差在/測試集總數=2,他代表的是一個平均情況。

predict y_hat: tensor([[58.6569],
        [52.2799],
        [64.1686],
        [66.6607],
        [52.4029]], grad_fn=<AddmmBackward>)
ture_y: tensor([[66.8827],
        [60.7605],
        [72.7446],
        [60.7297],
        [71.2678]])

此時我們把模型中的w和b輸出,看一下我們猜的結果

for name, param in net.named_parameters():
    print(name, param)
0.weight Parameter containing:
tensor([[0.5140, 3.7515, 0.1002, 0.1017]], requires_grad=True)
0.bias Parameter containing:
tensor([-0.0554], requires_grad=True)

把上面輸出的結果和下面上帝手中公式中真實的w,b進行比較,總體來說還可以接收。

true_w = [0.5, 3.8, 0.1,  0.1]
true_b = 1

那我們現在猜的上帝手中的公式:y=0.514appearance+3.7515unhappy+0.1002study+0.1017game+by = 0.514*appearance + 3.7515 * unhappy + 0.1002*study + 0.1017*game + b 偏差b爲-0.0554。
到此我們就破解了上帝手中的戀愛公式。

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