【pytorch图像分类】mnist手写数据集识别

对比多方教程,自己总结如何入门使用pytorch学习搭建基础网络模型进行训练和测试

目录

1.准备数据

2.超参数的设定

3.创建网络 

4.优化器的定义

5.训练定义

6.测试定义

7.测试模型

总结:

1.准备数据

这部分将会用到相关dataset和Dataloader2

#.1准备数据,这些需要准备dataset.DataLoader
  #数据的准备
train_data =datasets.MNIST("./data/train",train=True,transform= torchvision.transforms.ToTensor(),
                                       download=True)

test_data = datasets.MNIST("./data/test",train=False,transform= torchvision.transforms.ToTensor()
                            ,download=True)

print("训练集的长度:{}".format(len(train_data)))
print("测试集的长度:{}".format(len(test_data)))

  #数据迭代器的准备
train_loader=  DataLoader(train_data,batch_size=4,shuffle=True)
test_loader = DataLoader(test_data,batch_size=4)

2.超参数的设定

#2.超参数的设定
epoch = 20
bactch_size =16
device = "cuda" if torch.cuda.is_available() else "cpu"
start_time = time.time()

3.创建网络 

#3.构建模型,这里可以使用torch构造一个深层的神经网络
class MnistNet(nn.Module):
    def __init__(self):
        super(MnistNet, self).__init__()
        # self.fc1 = nn.Linear(28 * 28 * 1, 28)  # 定义Linear的输入和输出的形状
        # self.fc2 = nn.Linear(28, 10)  # 定义Linear的输入和输出的形状

        self.flatten = nn.Flatten()  #从第一维到最后一维
        self.liner_relu_nn = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10)
        )

    def  forward(self,x):
        # x = x.view(-1,28*28*1)  #拉直  展平相当于flatten
        x = self.flatten(x)
        Y = self.liner_relu_nn(x)
        return  Y



 #实例化模型
modelNet = MnistNet().to(device)
# print(model)

4.优化器的定义

#4.优化器的定义
loss_fn = nn.CrossEntropyLoss().to(device)   #交叉熵损失函数
optimizer = torch.optim.SGD(modelNet.parameters() , lr = 1e-4)  #SGD优化器

 5.训练定义

#5. 模型训练的定义
def train_mnist(train_loader,model,loss_fn,optimizer):
    '''训练过程写成函数'''
    modelNet.train(True)  #nn.module.train()方法表示训练中会使用到Dropout,BN等方法

    total_train_step = 0  #记录训练轮次
    #idx次数,也就是img的索引
    for data in train_loader:
        img , target = data
        img,target = img.to(device),target.to(device)

        pred = model(img)    #将图片输入网络预测

        train_loss = loss_fn(pred,target)  #损失函数

        #反向传播
        optimizer.zero_grad()  #梯度清零
        train_loss.backward()
        optimizer.step()  #参数的优化更新

        total_train_step += 1
        if total_train_step %1000 == 0:
            print("训练的轮次:{},loss:{}".format(total_train_step,train_loss.item()))

6.测试定义


#6.模型的验证
def test_mnist(test_loader,model,device):
    #模型的验证
    model.eval()  #eval不会使用dropout,BN等方法,符合测试的要求
    correct = 0   #总和的正确率
    test_loss = 0 #test总的测试损失
    with torch.no_grad():   #不用也不会计算梯度,也不会进行反向传播
        for data , target in test_loader:
            data,target = data.to(device) , target.to(device)
            #得到测试结果
            pred = model(data)
            #计算测试损失
            test_loss  += loss_fn(pred,target).item()  #必须加item

            #找到概率最大的下标
            # max_pred = torch.max(pred,dim=1)
            # max_pred = pred.argmax(dim=1)
            #累计正确的值
            correct =correct +  (pred.argmax(dim=1) == target)   #土堆方法
            # correct += max_pred.eq(target.view_as(max_pred)).sum().item() #官方方法
            #整个测试集的正确率
        test_loss = test_loss /len(test_loader)
        test_correct =  correct / len(test_loader)
        print("Test---Average:{}   Accuracy:{}".format(test_loss,test_correct))

 7.测试模型

#7.调用train_mnist和test_mnist方法
for i in range(epoch):
    print("----------第{}轮训练开始-------".format(i + 1))
    train_mnist(train_loader, modelNet, loss_fn, optimizer)
    test_mnist(test_loader,modelNet,device)


