美文网首页
Pytorch学习之线性回归分类

Pytorch学习之线性回归分类

作者: 骆旺达 | 来源:发表于2019-01-05 10:56 被阅读0次

    pytorch学习之回归分类

    引用库

    import matplotlib.pyplot as plt
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.autograd import Variable
    import numpy as np
    

    数据导出

    with open("G:\大四\pytorch学习\learning_pyTorch_with_SherlockLiao-master\Chapter_3\logistRegression/data.txt",'r') as f:
        # 读每行数据
        data_list = f.readlines()
        # 通过换行分割数据
        data_list = [i.split('\n')[0] for i in data_list]
        # 通过,分割数据![image.png](https://img.haomeiwen.com/i15573329/3e616f8ebe559e53.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
        data_list = [i.split(',') for i in data_list]  
        # 获得数据中[0],[1],[2]的数据
        data = [(float(i[0]),float(i[1]),float(i[2])) for i in data_list]
    

    数据展示

    # 获得标记为0的点坐标
    x0 = list(filter(lambda x:x[-1] == 0.0 ,data))
    # 获得标记为1的点坐标
    x1 = list(filter(lambda x:x[-1] == 1.0 ,data))
    
    # 分别获得点坐标的x和y轴
    plot_x0_0 = [i[0] for i in x0]
    plot_x0_1 = [i[1] for i in x0]
    plot_x1_0 = [i[0] for i in x1]
    plot_x1_1 = [i[1] for i in x1]
    
    # 显示
    plt.plot(plot_x0_0,plot_x0_1,'ro',label='x_0',color="blue")
    plt.plot(plot_x1_0,plot_x1_1,'ro',label='x_1')
    plt.legend(loc='best')
    
    image.png

    获得数据

    # 分别获得标注为0和1的数据的点坐标(x,y)
    label0 = np.array([(float(row[0]), float(row[1])) for row in data if row[2] == 0])
    label1 = np.array([(float(row[0]), float(row[1])) for row in data if row[2] == 1])
    
    # 将点坐标合并连接起来
    x = np.concatenate((label0,label1), axis = 0)
    x_data = torch.from_numpy(x).float()
    
    # 分别获得对应的标注(既0或者1,将其连接起来)
    y = [[0] for i in range(label0.shape[0])]
    y += [[1] for i in range(label1.shape[0])]
    y_data = torch.FloatTensor(y)
    

    设置模型

    # 建立回归模型
    class LogisticRegression(nn.Module):
        # 建立一层线程神经网络层和激活函数
        def __init__(self):
            super().__init__()
            self.lr = nn.Linear(2, 1)
            self.sm = nn.Sigmoid()
        
        # 前向传播,通过学习率和sigmod函数激活x    
        def forward(self,x):
            x = self.lr(x)
            x = self.sm(x)
            return x
    
    # 建立模型对象    
    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)
    
    image.png

    模型训练

    # 训练50000次
    for epoch in range(50000):
        # 将数据转换为tensor变量
        if torch.cuda.is_available():
            x = Variable(x_data).cuda()
            y = Variable(y_data).cuda()
        else:
            x = Variable(x_data)
            y = Variable(y_data)
        
        # 向前传播,计算输出及损失函数
        out = logistic_model(x)
        loss = criterion(out,y) 
        print_loss = loss.data[0]
        
        # 判断输出结果如果大于0.5就等于1,小于0.5就等于0
        mask = out.ge(0.5).float()
        correct = (mask==y).sum()
        acc = correct.data[0].item()/ x.size(0)
        
        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if (epoch+1) %1000 ==0:
            print('*'*10)
            print('epoch {}'.format(epoch+1))
            print('loss is {:.4f}'.format(print_loss))
            print('acc is {:.4f}'.format(acc))
            
    

    可视化分类结果

    # 获得权值
    weight = logistic_model.lr.weight[0]
    w0, w1 = weight[0], weight[1]
    b = logistic_model.lr.bias.data[0]
    
    plt.plot(plot_x0_0,plot_x0_1,'ro',label='x_0',color="blue")
    plt.plot(plot_x1_0,plot_x1_1,'ro',label='x_1')
    plt.legend(loc = 'best')
    plot_x = np.arange(30, 100, 0.1)
    plot_y = (-w0.item() * plot_x - b.item()) / w1.item()
    plt.plot(plot_x, plot_y)
    plt.show()
    
    image.png

    总结

    本实验是训练一个线性回归分类问题
    目的是为了训练
        w0*x + w1*y + b =0
    
    则
       y = (-w0*x-b)/w1
    
    

    相关文章

      网友评论

          本文标题:Pytorch学习之线性回归分类

          本文链接:https://www.haomeiwen.com/subject/uprrrqtx.html