逻辑回归torch.nn实现

废话不说,直接看代码。

python 复制代码
import torch
from torch import nn
from torch.autograd import Variable
from torch.utils.data import DataLoader,TensorDataset
import matplotlib.pyplot as plt
import numpy as np
import os
os.environ["KMP_DUPLICATE_LIB_OK"]  =  "TRUE"


# 假数据
n_data = torch.ones(100, 2)  # 数据的基本形态
x0 = torch.normal(2 * n_data, 1)  # 类型0 x data (tensor), shape=(100, 2),好处共享均值和设置张量size
y0 = torch.zeros(100)  # 类型0 y data (tensor), shape=(100, 1)
x1 = torch.normal(-2 * n_data, 1)  # 类型1 x data (tensor), shape=(100, 1)
y1 = torch.ones(100)  # 类型1 y data (tensor), shape=(100, 1)


# 注意 x, y 数据的数据形式是一定要像下面一样 (torch.cat 是在合并数据)
x = torch.cat((x0, x1), 0).type(torch.FloatTensor)  # FloatTensor = 32-bit floating
y = torch.cat((y0, y1), 0).type(torch.FloatTensor)  # LongTensor = 64-bit integer


plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')
plt.show()

# class LogisticRegression(nn.Module):
#     def __init__(self):
#         super(LogisticRegression, self).__init__()
#         self.linear = nn.Linear(2, 1)
#         self.sm = nn.Sigmoid()

#     def forward(self, x):
#         x = self.lr(x)
#         x = self.sm(x)
#         return x
logistic_model =  nn.Sequential()
logistic_model.add_module('linear',nn.Linear(2,1))
logistic_model.add_module('sm',nn.Sigmoid())

# logistic_model = LogisticRegression()
if torch.cuda.is_available():
    logistic_model.cuda()
    
    
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(logistic_model.parameters(), lr=1e-3, momentum=0.9)

# batch_size = 32
# data_iter = load_data(X,Y,batch_size)
def set_data(X,Y):
    index_slice = list(range(X.shape[0]))
    np.random.shuffle(index_slice)
    x =  X[index_slice]
    y =  Y[index_slice]
    if torch.cuda.is_available():
        x_data = Variable(x).cuda()
        y_data = Variable(y).cuda()
    else:
        x_data = Variable(x)
        y_data = Variable(y)
    return x_data,y_data


Train_Loss_list = []
Train_acc_list = []

# 开始训练
for epoch in range(10000):
    x_data,y_data = set_data(x,y)
    out = logistic_model(x_data)
    out = out.view(-1,1)
    y_data = y_data.view(-1,1)
    loss = criterion(out, y_data)
    print_loss = loss.data.item()
    mask = out.ge(0.5).float()  # 以0.5为阈值进行分类
    correct = (mask == y_data).sum()  # 计算正确预测的样本个数
    acc = correct.item() / x_data.size(0)  # 计算精度
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    Train_Loss_list.append(print_loss)
    Train_acc_list.append(acc)
    # 每隔2000轮打印一下当前的误差和精度
    if (epoch + 1) % 2000== 0:
        print('-' * 20)
        print('epoch {}'.format(epoch + 1))  # 训练轮数
        print('当前损失 {:.6f}'.format(print_loss))  # 误差
        print('当前精度 {:.6f}'.format(acc))  # 精度
        
        
        
logistic_model.state_dict()

x11= range(0,10000)
y11= Train_Loss_list
plt.xlabel('Train loss vs. epoches')
plt.ylabel('Train loss')
plt.plot(x11, y11,'.',c='b',label="Train_Loss")
plt.legend()
plt.show()

x11= range(0,10000)
y11= Train_acc_list
plt.xlabel('Train acc vs. epoches')
plt.ylabel('Train acc')
plt.plot(x11, y11,'.',c='b',label="Train_acc")
plt.legend()
plt.show()

# 结果可视化
w0, w1 = logistic_model.linear.weight[0]
w0 = float(w0.item())
w1 = float(w1.item())
b = float(logistic_model.linear.bias.item())
plot_x = np.arange(-7, 7, 0.1)
plot_y = (-w0 * plot_x - b) / w1
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')
plt.plot(plot_x, plot_y)
plt.show()
相关推荐
IT猿手2 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
蜡笔小新..4 小时前
从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率
人工智能·pytorch·机器学习·分类·cifar-10
万能程序员-传康Kk5 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球5 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788115 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~5 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子5 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
奋斗者1号6 小时前
机器学习之决策树模型:从基础概念到条件类型详解
人工智能·决策树·机器学习
程序媛小盐6 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle6 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型