pytorch学习2-用逻辑回归实现对MNIST数据集分类

(1)逻辑回归原理

关于逻辑回归原理课可参考这一部分

https://blog.csdn.net/weixin_39445556/article/details/83930186

(2)使用pytorch框架实现对MNIST数据集分类

"""
Created on Sun Apr 28 11:41:28 2019

@author: hp
"""

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from torchvision.datasets import MNIST


# Hyper-parameters 
input_size = 784 #输入层神经元大小
num_classes = 10 #种类类别,数字0-9
num_epochs = 25#迭代次数
batch_size = 100 #每次训练取得样本数
learning_rate = 0.5 #学习率

# MNIST dataset (images and labels)
#训练集
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())

# Data loader (input pipeline)
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)

# Logistic regression model
model = nn.Linear(input_size, num_classes)

# Loss and optimizer 损失函数和优化器
# nn.CrossEntropyLoss() computes softmax internally
criterion = nn.CrossEntropyLoss()  #采用多分类交叉熵损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)   

# Train the model 训练模型
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # Reshape images to (batch_size, input_size)  
        images = images.reshape(-1, 28*28)
        
        # Forward pass 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # Backward and optimize 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (i+1) % 100 == 0:
            print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                   .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

# Test the model
# In test phase, we don't need to compute gradients (for memory efficiency)
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))

# Save the model checkpoint
torch.save(model.state_dict(), 'model.ckpt')

(3)结果如下

Epoch [1/10], Step [100/600], Loss: 0.4521
Epoch [1/10], Step [200/600], Loss: 0.3724
Epoch [1/10], Step [300/600], Loss: 0.3691
Epoch [1/10], Step [400/600], Loss: 0.5303
Epoch [1/10], Step [500/600], Loss: 0.3729
Epoch [1/10], Step [600/600], Loss: 0.3130
Epoch [2/10], Step [100/600], Loss: 0.3146
Epoch [2/10], Step [200/600], Loss: 0.2711
Epoch [2/10], Step [300/600], Loss: 0.2242
Epoch [2/10], Step [400/600], Loss: 0.2495
Epoch [2/10], Step [500/600], Loss: 0.2807
Epoch [2/10], Step [600/600], Loss: 0.2015
Epoch [3/10], Step [100/600], Loss: 0.4398
Epoch [3/10], Step [200/600], Loss: 0.2047
Epoch [3/10], Step [300/600], Loss: 0.3251
Epoch [3/10], Step [400/600], Loss: 0.3168
Epoch [3/10], Step [500/600], Loss: 0.2460
Epoch [3/10], Step [600/600], Loss: 0.3565
Epoch [4/10], Step [100/600], Loss: 0.1985
Epoch [4/10], Step [200/600], Loss: 0.2450
Epoch [4/10], Step [300/600], Loss: 0.3512
Epoch [4/10], Step [400/600], Loss: 0.2825
Epoch [4/10], Step [500/600], Loss: 0.3792
Epoch [4/10], Step [600/600], Loss: 0.2888
Epoch [5/10], Step [100/600], Loss: 0.3353
Epoch [5/10], Step [200/600], Loss: 0.1694
Epoch [5/10], Step [300/600], Loss: 0.3694
Epoch [5/10], Step [400/600], Loss: 0.2912
Epoch [5/10], Step [500/600], Loss: 0.2994
Epoch [5/10], Step [600/600], Loss: 0.1766
Epoch [6/10], Step [100/600], Loss: 0.2142
Epoch [6/10], Step [200/600], Loss: 0.2137
Epoch [6/10], Step [300/600], Loss: 0.2421
Epoch [6/10], Step [400/600], Loss: 0.3232
Epoch [6/10], Step [500/600], Loss: 0.2588
Epoch [6/10], Step [600/600], Loss: 0.3145
Epoch [7/10], Step [100/600], Loss: 0.1498
Epoch [7/10], Step [200/600], Loss: 0.2251
Epoch [7/10], Step [300/600], Loss: 0.2388
Epoch [7/10], Step [400/600], Loss: 0.2169
Epoch [7/10], Step [500/600], Loss: 0.1757
Epoch [7/10], Step [600/600], Loss: 0.1307
Epoch [8/10], Step [100/600], Loss: 0.1784
Epoch [8/10], Step [200/600], Loss: 0.2199
Epoch [8/10], Step [300/600], Loss: 0.2975
Epoch [8/10], Step [400/600], Loss: 0.2000
Epoch [8/10], Step [500/600], Loss: 0.3108
Epoch [8/10], Step [600/600], Loss: 0.5101
Epoch [9/10], Step [100/600], Loss: 0.2494
Epoch [9/10], Step [200/600], Loss: 0.1489
Epoch [9/10], Step [300/600], Loss: 0.1862
Epoch [9/10], Step [400/600], Loss: 0.2729
Epoch [9/10], Step [500/600], Loss: 0.2638
Epoch [9/10], Step [600/600], Loss: 0.2751
Epoch [10/10], Step [100/600], Loss: 0.2940
Epoch [10/10], Step [200/600], Loss: 0.2902
Epoch [10/10], Step [300/600], Loss: 0.4425
Epoch [10/10], Step [400/600], Loss: 0.2188
Epoch [10/10], Step [500/600], Loss: 0.1756
Epoch [10/10], Step [600/600], Loss: 0.1794
Accuracy of the model on the 10000 test images: 92 %

采用逻辑回归,对MNIST数据集进行10次迭代,最后识别正确率为92%

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非常好的问题!我可以回答这个问题。对于mnist数据集分类问题,我们可以使用卷积神经网络(CNN)来解决。在PyTorch实现CNN非常简单,你只需要按照以下步骤: 1. 导入需要的库和模块 ``` import torch import torch.nn as nn import torch.nn.functional as F ``` 2. 定义CNN模型 ``` class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5) self.fc1 = nn.Linear(in_features=16 * 4 * 4, out_features=120) self.fc2 = nn.Linear(in_features=120, out_features=84) self.fc3 = nn.Linear(in_features=84, out_features=10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 4 * 4) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 这里我们定义了一个简单的CNN模型,包括两个卷积层和三个全连接层。我们使用ReLU作为激活函数,并在卷积层之间使用max-pooling来减小输出尺寸。 3. 加载mnist数据集 ``` trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor()) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=2) ``` 这里我们使用torchvision库来加载mnist数据集,并使用transforms.ToTensor()将数据转换为PyTorch张量。我们还使用DataLoader来生成批数据,以便进行批量训练。 4. 定义优化器和损失函数 ``` net = Net() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 我们使用交叉熵损失作为损失函数,并使用随机梯度下降(SGD)作为优化器。 5. 训练网络 ``` for epoch in range(10): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # get the inputs; data is a list of [inputs, labels] inputs, labels = data # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0 print('Finished Training') ``` 这里我们使用PyTorch的自动微分来计算梯度,并调用优化器更新权重。我们通过训练数据多次迭代来训练网络。 6. 测试网络 ``` correct = 0 total = 0 with torch.no_grad(): for data in testloader: images, labels = data outputs = net(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % ( 100 * correct / total)) ``` 这里我们使用测试数据集来测试训练过的神经网络的准确度。 希望这个回答能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值