PyTorch深度学习——Logistic回归(二分类问题)

一、logistic回归原理及要点

(1)回归输出的是预测的数值,而二分类或者多分类输出的是属于某类别的概率,最后取最大概率的那一类别。

(2)两种实现神经网络中非线性化的方式:

  • 高层API:使用torch.nn.___,例如torch.nn.Sigmoid()
  • 低层API:使用torch.nn.functional.___,例如torch.nn.functional.sigmoid()
  • 由于高层API是以类的形式调用,有关于全连接层的权重矩阵,偏置矩阵都可以作为类的属性保留,而底层API仅是调用类中的函数运算,不能保存这些信息。高层会依赖低层的计算功能,例如torch.nn.Linear依赖于F.linear()
    参考:pytorch教程之nn.Module类详解——使用Module类来自定义网络层

(3)nn.Linear类可以建立一个线性层,来代替初始化的工作,用于实现 y = x ⋅ w T + b y=x·w^T+b y=xwT+b的功能。简单讲述一下nn.Linear()这个函数的参数:

torch.nn.Linear(in_features, out_features, bias)
1> in_features:上一层的神经元个数(输入x的维度)
2> out_featurs:这一层的神经元个数(输出的维度)
3> bias:偏置,默认是True
Examples:
	F = torch.nn.Linear(10, 20)
	input = torch.randn(120, 10) #生成120×10的服从(0,1)正态分布的随机数矩阵
	output = F(input) #经过一层线性变化
	print(output.size()) #从120x10变成120x20
Out[1]:
	torch.Size([120, 20])

(4)构造神经网络的基本步骤和线性回归一样,重点介绍一下二分类的损失函数(Binary Classification Error),该损失函数是基于交叉熵的概念得到的,交叉熵概念看第(5)点。
B C E = − [ y l o g y ˆ + ( 1 − y ) l o g ( 1 − y ˆ ) ] BCE=-\left[ylog\^y+(1-y)log(1-\^y)\right] BCE=[ylogyˆ+(1y)log(1yˆ)]

(5)交叉熵简单理解就是当已知真实值y与预测值y_hat的分布情况后,可以通过计算两者之间的相似度来判断预测的准确性,相似度越大越好,而上文的BCE则是加了一个负号,表示损失越小越好。例如下图中计算D分布和T分布的相似度:
在这里插入图片描述

二、完整代码

import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.nn.functional as F

#1.Prepare training set
x_data = torch.Tensor([[1.0],[2.0],[3.0]])  #数据集是tensor,且写成矩阵的形式
y_data = torch.Tensor([[0],[0],[1]]) #二分类问题,y的取值是0、1

#2.Design model 构建计算图(Logistic Regression Unit)
class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  #(in_features, out_features, bias = True)    
    def forward(self, x):
        y_pred = F.sigmoid(self.linear(x))  #self.linear是callable的,是可调用的对象
        return y_pred
    
#实例化
model = LogisticRegressionModel()

#3.Construct Loss and OPtimizer
criterion = torch.nn.BCELoss(size_average = False) #Binary Classification Error
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01) #优化器

#4.Training Cycle 训练并更新
for epoch in range(1000):
    y_pred = model(x_data) #使用了实例model,调用了前馈forward
    loss = criterion(y_pred, y_data) #求损失loss
    print(epoch, loss.item())
    
    optimizer.zero_grad() #梯度归零??
    loss.backward() #反向传播
    optimizer.step() #更新

#5.Output weight and bias
print('w = ', model.linear.weight.item())
print('b = ', model.linear.bias.item())

#6.Test Model
x_test = torch.Tensor([[1.0]])  #用一个已知的数据来测试?
y_test = model(x_test)
print('y_pred = ', y_test.data) # 取tensor数值

#7.view
x = np.linspace(0, 10, 200)
x_t = torch.Tensor(x).view((200, 1)) #相当于reshape成200*1
y_t = model(x_t)
y = y_t.data.numpy()  #将标量转换成矩阵的形式
plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5])
plt.ylabel('Probability of Pass')
plt.xlabel('Learning Hours')
plt.show()

运行结果:
图1
图2

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用PyTorch进行二分类问题深度学习,你可以按照以下步骤进行: 1. 数据准备:首先,你需要准备好你的训练数据和测试数据。确保数据已经被正确标记,并且已经分为训练集和测试集。 2. 数据加载:使用PyTorch的DataLoader模块加载数据集。可以使用自定义的Dataset类来加载数据,并使用DataLoader将其转化为可供模型使用的小批量数据。 3. 搭建模型:定义一个神经网络模型。可以使用PyTorch提供的nn.Module类来创建自己的模型。对于二分类问题,通常使用一个带有一层输出的全连接层。 4. 定义损失函数:选择合适的损失函数来度量模型预测结果与真实标签之间的差异。对于二分类问题,可以使用二元交叉熵损失函数(Binary Cross Entropy Loss)。 5. 选择优化器:选择一个优化器来更新模型参数。常见的优化器包括随机梯度下降(SGD)、Adam、RMSprop等。根据需求选择合适的优化器。 6. 训练模型:使用训练数据对模型进行训练。通过迭代训练数据的小批量样本,计算损失并反向传播更新模型参数。 7. 测试模型:使用测试数据评估模型的性能。计算模型在测试数据上的准确率、精确率、召回率等指标。 8. 调整超参数:根据模型在测试集上的性能,可以调整模型的超参数(如学习率、批量大小等)以获得更好的性能。 9. 预测新样本:使用训练好的模型对新样本进行预测。将新样本输入模型中,得到预测结果。 以上是一个基本的流程,你可以根据自己的需求进行相应的调整和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值