Task3----PyTorch实现Logistic regression

pytorch基础实现

  • 模型形式:
    Logistic 回归的模型形式和线性回归一样,都是 y = wx + b,其中 x 可以是一个多维的特征,唯一不同的地方在于 Logistic 回归会对 y 作用一个 logistic 函数,将其变为一种概率的结果。 Logistic 函数作为 Logistic 回归的核心, Logistic 函数,也被称为 Sigmoid 函数。

  • Sigmoid函数
    公式:S(x) = 1/1+e^-x
    https://baike.baidu.com/item/Sigmoid函数/7981407?fr=aladdin

逻辑回归实质是Linear线性函数(wx+b)与一个sigmoid函数的结合。

  • 代码实现

    importtorch`

    import torch.nn as nn
    import torchvision
    import torchvision.transforms as transforms

    #训练模型的超参数
    input_size = 784

    num_classes = 10

    num_epochs = 5

    batch_size = 100

    learning_rate = 0.001

    #MNIST 数据集 (样本,标签)

    train_dataset = torchvision.datasets.MNIST(root=’./data’,

                                        train=True, 
                                        transform=transforms.ToTensor(),
                                        download=True)
    

    test_dataset = torchvision.datasets.MNIST(root=’./data’,

                                       train=False, 
                                       transform=transforms.ToTensor())
    

    #构建数据管道

    train_loader = torch.utils.data.DataLoader(dataset=train_dataset,

                                        batch_size=batch_size, 
                                        shuffle=True)
    

    test_loader = torch.utils.data.DataLoader(dataset=test_dataset,

                                       batch_size=batch_size, 
                                       shuffle=False)
    

    #搭建逻辑回归模型, 主要体现在后边的loss上,使用交叉熵

    model = nn.Linear(input_size, num_classes)

    #损失函数和优化算法

    #nn.CrossEntropyLoss() computes softmax internally

    criterion = nn.CrossEntropyLoss()

    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

    #train_loader的大小,也就是含有多少个bach。

    total_step = len(train_loader)

    #训练模型

    #在整个数据集上迭代的次数
    for epoch in range(num_epochs):

    每次取一个bach进行训练。

    for i, (images, labels) in enumerate(train_loader):
    # 将数据reshape到模型需要的大小。
    images = images.reshape(-1, 28*28)

     # 前向传播
     outputs = model(images)
     # 计算模型的loss
     loss = criterion(outputs, labels)
     
     # 后向传播,更新模型参数
     optimizer.zero_grad()
     loss.backward()
     optimizer.step()
     # 每100个batch,打印一次结果
     if (i+1) % 100 == 0:
         print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                .format(epoch+1, num_epochs, i+1, total_step, loss.item()))
    

    #模型测试

    #在测试阶段,不用计算梯度

    with torch.no_grad():

    correct = 0
    total = 0
    for images, labels in test_loader:
    images = images.reshape(-1, 28*28)
    outputs = model(images)
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted == labels).sum()

    print(‘Accuracy of the model on the 10000 test images: {} %’.format(100 * correct / total))

保存模型

torch.save(model.state_dict(), ‘model.ckpt’)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值