深度学习-3.Logistic regression for Pytorch

该文介绍了如何在PyTorch中实现逻辑回归。首先,通过生成随机数据创建自定义数据集,然后定义Sigmoid激活函数和二元交叉熵损失函数。接着,使用梯度下降法进行模型训练,包括参数初始化、反向传播和损失函数的计算。最后,调用训练函数并输出学习到的权重和偏置。
部署运行你感兴趣的模型镜像


在此之前回顾一下当前的一些可能涉及到的细节问题。在反向传播时需要通过链式法则对损失函数进行对参数求导更新,通过使用梯度下降设置学习率进行参数更新.

1-自定义数据集
import torch

# 生成 1000 个 3 维的随机数作为特征
X = torch.randn((1000, 3))

# 设定真实的权重和偏置,作为生成标签的依据
true_w = torch.tensor([2, -3, 4], dtype=torch.float32)
true_b = torch.tensor([4.2], dtype=torch.float32)

# 生成标签,使用 sigmoid 函数将标签转化为 0 或 1
h = torch.mm(X, true_w.reshape(-1, 1)) + true_b
Y = 1 / (1 + torch.exp(-h))
labels = torch.where(Y > 0.5, torch.tensor([1], dtype=torch.float32), torch.tensor([0], dtype=torch.float32))
#labels = (Y > 0.5).float()# 简化代码

2-模型函数和损失函数
# 定义自定义 sigmoid 函数
#torch.sigmoid(logits)
def sigmoid(x):
    return 1 / (1 + torch.exp(-x))

# 定义自定义损失函数 交叉熵
#torch.nn.functional.binary_cross_entropy(Y_pred, labels.float())
def binary_cross_entropy_loss(Y_pred, Y_true):
    loss = -torch.mean(Y_true * torch.log(Y_pred) + (1 - Y_true) * torch.log(1 - Y_pred))
    return loss

3-优化算法梯度下降

requires_grad 属性设为 True,表示需要计算梯度
loss.backward():计算当前梯度。
with torch.no_grad()::开启一个上下文管理器,表示后面的操作不需要计算梯度。

# 定义自定义梯度下降函数 learning_rate 学习率 num_iterations 迭代次数
def gradient_descent(X, Y_true, learning_rate, num_iterations):
    # 初始化参数 w 和 b
    w = torch.randn((X.shape[1], 1), dtype=torch.float32, requires_grad=True)
    b = torch.randn((1, 1), dtype=torch.float32, requires_grad=True)
	#训练迭代
    for i in range(num_iterations):
        # 计算预测值 Y_pred 和损失函数
        Y_pred = sigmoid(torch.mm(X, w) + b)
        loss = binary_cross_entropy_loss(Y_pred, Y_true)

		#反向传播
        # 计算损失函数对参数的梯度,并更新参数
        loss.backward()#
        with torch.no_grad():
            w -= learning_rate * w.grad#更新参数
            b -= learning_rate * b.grad
            # 清空梯度 缓存,避免梯度累积
            w.grad.zero_()
            b.grad.zero_()

        # 每 100 次迭代打印一次损失函数的值
        if (i + 1) % 100 == 0:
            print("Iteration [{}/{}], Loss: {:.4f}".format(i + 1, num_iterations, loss.item()))

    return w, b

4-调用梯度下降函数进行模型训练
# 调用梯度下降函数进行模型训练
learning_rate = 0.01
num_iterations = 1000
w, b = gradient_descent(X, labels, learning_rate, num_iterations)

# 打印训练得到的权重和偏置
print("Weight:", w.reshape(-1).detach().numpy())
print("Bias:", b.reshape(-1).detach().numpy())
#detach() 方法用于将张量从计算图中分离出来 将其转化为CPU上的NumPy数组

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 使用PyTorch实现Logistic回归并计算偏导数 Logistic回归是一种用于解决二分类问题的模型。在PyTorch中,可以通过定义前向传播和反向传播来实现Logistic回归,并利用`autograd`机制自动计算梯度。以下是详细的实现步骤和代码示例。 #### 1. 定义Logistic回归模型 Logistic回归的核心是通过sigmoid函数将线性模型的输出映射到[0, 1]区间,从而表示概率值。sigmoid函数定义如下: \[ \sigma(z) = \frac{1}{1 + e^{-z}} \] 其中 \( z = w^T x + b \),\( w \) 是权重,\( b \) 是偏置,\( x \) 是输入特征。 #### 2. 实现Logistic回归 以下是一个使用PyTorch实现Logistic回归的完整示例: ```python import torch import torch.nn as nn import torch.optim as optim # 定义Logistic回归模型 class LogisticRegression(nn.Module): def __init__(self, input_size): super(LogisticRegression, self).__init__() self.linear = nn.Linear(input_size, 1) # 线性层 def forward(self, x): y_pred = torch.sigmoid(self.linear(x)) # 使用sigmoid激活函数 return y_pred # 创建数据集 torch.manual_seed(42) input_size = 5 X = torch.randn(100, input_size) # 输入特征 y = torch.randint(0, 2, (100, 1)).float() # 输出标签(0或1) # 初始化模型、损失函数和优化器 model = LogisticRegression(input_size) criterion = nn.BCELoss() # 二元交叉熵损失 optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(100): # 前向传播 y_pred = model(X) # 计算损失 loss = criterion(y_pred, y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}') ``` #### 3. 计算偏导数 在PyTorch中,`autograd`会自动记录每一步的计算操作,并生成计算图。通过调用`backward()`方法,可以计算每个参数的梯度。例如,在训练过程中,可以通过以下方式访问权重和偏置的梯度: ```python # 查看权重和偏置的梯度 for name, param in model.named_parameters(): if param.requires_grad: print(f'{name}: Gradient - {param.grad}') ``` #### 4. 梯度计算原理 在前向传播过程中,PyTorch会构建计算图并将每个操作记录在`grad_fn`中[^1]。完成前向传播后,调用`backward()`方法会从根节点开始反向传播,根据链式法则计算每个叶子节点的梯度。 #### 5. 示例中的关键点 - **Sigmoid函数**:将线性模型的输出映射到概率值。 - **BCELoss**:二元交叉熵损失函数,适用于二分类问题。 - **Autograd机制**:自动计算梯度,简化了手动求导的过程[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elvis_hui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值