基于pytorch平台实现对mnist数据集的分类分析(前馈神经网络softmax)基础版(代码片段)

我是一颗跳跳糖哦 我是一颗跳跳糖哦     2022-12-03     399

关键词:

基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)基础版


文章目录


前言

本篇文章,将基于pytorch平台实现对MNIST数据集的分类分析,并分别以分类“的准确度”和“混淆矩阵”为衡量指标,分析模型的精度。


一、基于“前馈神经网络”模型,分类分析

注意:
根目录’E:\\深度学习’,在这里根据自己实际情况建立;
运行程序时将自动下载数据集,数据集将下载至先前建立的根目录中,用于训练模型及测试。

import torch
from torch import nn
from torch.autograd import Variable
from torch.utils.data import DataLoader
import torchvision.datasets as dsets
import torchvision.transforms as transforms

batch_size = 100
# MNIST dataset
train_dataset = dsets.MNIST(root='E:\\深度学习', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.MNIST(root='E:\\深度学习', train=False, transform=transforms.ToTensor(), download=True)
# load_data
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=True)



# original_data
print("train_data:", train_dataset.train_data.size())
print("train_labels:", train_dataset.train_labels.size())
print("test_data:", test_dataset.test_data.size())
print("test_labels:", test_dataset.test_labels.size())
# shuffle batch_size data
print("batch_size:", train_loader.batch_size)
print("load_train_data:", train_loader.dataset.train_data.shape)
print("load_train_labels:", train_loader.dataset.train_labels.shape)


input_size = 784
hidden_size = 500
num_classes = 10

# #定义神经网络模型
#一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数__init__()中
class Neural_net(nn.Module):
    #最重要__init__初始化方法,便于一些参数的传递
    def __init__(self, input_num, hidden_size, output_num):
        super(Neural_net, self).__init__()#调用父类构造函数,以继承父类一些属性
        self.layers1 = nn.Linear(input_num, hidden_size)
        self.layers2 = nn.Linear(hidden_size, output_num)

    # 最重要的forward方法,便于进行前向传播
    def forward(self, x):
        out = self.layers1(x)
        out = torch.relu(out)
        out = self.layers2(out)
        return out
net = Neural_net(input_size, hidden_size, num_classes)
print(net)


# training
learning_rate = 1e-1
num_epoches = 5
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate)
for epoch in range(num_epoches):
    print("current epoch = ".format(epoch))
    for i, (images,labels) in enumerate(train_loader):
        images = Variable(images.view(-1, 28*28))
        labels = Variable(labels)

        outputs = net(images)
        loss = criterion(outputs, labels)  # calculate loss
        optimizer.zero_grad()  # clear net state before backward
        loss.backward()
        optimizer.step()   # update parameters

        if i%100 == 0:
            print("current loss = %.5f" %loss.item())


# prediction
total = 0
correct = 0
for images, labels in test_loader:
    images = Variable(images.view(-1, 28*28))
    labels = Variable(labels)
    outputs = net(images)

    _,predicts = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicts == labels).sum()
    from sklearn.metrics import confusion_matrix
    C2 = confusion_matrix(predicts, labels, labels=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    import sklearn
    acc = sklearn.metrics.accuracy_score(labels, predicts)
print("混淆矩阵",C2)
print("混淆矩阵中的准确率为", acc)
print("Accuracy = %.2f" %(100*correct/total))

二、基于“softmax”模型,分类分析

import torch
import torch.utils.data as Data
from torchvision import datasets,transforms
import torchvision
from torch.autograd import  Variable
import numpy as np
import matplotlib.pyplot as plt

transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5,],std=[0.5,])])
data_train=datasets.MNIST(root="D:\\jupyter_data",  transform=transform, train=True,
                          download=True
                          )
data_test=datasets.MNIST(root="D:\\jupyter_data", transform=transform, train=False)


batch = 256
train_iter = Data.DataLoader(dataset=data_train, batch_size=batch, shuffle=True)
test_iter = Data.DataLoader(data_test,batch, shuffle=True)
print(train_iter)


#定义和初始化模型
for X,y in train_iter:
    print(X.shape)
    print(X.view(X.shape[0],-1).shape)
    break

num_inputs = 784
num_outputs = 10
class LinearNet(torch.nn.Module):
    def __init__(self,num_inputs,num_outputs):
        super(LinearNet,self).__init__()
        self.linear = torch.nn.Linear(num_inputs,num_outputs)
    def forword(self,X): #这里X是28行28列.
        y=self.linear(X.view(X.shape[0],-1))
        return y  #参数中的-1就代表这个位置由其他位置的数字来推断,根据上面得到的shape,一批是256个,所以这里的shape[0]是256
