1、pytorch nn实现逻辑回归
逻辑回归原理:
import torch
from torch import nn
from torch.autograd import Variable # 导入Variable函数进行自动求导,有了Variable PyTorch才能实现自动求导功能
torch.manual_seed(2)
x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0], [4.0]]))
y_data = Variable(torch.Tensor([[5.0], [6.0], [8.0], [2.0]]))
# 定义网络模型 线性模型,具体时由损失函数决定模型的
# 先建立一个基类Model,都是从父类torch.nn.Module中继承过来,PyTorch写网络的固定写法
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__() # 初始父类
self.linear = nn.Linear(1, 1) # 输入维度和输出维度都为1
def forward(self, x):
return self.linear(x)
model = Model() # 实例化
# 定义Loss和优化方法
criterion = nn.BCEWithLogitsLoss() # 损失函数,封装好的逻辑损失函数
# #PyTorch类方法正则化方法,添加一个weight_decay参数进行正则化 梯度下降法
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=0.001)
# 训练前数据
hour_var = Variable(torch.Tensor([[2.0]]))
y_pred = model(hour_var)
print("predict (before training) given", 2, "is", float(model(hour_var).data[0][0] > 0.5))
# 迭代次数
epochs = 40
for epoch in range(epochs):
# 计算grads and cost
y_pred = model(x_data) # x_data 输入数据进入模型中
loss = criterion(y_pred, y_data)
optimizer.zero_grad() # 梯度清零 为什么要梯度清零
loss.backward() # 反向传播
optimizer.step() # 优化迭代
# 验证模型 以0.5为界
hour_var = Variable(torch.Tensor([[2.0]]))
y_pred = model(hour_var) # 预测结果
print("predict (after training) given", 2, "is", float(model(hour_var).data[0][0] > 0.5))
结果:
before training:input 2, out 0.0
after training: input 2, out 1.0