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