net = LinearNet(num_inputs, num_outputs)
torch.nn.init.normal_(net.linear.weight, mean=0, std=0.01)
torch.nn.init.constant_(net.linear.bias, val=0)

print(net)
for X,y in train_iter:
    y_pre = net.forword(X)
    print(y_pre.shape)
    print(y_pre.view(y_pre.shape[0],-1).shape)
    break
#定义损失函数
loss = torch.nn.CrossEntropyLoss()

#定义优化算法
optimizer = torch.optim.SGD(net.linear.parameters(),lr=0.1)

#训练模型
epoch_size = 3
def softmax_train(train_iter, test_iter, epoch_size, loss, optimizer, net, batchsize):
    for epoch in range(0, epoch_size+1):
        train_acc_count = 0
        train_loss = 0
        n = 0
        for X,y in train_iter:
            y_pre = net.forword(X)
            l = loss(y_pre, y).sum() #注意要加起来,这个是softmax+交叉熵的,之前的线性回归不用
            optimizer.zero_grad() #梯度清零
            l.backward()
            optimizer.step()
            #准确率
            train_acc_count += (y_pre.argmax(dim=1) == y).sum().item()
            train_loss += l.item() #
            n += y.shape[0]
        print('epoch %d,loss %.4f, train acc %.3f'% (epoch + 1, train_loss/n ,train_acc_count/n))
softmax_train(train_iter, test_iter, epoch_size, loss, optimizer, net, batch)

def test_acc(test_iter, net):
    test_acc_count = 0
    n = 0
    for X,y in test_iter:
        y_pre = net.forword(X)
        test_acc_count += (y_pre.argmax(dim=1) == y).sum().item()
        n += y.shape[0]
        #y = y.detach().numpy()
        #y_pre = y_pre.detach().numpy()
        from sklearn.metrics import confusion_matrix
        C2 = confusion_matrix(y_pre.argmax(dim=1), y, labels=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        import sklearn
        acc = sklearn.metrics.accuracy_score(y, y_pre.argmax(dim=1) )
    print("混淆矩阵", C2)
    print("混淆矩阵中的准确率为", acc)
    print('test acc %.3f'% (test_acc_count/n))


test_acc(test_iter, net)

总结

以上是基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)的“基础版”,升级版在下一篇博客基于pytorch平台实现对MNIST数据集的分类分析(前馈神经网络、softmax)升级版

[基于pytorch的mnist识别02]用户数据集的读取(代码片段)

写在前面pytorch包含了很多包括mnist在内的开源数据集,但是如果要建立自己的神经网络的话肯定需要训练自己的数据集,那么如何利用pytorch加载用户自己的数据集呢?今天就来解决这个问题。今天的工作需要加载用... 查看详情

图像分类基于pytorch搭建lstm实现mnist手写数字体识别(双向lstm,附完整代码和数据集)(代码片段)

...sdn.net/AugustMe/article/details/128969138文章中,我们使用了基于PyTorch搭建LSTM实现MNIST手写数字体识别,LSTM是单向的,现在我们使用双向LSTM试一试效果,和之前的单向LSTM模型稍微有差别,请注意查看代码的变化。1.导入依赖库这些依赖... 查看详情

lenet模型对cifar-10数据集分类pytorch(代码片段)

LeNet模型对CIFAR-10数据集分类【pytorch】目录LeNet网络模型CIFAR-10数据集Pytorch实现代码目录本文为针对CIFAR-10数据集的基于简单神经网络LeNet分类实现(pytorch实现)LeNet网络模型Tip:(以上为原始LeNet)为了更好的... 查看详情

pytorch实现rnn网络对mnist字体分类(代码片段)

 我们知道,循环神经网络RNN非常擅长处理序列数据,但它也可以用来处理图像数据,这是因为一张图像可以看作一组由很长的像素点组成的序列。下面将会使用RNN对MNIST数据集建立分类器。目录1.准备数据集、定义数... 查看详情

pytorch之神经网络mnist分类任务(代码片段)

...使用TensorDataset和DataLoader简化本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052一、Mnist分类任务简介在上一篇博客当中,我们通过搭建PyTorch神经网络实现了气温预测,这本质上是一个回归任务。在... 查看详情

使用 pytorch 和 sklearn 对 MNIST 数据集进行交叉验证