#5.模型的保存
# torch.save(MnistNet,"Mnist.pth")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一种深度学习框架,可以用来实现MNIST数字识别MNIST是一个常用的数据集,包含了大量数字的图像和对应的标签。我们可以使用PyTorch来构建一个卷积神经网络模型,对这些图像进行分类,从而实现数字识别的功能。具体实现过程可以参考PyTorch官方文档或相关教程。 ### 回答2: MNIST是一个经典的数字识别问题,其数据集包括60,000个训练样本和10,000个测试样本。PyTorch作为深度学习领域的热门工具,也可以用来实现MNIST数字识别。 第一步是加载MNIST数据集,可以使用PyTorch的torchvision.datasets模块实现。需要注意的是,MNIST数据集是灰度图像,需要将其转换为标准的三通道RGB图像。 ```python import torch import torchvision import torchvision.transforms as transforms # 加载数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]), download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]), download=True) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) ``` 第二步是构建模型。在MNIST数字识别问题中,可以选择使用卷积神经网络(CNN),其可以捕获图像中的局部特征,这对于数字识别非常有用。 ```python import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) self.fc1 = nn.Linear(64*12*12, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) x = F.max_pool2d(x, kernel_size=2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = F.relu(x) x = self.dropout2(x) x = self.fc2(x) output = F.log_softmax(x, dim=1) return output model = Net() ``` 第三步是定义优化器和损失函数,并进行训练和测试。在PyTorch中,可以选择使用交叉熵损失函数和随机梯度下降(SGD)优化器进行训练。 ```python import torch.optim as optim # 定义优化器和损失函数 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) # 训练模型 for epoch in range(10): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100)) running_loss = 0.0 # 测试模型 correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data outputs = model(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)) ``` 最后,可以输出测试集上的准确率。对于这个模型,可以得到大约98%的准确率,具有很好的性能。 ### 回答3: PyTorch是一个常用的深度学习框架,通过PyTorch可以方便地实现mnist数字识别mnist数字数据集是机器学习领域的一个经典数据集,用于训练和测试数字识别算法模型。以下是PyTorch实现mnist数字识别的步骤: 1. 获取mnist数据集:可以通过PyTorch提供的工具包torchvision来获取mnist数据集。 2. 数据预处理:将数据集中的数字图片转换为张量,然后进行标准化处理,使得每个像素值都在0到1之间。 3. 构建模型:可以使用PyTorch提供的nn模块构建模型,常用的模型包括卷积神经网络(CNN)和全连接神经网络(FNN)。例如,可以使用nn.Sequential()函数将多个层逐一堆叠起来,形成一个模型。 4. 训练模型:通过定义损失函数和优化器,使用训练数据集对模型进行训练。常用的损失函数包括交叉熵损失函数和均方误差损失函数,常用的优化器包括随机梯度下降(SGD)和Adam。 5. 测试模型:通过测试数据集对模型进行测试,可以用测试准确率来评估模型的性能。 以下是一个简单的PyTorch实现mnist数字识别的代码: ``` python import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms # 获取数据集 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=100, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False) # 构建模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=5) self.conv2 = nn.Conv2d(32, 64, kernel_size=5) self.fc1 = nn.Linear(1024, 256) self.fc2 = nn.Linear(256, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = F.max_pool2d(x, 2) x = F.relu(self.conv2(x)) x = F.max_pool2d(x, 2) x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = self.fc2(x) return F.log_softmax(x, dim=1) model = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 转换为模型所需格式 images = images.float() labels = labels.long() # 前向传播和计算损失 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和更新参数 optimizer.zero_grad() loss.backward() optimizer.step() # 每100个批次输出一次日志 if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_dataset)//100, loss.item())) # 测试模型 correct = 0 total = 0 with torch.no_grad(): # 不需要计算梯度 for images, labels in test_loader: # 转换为模型所需格式 images = images.float() labels = labels.long() # 前向传播 outputs = model(images) _, predicted = torch.max(outputs.data, 1) # 统计预测正确数和总数 total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy: {:.2f}%'.format(100 * correct / total)) ``` 以上就是一个基于PyTorchmnist数字识别的简单实现方法。需要注意的是,模型的设计和训练过程可能会受到多种因素的影响,例如网络结构、参数初始化、优化器等,需要根据实际情况进行调整和优化,才能达到更好的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值