【pytorch学习实战】第四篇:MNIST数据集的读取、显示以及全连接实现数字识别

您所在的位置:网站首页 第一个的图片 【pytorch学习实战】第四篇:MNIST数据集的读取、显示以及全连接实现数字识别

【pytorch学习实战】第四篇:MNIST数据集的读取、显示以及全连接实现数字识别

2024-07-10 19:53| 来源: 网络整理| 查看: 265

往期相关文章列表:

【pytorch学习实战】第一篇:线性回归【pytorch学习实战】第二篇:多项式回归【pytorch学习实战】第三篇:逻辑回归【pytorch学习实战】第四篇:MNIST数据集的读取、显示以及全连接实现数字识别【pytorch学习实战】第五篇:卷积神经网络实现MNIST手写数字识别【pytorch实战学习】第六篇:CIFAR-10分类实现【pytorch实战学习】第七篇:tensorboard可视化介绍

文章目录 1. MNIST数据集读取并显示2. 全连接实现MNIST数据集手写识别3. 评估数据的显示

1. MNIST数据集读取并显示

MNIST包含70,000张手写数字图像: 60,000张用于训练,10,000张用于测试。图像是灰度的,28x28像素的,并且居中的,以减少预处理和加快运行。

下列代码为读取、显示样本示例,它的步骤为:

下面使用torchvision读取数据;然后使用DataLoader加载数据;最后使用matplotlib显示其中6张图片数据和对应的真值。 import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms data_tf = transforms.Compose( [transforms.ToTensor(), transforms.Normalize([0.5], [0.5])]) batch_size = 32 # 读取测试数据,train=True读取训练数据;train=False读取测试数据 train_dataset = datasets.MNIST(root='./data', train=True, transform=data_tf, download=True) test_dataset = datasets.MNIST(root='./data', train=False, transform=data_tf) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) examples = enumerate(test_loader) #img&label batch_idx, (imgs, labels) = next(examples) #读取数据,batch_idx从0开始 print(labels) #读取标签数据 print(labels.shape) #torch.Size([32]),因为batch_size为32 #-------------------------------数据显示-------------------------------------------- #显示6张图片 import matplotlib.pyplot as plt fig = plt.figure() for i in range(6): plt.subplot(2,3,i+1) plt.tight_layout() plt.imshow(imgs[i][0], cmap='gray', interpolation='none')#子显示 plt.title("Ground Truth: {}".format(labels[i])) #显示title plt.xticks([]) plt.yticks([]) plt.show()

输出:

tensor([7, 2, 1, 0, 4, 1, 4, 9, 5, 9, 0, 6, 9, 0, 1, 5, 9, 7, 3, 4, 9, 6, 6, 5, 4, 0, 7, 4, 0, 1, 3, 1]) torch.Size([32])

在这里插入图片描述

2. 全连接实现MNIST数据集手写识别

在这里使用全连接实现MNIST数据集手写识别,我们这里定义的神经网络输入层为28*28,因为我们处理过的图片像素为28*28,两个隐层分别为300和100,输出层为10,因为我们识别0~9十个数字,需要分为十类。

下列示例中包含的包简介:

torchvision:图片的预处理。其中transforms是预处理方法,datasets用于具体实现,包括数据集的下载。DataLoader:用于加载数据。

下列示例的步骤:

