首页 > 其他分享 >【基于PyTorch的简单多层感知机(MLP)神经网络(深度学习经典代码实现)】

【基于PyTorch的简单多层感知机(MLP)神经网络(深度学习经典代码实现)】

时间:2024-11-14 22:15:41浏览次数:3  
标签:loss nn self torch MLP 感知机 PyTorch train test

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
#准备数据集
batch_size=64
transform=transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307, ),(0.3081, ))
])
train_dataset=datasets.MNIST(root=r'D:\Python-Code\深度学习\data\MNIST',
                             train=True,
                             download=True,
                             transform=transform)
train_loader=DataLoader(train_dataset,
                        shuffle=True,
                        batch_size=batch_size)


test_dataset=datasets.MNIST(root=r'D:\Python-Code\深度学习\data\MNIST',
                             train=False,
                             download=True,
                             transform=transform)
test_loader=DataLoader(test_dataset,
                       shuffle=False,
                       batch_size=batch_size)
#设计模型
class Net(torch.nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.l1=torch.nn.Linear(784,512)
        self.l2=torch.nn.Linear(512,256)
        self.l3=torch.nn.Linear(256,128)
        self.l4=torch.nn.Linear(128,64)
        self.l5=torch.nn.Linear(64,10)
    def forward(self,x):
        x=x.view(-1,784)
        x = F.relu(self.l1(x))
        x = F.relu(self.l2(x))
        x = F.relu(self.l3(x))
        x = F.relu(self.l4(x))
        return self.l5(x)
model=Net()

# 损失函数和优化器
criterion=torch.nn.CrossEntropyLoss()#交叉熵损失
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.5)

#训练
def train(epoch):
    running_loss=0.0
    for batch_idx,data in enumerate(train_loader,0):
        inputs,target=data
        optimizer.zero_grad()
        #forward+backward+update
        outputs=model(inputs)
        loss=criterion(outputs,target)
        loss.backward()
        optimizer.step()
       
        running_loss+=loss.item()
        if batch_idx%300==299:
            print('[%d,%5d] loss:%.3f' %(epoch+1,batch_idx+1,running_loss/300))
            running_loss=0.0
#测试
def test():
    correct=0
    total=0
    with torch.no_grad():`在这里插入代码片`
        for data in test_loader:
            images,labels=data
            outputs=model(images)
            _,predicted=torch.max(outputs.data,dim=1)
            total+=labels.size(0)
            correct+=(predicted==labels).sum().item()
    print('Accuracy on test set: %d %%' %(100*correct/total))

if __name__=='__main__':
    for epoch in range(10):
        train(epoch)
        test()

这段代码实现了一个基于PyTorch的简单多层感知机(MLP)神经网络,用于MNIST手写数字识别任务。以下是代码的详细解释:
导入库

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim

● torch:PyTorch的主库。
● torchvision:提供常用的计算机视觉数据集和数据预处理方法。
● torch.nn.functional:包含激活函数等神经网络功能。
● torch.optim:提供各种优化器,例如随机梯度下降(SGD)。
准备数据集

batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

● batch_size:每个批次的样本数。
● transforms.Compose:将多个数据转换步骤组合。
● transforms.ToTensor():将图片数据转为Tensor,并将像素值缩放到[0, 1]。
● transforms.Normalize():归一化,使数据符合标准正态分布,均值为0.1307,标准差为0.3081,这些数值是对MNIST训练集计算得到的。

train_dataset = datasets.MNIST(root=r'D:\Python-Code\深度学习\data\MNIST', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)

● datasets.MNIST:加载MNIST训练集。
○ root:数据存放路径。
○ train=True:加载训练集。
○ download=True:如果数据不存在则自动下载。
○ transform=transform:指定数据预处理方式。
● DataLoader:加载数据并生成批次,支持随机打乱。

test_dataset = datasets.MNIST(root=r'D:\Python-Code\深度学习\data\MNIST', train=False, download=True, transform=transform)
test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)

● datasets.MNIST:加载MNIST测试集。
● shuffle=False:测试集数据顺序不打乱。

#定义模型
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.l1 = torch.nn.Linear(784, 512)
        self.l2 = torch.nn.Linear(512, 256)
        self.l3 = torch.nn.Linear(256, 128)
        self.l4 = torch.nn.Linear(128, 64)
        self.l5 = torch.nn.Linear(64, 10)

● 该模型是一个5层的多层感知机(MLP),每一层由torch.nn.Linear创建的线性层构成。
○ 784:输入层大小(28×28像素的MNIST图像展平)。
○ 512、256、128、64:每层的神经元数。
○ 10:输出层的神经元数,表示10个类别(数字0-9)。

def forward(self, x):
    x = x.view(-1, 784)
    x = F.relu(self.l1(x))
    x = F.relu(self.l2(x))
    x = F.relu(self.l3(x))
    x = F.relu(self.l4(x))
    return self.l5(x)

● x.view(-1, 784):将输入图像展平为1维向量。
● F.relu:ReLU激活函数,用于添加非线性。
● self.l5(x):最后一层的输出,得到10个类别的分数。
损失函数和优化器

criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

● torch.nn.CrossEntropyLoss():计算交叉熵损失,适合用于分类问题。
● optim.SGD:使用带动量的随机梯度下降(SGD)优化器。
训练过程

def train(epoch):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        optimizer.zero_grad()
        
        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0

● optimizer.zero_grad():清空梯度缓存。
● outputs = model(inputs):前向传播,得到预测值。
● loss.backward():计算梯度。
● optimizer.step():更新模型参数。
● print:每300个批次输出一次平均损失。
测试过程

