逻辑斯蒂模型 用来解决分类问题。
如果第5节的问题是 是否通过,则是一个二分类问题。
得到的输出是通过考试的概率P。概率P在0到1之间。
原来的线性模型输出范围是R (实数),通过逻辑斯蒂函数可以将原来的输出映射到[0,1]范围内。
将线性模型改成逻辑斯蒂模型只要改两处,模型加上sigmod()和损失函数改成BCELoss
完整代码:
import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt # 1.准备数据,注意都是矩阵形式 x_data = torch.Tensor([[1.0], [2.0], [3.0]]) y_data = torch.Tensor([[0], [0], [1]]) # 2.设计模型(类) 继承nn.Module 以便使用其方法 class LogisticRegressionModel(torch.nn.Module): # 初始化 def __init__(self): super(LogisticRegressionModel, self).__init__() self.linear = torch.nn.Linear(1, 1) # Linear是一个线性单元 # 前馈方法 def forward(self, x): y_pred = F.sigmoid(self.linear(x)) # 实际上调用对象linear的__call__()方法,linear的__call__()方法执行forward前馈 return y_pred model = LogisticRegressionModel() # 3 loss 和 optimizer(优化器) criterion = torch.nn.BCELoss(size_average=False) # 不需要求均值 # 优化器。 model.parameters()获取模型中需要优化的参数,lr(learning rate,学习率) optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 4 训练过程 for epoch in range(1000): # 前馈 y_pred = model(x_data) # 计算损失 loss = criterion(y_pred, y_data) print("epoch={},loss={}".format(epoch, loss)) optimizer.zero_grad() # 归零 # 反向传播 loss.backward() # 更新、优化参数 optimizer.step() # Test, 查看模型参数及测试训练效果 x_test = torch.Tensor([[4.0]]) y_test = model(x_test) print('y_pred = {} for x = {}'.format(y_test.data, x_test.data)) #绘图 x = np.linspace(0,10,200) x_t = torch.Tensor(x).view((200, 1)) y_t = model(x_t) y = y_t.data.numpy() plt.plot(x, y) plt.plot([0,10], [.5,.5], c='r') plt.xlabel('Hours') plt.ylabel('Probability of Pass') plt.grid() plt.show()