pytorch学习笔记(分类模型)

问题介绍

机器学习中的监督学习主要分为分类问题和回归问题,回归问题希望预测的结果是连续的,而分类问题所预测的结果就是离散的类别.这个时候输入的变量可以是离散的,也可以是连续的,监督学习从数据中学习一个分类模型或者分类决策函数,被称之为分类器(classifer). 分类器对新的输入进行预测,这个过程称之为分类(classfication). 例如: 判断邮件是否为垃圾邮件,病人是否生病,明天是否下雨等等.分类问题包括多分类问题和二分类问题.

二分类算法-logistic 回归     

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

# 定义模型
class LogisticRegression(nn.Module):
    def __init__(self):
        super(LogisticRegression, self).__init__()
        self.lr = nn.Linear(2, 1)
        self.sm = nn.Sigmoid()

    def forward(self, x):
        x = self.lr(x)
        x = self.sm(x)
        return x


if __name__ == '__main__':
    with open('data.txt', 'r', encoding='utf8') as f:
        data_list = f.readlines()
        data_list = [i.split('\n')[0] for i in data_list]
        data_list = [i.split(',') for i in data_list]
        data = [(float(i[0]), float(i[1]), float(i[2])) for i in data_list]
        data = torch.Tensor(data)

    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)

    for epoch in range(50000):
        if torch.cuda.is_available():
            x = Variable(data[:, 0:2]).cuda()
            y = Variable(data[:, 2]).cuda().unsqueeze(1)
        else:
            x = Variable(data[:, 0:2])
            y = Variable(data[:, 2]).unsqueeze(1)
        # =================forward===============
        out = logistic_model(x)
        loss = criterion(out, y)
        print_loss = loss.data.item()
        mask = out.ge(0.5).float()
        correct = (mask == y).sum()
        acc = correct.item() / x.size(0)
        # =================backward==============
        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))


    w0, w1 = logistic_model.lr.weight[0]
    w0 = w0.item()
    w1 = w1.item()
    b = logistic_model.lr.bias.item()
    plot_x = np.arange(30, 100, 0.1)
    plot_y = (-w0 * plot_x - b) / w1
    plt.plot(plot_x, plot_y)

    x0 = list(filter(lambda x: x[-1] == 0.0, data))
    x1 = list(filter(lambda x: x[-1] == 1.0, data))
    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')
    plt.plot(plot_x1_0, plot_x1_1, 'bo', label='x_1')
    plt.legend()
    plt.show()

      pytorch学习笔记(分类模型)_第1张图片                                     

参考: 深度学习入门之PyTorch(廖星宇)                                                                                                        

你可能感兴趣的:(深度学习,pytorch)