Pytorch深度学习实践 第六讲 逻辑回归

分类问题不是让“预测值”等于“类别”,而是计算属于每个类别的概率,要概率最大的。(将预测值通过Sigmoid函数从实数空间映射到[0,1])

Logistic函数(仅仅是sigmiod函数中最典型的一种):

x→+\infty\sigma(x)→1;x→-\infty\sigma(x)→0;x=0,\sigma(x)=1/2

Pytorch深度学习实践 第六讲 逻辑回归_第1张图片

 计算图:

相比线性单元,Logistic回归单元后面多了一个Sigmiod激活函数。

Pytorch深度学习实践 第六讲 逻辑回归_第2张图片

 二分类问题的损失函数:

y=1时,loss=-y*log\hat{y} , \hat{y}越大,loss越小,预测越准确;

y=0时,loss=-log(1-\hat{y}) , \hat{y}越小,loss越小,预测越准确;

Pytorch深度学习实践 第六讲 逻辑回归_第3张图片

代码示例:

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]])

Pytorch深度学习实践 第六讲 逻辑回归_第4张图片

 torch.sigmoid(input, out=none),是一个函数,输入输出都是Tensor类型。

torch.nn.sigmoid(),是一个类,使用时需要进行实例化。

 torch.nn.functional.sigmiod(input),是一个函数。

torch.nn.BCELoss() 是二分类交叉熵损失,只是CrossEntropyLoss()的一种,只是仅用于二分类问题。

你可能感兴趣的:(pytorch学习)