分类问题不是让“预测值”等于“类别”,而是计算属于每个类别的概率,要概率最大的。(将预测值通过Sigmoid函数从实数空间映射到[0,1])
Logistic函数(仅仅是sigmiod函数中最典型的一种):
x→+,
(x)→1;x→-
,
(x)→0;x=0,
(x)=1/2
计算图:
相比线性单元,Logistic回归单元后面多了一个Sigmiod激活函数。
二分类问题的损失函数:
y=1时,loss= ,
越大,loss越小,预测越准确;
y=0时,loss=-log(1-) ,
越小,loss越小,预测越准确;
代码示例:
import torch.nn.functional as F
import torch
import numpy as np
import matplotlib.pyplot as plt
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])
class LogisticRegressionModel(torch.nn.Module):
def __init__(self):
super(LogisticRegressionModel, self).__init__()
self.linear = torch.nn.Linear(1, 1) #线性计算
def forward(self, x):
y_pred = F.sigmoid(self.linear(x))
return y_pred
model = LogisticRegressionModel()
criterion = torch.nn.BCELoss(size_average=False) #求损失
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) #优化
for epotch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epotch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred=', y_test.data)
#下面是利用上面的模型进行预测
x = np.linspace(0, 10, 200) #从0-10生成200个样本点
x_t = torch.Tensor(x).view((200,1)) #将样本点变成200行1列的矩阵
y_t = model(x_t)
y = y_t.data.numpy() #得到list
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()
输出结果:
> y_pred= tensor([[0.8787]])
torch.sigmoid(input, out=none),是一个函数,输入输出都是Tensor类型。
torch.nn.sigmoid(),是一个类,使用时需要进行实例化。
torch.nn.functional.sigmiod(input),是一个函数。
torch.nn.BCELoss() 是二分类交叉熵损失,只是CrossEntropyLoss()的一种,只是仅用于二分类问题。