】使用pytorch和sklearn对MNIST数据集进行交叉验证【英文标题】:CrossvalidationforMNISTdatasetwithpytorchandsklearn【发布时间】:2020-03-1815:27:22【问题描述】:我是pytorch的新手,正在尝试实现前馈神经网络来对mnist数据集进行分类。我在尝... 查看详情

如何搭建vgg网络,实现mnist数据集的图像分类

1问题如何搭建VGG网络,实现Mnist数据集的图像分类?2方法步骤:首先导包ImporttorchfromtorchimportnnVGG11由8个卷积,三个全连接组成,注意池化只改变特征图大小,不改变通道数classMyNet(nn.Module):  def__init__(self)->No... 查看详情

如何更改 Pytorch 数据集的大小?

】如何更改Pytorch数据集的大小?【英文标题】:HowdoyoualterthesizeofaPytorchDataset?[duplicate]【发布时间】:2017-12-0500:25:32【问题描述】:假设我正在从torchvision.datasets.MNIST加载MNIST,但我只想加载10000张图像,我将如何对数据进行切片... 查看详情

图像分类基于pytorch搭建lstm实现mnist手写数字体识别(单向lstm,附完整代码和数据集)(代码片段)

写在前面:首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在... 查看详情

利用knnsvmcnn逻辑回归mlprnn等方法实现mnist数据集分类(pytorch实现)(代码片段)

电脑配置:python3.6*​*Pytorch1.2.0*​*torchvision0.4.0想学习机器学习和深度学习的同学,首先找个比较经典的案例和经典的方法自己动手试一试,分析这些方法的思想和每一行代码是一个快速入门的小技巧,今天我们... 查看详情

基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比

基于pytorch后量化(mnist分类)—浮点训练vs多bit后量化vs多bit量化感知训练效果对比代码下载地址:下载地址试了bit数为1~8的准确率,得到下面这张折线图:发现,当bit>=3的时候,精度几乎不会掉,bit=2的时候精度下降到69%,b... 查看详情

pytorchlstm的一个简单例子:实现mnist图片分类

在上一篇博客中,我们实现了用LSTM对单词进行词性判断,本篇博客我们将实现用LSTM对MNIST图片分类。MNIST图片的大小为28*28,我们将其看成长度为28的序列,序列中的每个数据的维度是28,这样我们就可以把它变成一个序列数据了... 查看详情

神经网络的学习-搭建神经网络实现mnist数据集分类(代码片段)

...失函数2.损失函数的意义3.数值微分4.梯度法5.学习算法的实现四、神经网络的学习这一章通过两层神经网络实现对mnist手写数据集的识别,本文是源于《深度学习入门》的学习笔记若理解困难,参考上一章笔记:深度... 查看详情

Pytorch 自定义数据加载器

】Pytorch自定义数据加载器【英文标题】:Pytorchcustomizeddataloader【发布时间】:2021-11-0905:29:23【问题描述】:我正在尝试使用pytorch-lightening训练具有MNIST数据集的分类器。importpytorch_lightningasplfromtorchvisionimporttransformsfromtorchvision.data... 查看详情

Tensorflow.keras:RNN 对 Mnist 进行分类

...简单的数字分类器来理解tensorflow.keras.layers.SimpleRNN。Mnist数据集的数字大小为28X28。所以主要思想是在时间t内呈现图像的每一行。我在一些博客中出现过这个想法,例如,th 查看详情

Pytorch MNIST 自动编码器学习 10 位分类

】PytorchMNIST自动编码器学习10位分类【英文标题】:PytorchMNISTautoencodertolearn10-digitclassification【发布时间】:2021-06-1411:42:28【问题描述】:我正在尝试为MNIST构建一个简单的自动编码器,其中中间层只有10个神经元。我希望它能够... 查看详情

pytorch加载mnist数据集报错notgzipfile(代码片段)

利用pytorch加载mnist数据集的代码如下importtorchvisionimporttorchvision.transformsastransformsfromtorch.utils.dataimportDataLoadertrain_data=torchvision.datasets.MNIST(root=‘./mnist/‘,train=True,#thisistrainingdat 查看详情

tensorflow-实现knn算法-识别mnist数据集(代码片段)

...),我们通过计算L1距离或L2距离来计算最临近。实现步骤1.获取mnist数据2.计算距离(L1或L2)3.获取最小距离得索引(计算准确度用)4.开启会话,初始化变量op5.循环对每一个测试数据分别查找和训练数... 查看详情