用上帝的恋爱公式讲线性回归-下

前文:用上帝的恋爱公式讲线性回归-上

定义模型

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。
到此我们就破解了上帝手中的恋爱公式。

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