自定义模型:实现了3种模型,我们可以任选其中一个去调用。数据预处理:使用datasets.MNIST下载和预处理数据。数据加载:使用DataLoader加载数据。定义损失函数和优化器:使用交叉熵损失和SGD优化器。开始训练:这里注意epoch和iter的关系。epoch是整个数据集迭代的次数,而iter是一个batch迭代的次数。感兴趣的可以查看链接。模型评估:使用测试集评估loss和acc。 from torch import nn #-------------------------------------自定义模型-------------------------------------- #定义了三个不层次的神经网络模型:简单的FC,加激活函数的FC,加激活函数和批标准化的FC。 #1. 全连接网络层 class simpleNet(nn.Module): """ 定义了一个简单的三层全连接神经网络,每一层都是线性的 """ def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim): super(simpleNet, self).__init__() self.layer1 = nn.Linear(in_dim, n_hidden_1) self.layer2 = nn.Linear(n_hidden_1, n_hidden_2) self.layer3 = nn.Linear(n_hidden_2, out_dim) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) return x # 2. 全连接网络层 +激活层 class Activation_Net(nn.Module): """ 在上面的simpleNet的基础上,在每层的输出部分添加了激活函数 """ def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim): super(Activation_Net, self).__init__() self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1), nn.ReLU(True)) self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2), nn.ReLU(True)) self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim)) """ 这里的Sequential()函数的功能是将网络的层组合到一起。 """ def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) return x # 3. 全连接网络层 + 激活层 + BN 网络层 class Batch_Net(nn.Module): """ 在上面的Activation_Net的基础上,增加了一个加快收敛速度的方法——批标准化 """ def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim): super(Batch_Net, self).__init__() self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1), nn.BatchNorm1d(n_hidden_1), nn.ReLU(True)) self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2), nn.BatchNorm1d(n_hidden_2), nn.ReLU(True)) self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim)) def forward(self, x): x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) return x import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms #-------------------------------------超参数定义------------------------------------- batch_size = 64 #一个batch的size learning_rate = 0.02 num_epoches = 3 #总样本的迭代次数 #-------------------------------------数据预处理方法-------------------------------------- # transforms.ToTensor()将图片转换成PyTorch中处理的对象Tensor,并且进行标准化(数据在0~1之间) # transforms.Normalize()做归一化。它进行了减均值,再除以标准差。两个参数分别是均值和标准差 # transforms.Compose()函数则是将各种预处理的操作组合到了一起 data_tf = transforms.Compose( [transforms.ToTensor(), transforms.Normalize([0.5], [0.5])]) #-------------------------------------数据集的下载器-------------------------------------- #训练和测试集预处理 train_dataset = datasets.MNIST(root='./data', train=True, transform=data_tf, download=True) test_dataset = datasets.MNIST(root='./data', train=False, transform=data_tf) #加载数据集 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) #-------------------------------------选择模型-------------------------------------- ''' 1. 输入28*28(因为输入的图像像素为28*28) 2. 隐藏层分别为300和100 3. 输出层为10,因为识别的数字为0~9 ''' #下列3个模型可以任选其中之一 model = simpleNet(28 * 28, 300, 100, 10) # model = net.Activation_Net(28 * 28, 300, 100, 10) # model = net.Batch_Net(28 * 28, 300, 100, 10) if torch.cuda.is_available(): model = model.cuda() #-------------------------------------定义损失函数和优化器-------------------------------------- #交叉熵和SGD优化器 criterion = nn.CrossEntropyLoss() #softmax与交叉熵一起 optimizer = optim.SGD(model.parameters(), lr=learning_rate) #-------------------------------------开始训练------------------------------------- print('Start Training!') iter = 0 #迭代次数 for epoch in range(num_epoches): for data in train_loader: img, label = data img = img.view(img.size(0), -1) if torch.cuda.is_available(): img = img.cuda() label = label.cuda() else: img = img label = label out = model(img) loss = criterion(out, label) optimizer.zero_grad() loss.backward() optimizer.step() iter+=1 #每迭代50次打印一次 if iter%50 == 0: print('epoch: {}, iter:{}, loss: {:.4}'.format(epoch, iter, loss.data.item())) #-------------------------------------模型评估------------------------------------- print('Start eval!') model.eval() eval_loss = 0 eval_acc = 0 for data in test_loader: img, label = data img = img.view(img.size(0), -1) if torch.cuda.is_available(): img = img.cuda() label = label.cuda() out = model(img) loss = criterion(out, label) eval_loss += loss.data.item()*label.size(0) _, pred = torch.max(out, 1) #onehout编码,dim=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))))

输出类似于:

Start Training! epoch: 0, iter:50, loss: 1.679 epoch: 0, iter:100, loss: 0.9393 epoch: 0, iter:150, loss: 0.6704 epoch: 0, iter:200, loss: 0.5091 epoch: 0, iter:250, loss: 0.4796 epoch: 0, iter:300, loss: 0.4064 ...... epoch: 2, iter:2600, loss: 0.3511 epoch: 2, iter:2650, loss: 0.1821 epoch: 2, iter:2700, loss: 0.2803 epoch: 2, iter:2750, loss: 0.2893 epoch: 2, iter:2800, loss: 0.4447 Start eval! Test Loss: 0.333636, Acc: 0.901900 3. 评估数据的显示

如果想要显示评估的效果,可以结果第1和第2部分的代码,修改评估代码,如下所示:

#-------------------------------------模型评估------------------------------------- import matplotlib.pyplot as plt print('Start eval!') model.eval() eval_loss = 0 eval_acc = 0 fig = plt.figure() #batch循环 for i, data in enumerate(test_loader): img, label = data test_img = img #只用于测试 img = img.view(img.size(0), -1) if torch.cuda.is_available(): img = img.cuda() label = label.cuda() out = model(img) loss = criterion(out, label) eval_loss += loss.data.item()*label.size(0) _, pred = torch.max(out, 1)#onehout编码,dim=1选取最大值 num_correct = (pred == label).sum() eval_acc += num_correct.item() #挑选单个batch中的6个数据查看 if i == 0: for j in range(6): plt.subplot(2,3,j+1) plt.tight_layout() plt.imshow(test_img[j][0], cmap='gray', interpolation='none') plt.title("Prediction: {}".format(pred[j])) plt.xticks([]) plt.yticks([]) print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(test_dataset)), eval_acc / (len(test_dataset)))) plt.show()

评估显示效果如下: 在这里插入图片描述 可以看到这6张图片的评估效果都是正确的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3