本讲小结
- 上节我们的任务是在一定的学习时间下预测分数。而这一讲的任务变成,根据已有的样本,判断需要多少学习时间可以通过考试。通过与不通过,变成一个二分类的任务。对于分类任务,其标签我们常采用one-hot编码格式。
- 由于线性层的输出是一个连续的实数空间,对于该例子的分类任务,我们需要知道的是在一定的学习时间下,通过与不通过的概率。如何将一个连续的实数空间映射成概率分布,这就需要
S
i
g
m
o
i
d
Sigmoid
Sigmoid函数。
1,数据准备
import torch
import matplotlib.pyplot as plt
# 1,准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
# 类别标签one-hot编码
y_data = torch.Tensor([[0.0], [0.0], [1.0]])
2,设计模型
相比较于上一节的设计模型代码,在前向传播中,多了一个非线性映射。
# 2,设计模型
class LogisticRegression(torch.nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self,x):
output = torch.nn.Sigmoid()(self.linear(x))
return output
model = LogisticRegression()
3,构建损失函数和优化器
# 3,构建损失函数和优化器
critrion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(params=model.parameters(),lr=0.01)
损失函数采用的是二值损失函数
- 如图所示,当预测值越接近真实值1,损失越小。那么,对于一个mini-batch的损失,同样是求和在平均。pytorch当中,大部分损失函数都有这样的操作。
- 实际上看上去这个损失函数有两项,但实际上只有一项产生作用。当我们预测的是真值时,前一项发挥作用。当我们预测非真值时,即在有些任务中,也许越接近0越好,是后一项发挥作用。
4,训练循环
# 4,训练周期
l = []
for epoch in range(100):
y_pred = model(x_data)
loss = critrion(y_pred,y_data)
l.append(loss.item())
# 先梯度清零再反向传播,更新梯度
optimizer.zero_grad()
loss.backward()
optimizer.step()
完整过程
import torch
import matplotlib.pyplot as plt
# 1,准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
# 类别标签one-hot编码
y_data = torch.Tensor([[0.0], [0.0], [1.0]])
# 2,设计模型
class LogisticRegression(torch.nn.Module):
def __init__(self):
super(LogisticRegression, self).__init__()
self.linear = torch.nn.Linear(1,1)
def forward(self,x):
output = torch.nn.Sigmoid()(self.linear(x))
return output
model = LogisticRegression()
# 3,构建损失函数和优化器
critrion = torch.nn.BCELoss()
optimizer = torch.optim.SGD(params=model.parameters(),lr=0.01)
# 4,训练周期
l = []
for epoch in range(100):
y_pred = model(x_data)
loss = critrion(y_pred,y_data)
l.append(loss.item())
# 先梯度清零再反向传播,更新梯度
optimizer.zero_grad()
loss.backward()
optimizer.step()
plt.rc('legend', fontsize=14)
fig = plt.figure(figsize=(10,5.5),dpi=100)
plt.plot(l,marker='d',label='LoitsRegression')
plt.xlabel('epoch',fontsize=14)
plt.ylabel('loss',fontsize=14)
plt.legend()
plt.show()
实验结果
测试模型
使用上面训练得到的模型进行测试
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1)) #类似于np的reshape
y_t = model(x_t) #进行测试
y = y_t.data.numpy()
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()
测试结果
- 根据我们的数据,其实很容易可以知道,模型学习到的效果就是大于等于2.5小时则有更大的可能性判通过考试。以下预测结果显示,学习时间越接近2.5小时,通过考试的概率越接近0.5,学习时间越长。通过考试的概率越大。