回顾一下numpy训练逻辑回归模型的过程:

  1. 数据准备,参数初始化
  2. 前向计算
  3. 计算损失
  4. 计算梯度
  5. 更新参数
  6. 重复2至5步,观察损失函数值,调整学习率

pytorch提供了大量的封装好的计算函数,所以实现起来变得更加简洁和明了。

下面我们一步步地分解pytorch的逻辑回归实现

1. 数据准备,初始化参数

import torch
from sklearn.datasets import load_iris

data, target = load_iris(return_X_y=True)

x = torch.tensor(data[50:150], dtype=torch.float32) # 指定输入x
y = torch.tensor(target[:100], dtype=torch.float32).reshape(100,1) # 指定输入y
w = torch.randn(1, 4, requires_grad=True) # 初始化参数w
b = torch.randn(1, requires_grad=True) # 初始化参数b

learn_rate = 0.01 # 学习率
n_iters = 5000 # 最大迭代次数

2. 前向计算

y_ = torch.nn.functional.linear(input=x, weight=w, bias=b)   # 计算线性输出
sy_ = torch.sigmoid(y_)    # 计算逻辑分布运算(输出的值可以作为概率使用)

pytorch的线性计算($Wx+b$)已经被封装到了torch.nn.functional.linear中,可以直接调用。sigmoid也有torch的实现。

3. 计算损失

# 损失函数
loss_mean = torch.nn.functional.binary_cross_entropy(sy_, y, reduction="mean")

逻辑回归中的损失函数,也成之为交叉熵损失

$Loss =\sum\limits_{i \in \text{数据集}}y_i\ ln(h(x_i)) +(1-y_i)\ln(1-h(x_i))$

4. 计算梯度

梯度计算通过损失函数的backward自动完成。梯度值自动保存在变量$W$和$b$中。

# backward:计算梯度
loss_mean.backward()

5. 更新参数

with torch.autograd.no_grad():   # 关闭梯度计算跟踪
        w -= learn_rate * w.grad     # 更新权重梯度
        w.grad.zero_()     # 清空本次计算的梯度(因为梯度是累加计算,不清空就累加)
        b -= learn_rate * b.grad     # 更新偏置项梯度
        b.grad.zero_() # 清空本次计算的梯度

完整代码实现

更多推荐