def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('Accuracy on test set: %d %%' % (100 * correct / total))

● torch.no_grad():测试时不计算梯度,减少内存占用。
● torch.max(outputs.data, dim=1):选择输出中最大值的索引,作为预测类别。
● correct:累加预测正确的样本数。
● print:输出测试集的准确率。
主函数

if __name__ == '__main__':
    for epoch in range(10):
        train(epoch)
        test()

● 进行10轮训练,每轮训练结束后进行测试。
实验结果:
[1, 300] loss:2.239
[1, 600] loss:0.976
[1, 900] loss:0.409
Accuracy on test set: 90 %
[2, 300] loss:0.311
[2, 600] loss:0.273
[2, 900] loss:0.230
Accuracy on test set: 94 %
[3, 300] loss:0.193
[3, 600] loss:0.170
[3, 900] loss:0.151
Accuracy on test set: 95 %
[4, 300] loss:0.132
[4, 600] loss:0.115
[4, 900] loss:0.117
Accuracy on test set: 96 %
[5, 300] loss:0.089
[5, 600] loss:0.098
[5, 900] loss:0.091
Accuracy on test set: 97 %
[6, 300] loss:0.073
[6, 600] loss:0.075
[6, 900] loss:0.073
Accuracy on test set: 97 %
[7, 300] loss:0.056
[7, 600] loss:0.064
[7, 900] loss:0.057
Accuracy on test set: 97 %
[8, 300] loss:0.045
[8, 600] loss:0.048
[8, 900] loss:0.050
Accuracy on test set: 97 %
[9, 300] loss:0.038
[9, 600] loss:0.040
[9, 900] loss:0.040
Accuracy on test set: 97 %
[10, 300] loss:0.031
[10, 600] loss:0.030
[10, 900] loss:0.033
Accuracy on test set: 97 %

标签:loss,nn,self,torch,MLP,感知机,PyTorch,train,test
From: https://blog.csdn.net/RG_xwz/article/details/143744447

相关文章

  • Pytorch实战
      在学习某个深度学习框架时,掌握其基本知识和接口固然重要,但如何合理组织代码,使得代码具有良好的可读性和可扩展性也必不可少。本文不会深入讲解过多知识性的东西,更多的则是传授一些经验,这些内容可能有些争议,因其受我个人喜好和coding风格影响较大,**你可以将这部分当成是一种参......
  • PyTorch 手写字符识别
    PyTorch手写字符识别我们使用MNIST数据集对建立的卷积神经网络进行了训练,并加载测试集进行测试,最终的识别精度达到了99%。但是官方和网上的测试流程只是演示最终的测试结果,没有很直观的告诉我们怎么在项目中使用他。我们学习机器学习和人工智能的目的不是跑一个官网的演示程......
  • 【Pytorch】神经网络介绍|激活函数|使用pytorch搭建方法
    神经网络神经网络介绍概念神经网络人工神经网络ANN也称神经网络NN是一种模仿生物神经网络结构和功能的计算模型人脑可以看作是一个生物神经网络,由众多神经元连接而成,神经网络可以看作是模拟生物神经元的过程输入层inputLayer:输入x的那一层输出层output......
  • python-三方库-PyTorch-Pillow (PIL Fork)
    1需求官网:https://python-pillow.org/docs:https://pillow.readthedocs.io/en/stable/需求:Image.filename需求:获取图像格式Image.format需求:获取图像尺寸Image.sizeImage.widthImage.height需求:获取图像颜色模式Image.mode需求:获取图像像素值Image.load()[x,y]......
  • pytorch中的ImageFolder 用法
    ImageFolder是PyTorch中torchvision.datasets模块提供的一个常用类,用于从文件夹中加载图像数据。它是一种非常方便的方式来加载按文件夹结构组织的图像数据集。这个类能够自动将文件夹中的子目录作为标签,并且将其中的图像文件加载为PyTorch张量。1.基本概念ImageF......
  • PyTorch——从入门到精通:PyTorch简介与安装(最新版)【PyTorch系统学习】
    前言        在这个由数据驱动的时代,深度学习已经成为了推动技术进步的核心力量。而PyTorch,作为当今最流行的深度学习框架之一,以其动态计算图、易用性和灵活性,受到了全球开发者和研究者的青睐。为了帮助更多的学习者和开发者掌握这一强大的工具,我决定在CSDN开设一个专......
  • 深度学习 PyTorch 中的 logits 和交叉熵损失函数
    在深度学习中,理解损失函数是训练模型的关键一步。在分类任务中,交叉熵损失函数是最常用的损失函数之一。本文将详细解释PyTorch中的logits、交叉熵损失函数的工作原理,并展示如何调整张量的形状以确保计算正确的损失。什么是logits?logits是模型输出的未归一化预测值,通常......
  • 【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码-基于P
    【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码一.CenterNet目标检测模型1.中心点热力图2.物体尺寸回归3.分类任务4.损失函数二、融合目标检测CenterFusion算法原理三.实现案例与代码数据集与实验环境数据预处理与增强模型定义......
  • 基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端页面展示......
  • PyTorch 应用实战
    PyTorch作为深度学习非常重要的框架之一,在科研和开发领域有着非常广泛的使用,是我们学习和研究LLM必备的工具之一。本文主要介绍三个PyTorch的实战案例,方便大家快速了解和体验PyTorch。一、PyTorch简介PyTorch是一个开源的Python深度学习框架,它具有灵活、高效、易于学......