#pt#课堂笔记_6 logistic回归

-mnist

 

 

 

Torchvision里面已经有了一些数据集

Train要训练集还是测试集

要下载就设置True不用下载则False

-cifar-10

32*32的小图片分为十类,训练集五万个测试集1万样本

 

-logistic函数

 

 

 

在x=+-5左右会接近饱和情况

这个sigmoid函数的导数类似于正态分布

输出的值就是通过的概率,不是说它会直接表示概率,而是我们想要表示概率则必须让输出值在0-1之间。

 

以下均为sigmoid函数,只是logistic函数最有代表性。

 

 

激活函数:我们希望输出值在0到+1之间 我们会用logistic函数

如果我们希望输出值在-1到+1之间则会用tanh函数等

 

原来mse是计算两个实数值之间的差值,计算距离,希望距离最小化

现在输出是分布,计算的是分布的差异。

 

 

我们可以用这个式子表示两个分布间的差异性大小。希望它越小越好。

-称二分类的损失为BCE

Y_hat经过一次sigmoid为分数,再经过log如果不加负号会变为负数

 

-模型的改变

 

 

import torch.nn

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel).__init__()
        self.linear = torch.nn.Linear(1,1)
        
    def forward(self):
        y_pred = self.linear(x)
        return y_pred

-BCS CE指交叉熵

 

如果求平均,损失变小了,导数变小,此处会影响我们如何选择学习率。

 

 

 

import torch.nn
import torch.nn.functional as F
x_data = torch.tensor([[1.0],[2.0],[3.0]])
y_data = torch.tensor([[0.0],[1.0],[0.0]])

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1,1)
    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = LinearModel()

criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())

x_test = torch.Tensor([[4.0]])
y_test = model(x_test)

print('y_pred=',y_test.data)



import numpy as np
import matplotlib.pyplot as plt
import torch.nn
import torch.nn.functional as F
x_data = torch.tensor([[1.0],[2.0],[3.0]])
y_data = torch.tensor([[0.0],[0.0],[1.0]])

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1,1)
    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred
model = LinearModel()

criterion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())

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行一列的矩阵
y_t= model(x_t)
y = y_t.data.numpy()
plt.plot(x,y)
plt.xlabel('hours')
plt.plot([0,10],[0.5,0.5],c='r')
plt.ylabel('probability of pass')
plt.grid()
plt.show()

 

posted @ 2021-10-09 21:03  tanyayangyang  阅读(94)  评论(0)    收藏  举报