定義模型
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
那我們現在猜的上帝手中的公式: 偏差b爲-0.0554。
到此我們就破解了上帝手中的戀愛公式。