PyTorch系列三:逻辑回归

1.介绍

  • logistic回归是一种广义线性回归,因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w'x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w'x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w'x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
  • logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。

2.模型训练

# -*- coding: utf-8 -*-

import torch
from torch import nn, optim
import torch.nn.functional as F
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets

import time

# 定义超参数
batch_size    = 32
num_epoches   = 10
learning_rate = 1e-3

# 下载训练集 MNIST 手写数字训练集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset  = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

train_loader  = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader   = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

class Logstic_Regression(nn.Module):
    """逻辑回归模型定义"""

    def __init__(self, in_dim, n_class):
        super(Logstic_Regression, self).__init__()
        self.logstic = nn.Linear(in_dim, n_class)

    def forward(self, x):
        # 前向传播
        output = self.logstic(x)
        return output

# 模型初始化
model = Logstic_Regression(28 * 28, 10)  # 图片大小是28x28

# 定义loss和optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 模型训练
for epoch in range(num_epoches):
    print '#' * 45
    print 'Epoch {}'.format(epoch + 1)
    since = time.time()
    running_loss = 0.0
    running_acc  = 0.0
    for i, data in enumerate(train_loader, 1):
        img, label = data
        img = img.view(img.size(0), -1)

        img   = Variable(img)
        label = Variable(label)

        # 前向传播
        out = model(img)
        loss = criterion(out, label)
        running_loss += loss.item() * label.size(0)
        _, pred = torch.max(out, 1)
        num_correct = (pred == label).sum()
        running_acc += num_correct.item()

        # 后向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if i % 300 == 0:
            print '[{}/{}] Loss: {:.6f}, Acc: {:.6f}'.format(
                epoch + 1, num_epoches, running_loss / (batch_size * i),
                running_acc / (batch_size * i))
    print 'Finish {} epoch, Loss: {:.6f}, Acc: {:.6f}'.format(
        epoch + 1, running_loss / (len(train_dataset)), running_acc / (len(
            train_dataset)))

    # 模型评估
    model.eval()
    eval_loss = 0.
    eval_acc  = 0.
    for data in test_loader:
        img, label = data
        img = img.view(img.size(0), -1)

        with torch.no_grad():
            img   = Variable(img)
            label = Variable(label)

        out  = model(img)
        loss = criterion(out, label)
        eval_loss += loss.item() * label.size(0)
        _, pred = torch.max(out, 1)
        num_correct = (pred == label).sum()
        eval_acc += num_correct.item()
    print 'Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(
        test_dataset)), eval_acc / (len(test_dataset)))
    print 'Time:{:.1f} s'.format(time.time() - since)

# 模型保存
torch.save(model.state_dict(), './Logistic_Regression.model')
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 机器学习是做NLP和计算机视觉这类应用算法的基础,虽然现在深度学习模型大行其道,但是懂一些传统算法的原理和它们之间...
    在河之简阅读 20,675评论 4 65
  • 逻辑回归 逻辑回归(Logistic regression 或logit regression),即逻辑模型(英语...
    ChZ_CC阅读 35,911评论 4 45
  • 以西瓜书为主线,以其他书籍作为参考进行补充,例如《统计学习方法》,《PRML》等 第一章 绪论 1.2 基本术语 ...
    danielAck阅读 10,155评论 0 5
  • 岁月如梭,白驹过隙,心中焦躁如同火烧,这时候,不要闲着没事,乱跟童言无忌的孩子发飙。虽说,他们是祖国的花骨朵,有时...
    土伽丘阅读 2,532评论 0 0
  • (和水鬼君诗《端午》而作) 汨罗江水清又纯 滋润三湘众乡亲 昼夜滚滚流不尽 ...
    张春发_66a0阅读 3,931评论 8 9