这是在上一篇的基础之上,更近一部,原来的将y进行sigmoid(y)处理,变为0~1之间的概率值
一、数据准备
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])
【注意这里是Tensor,而不是tensor,要不然会出现类型不匹配】
二、模型构建
import torch.nn.functional as F
class LR_model(nn.Module):
def __init__(self):
super(LR_model, self).__init__()
self.linear = nn.Linear(1,1)
def forward(self,x):
y_pred = F.sigmoid(self.linear(x)) #与原来的唯一不同之处,Y加了个sigmoid()
return y_pred
model = LR_model()
三、定义损失函数与优化器
criterion = nn.BCELoss(size_average=False)
#原来的是MSEloss,现在是BECLoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
四、开始训练
for epoch in range(500):
optimizer.zero_grad() #清空过往梯度
y_pred = model(x_data) #带入模型
#print('y_pred',y_pred)
loss = criterion(y_pred,y_data) #计算损失
print('epoch',epoch+1,loss.item())
loss.backward() #反向传播,计算当前的梯度
optimizer.step() #根据梯度更新网络参数
梯度清零要在loss之前就OK。通常的逻辑:
1,计算预测值;2,获取loss,计算损失函数;3,梯度置0;4,反向传播,计算当前的梯度,5,根据梯度更新网络参数。
简而言之,就是进来一个batch的数据,计算一次梯度,更新一次网络
五、预测
x_t = torch.Tensor([[1],[5]])
#print("x_t",x_t)
y_t = model(x_t)
#print('y_t',y_t)
#x_t tensor([[1.],[5.]])
#y_t tensor([[0.3326],[0.7502]], grad_fn=<SigmoidBackward0>)
学习1小时及格的概率0.33,学习5小时几个的概率0.75