搭建不同网络训练MNIST

简介: 搭建不同网络训练MNIST

问题

在之前的学习过程中,我们学习了如何搭建全连接神经网络训练Mnist数据集。初始时,全连接神经网络训练结果验证集和训练集的精确度不高,在对数据进行归一化,调参等操作提高了精确度。我们这次使用Le-Net5和VGG对MNIST进行训练,VGG采样层太多,计算量庞大,我们只进行搭建,也可以采用Google Colab进行训练。比较全连接和卷积神经网络异同。

Le-net5网络如下。


方法

搭建le-net5神经网络,定义了两层卷积层、两个均值池化以及三层全连接网络。使用summary可查看得到每层网络的输入和输出。

import torch
from torch import nn
from torchinfo import summary
import torch.nn.functional as F
import torchvision
from torchvision import datasets,transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
from torchvision.transforms import ToTensor
from torchvision.transforms import Normalize
import time
start=time.time()
class MyNet(nn.Module):
   # x=1*28*28 c*h*w c表示通道数,h表示图像高度,w表示图像宽度
   #定义网络有哪些层,层作为成员变量
   def __init__(self) -> None:
       super().__init__()
       self.conv1=nn.Conv2d(in_channels=1,
                  out_channels=6,
                  kernel_size=5,
                  stride=1,
                  padding=0)#[28]
       self.avg_pool1 = nn.AvgPool2d(
           2,
           stride=2,
       )
       self.conv2=nn.Conv2d(in_channels=6,
                  out_channels=16,
                  kernel_size=5,
                  stride=1,
                 )
       self.avg_pool2 = nn.AvgPool2d(
           2,
           stride=2,
       )
       self.fc1=nn.Linear(in_features=4 * 4 * 16,
                       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=torch.relu(self.conv1(x))
       x=torch.relu(self.avg_pool1(x))
       x=torch.relu(self.conv2(x))
       x=torch.relu(self.avg_pool2(x))
       x=torch.flatten(x,1)# nn.Flatten()默认从dim=1开始 torch.flatten()默认从dim=0开始
       x=torch.relu(self.fc1(x))
       x=torch.relu(self.fc2(x))
       out=torch.relu(self.fc3(x))
       return out

搭建VGG11,定义了八个卷积层,五个最大池化层和三层全连接层。由于网络搭建复杂,计算量过大,运行很慢。VGG模型框架如下。

class MyNet(nn.Module):
   # x=1*28*28 c*h*w c表示通道数,h表示图像高度,w表示图像宽度
   #定义网络有哪些层,层作为成员变量
   def __init__(self) -> None:
       super().__init__()
       self.conv1=nn.Conv2d(in_channels=1,
                  out_channels=64,
                  kernel_size=3,
                  stride=1,
                  padding=1)#[B,64,224,224]
  self.MaxPool_1=nn.MaxPool2d(kernel_size=2,
                                 stride=2)#[64,112,112]
       self.conv2=nn.Conv2d(in_channels=64,
                            out_channels=128,  # [B,128,112,112]
                           kernel_size=3,
                            stride=1,
                            padding=1)
       self.MaxPool_2= nn.MaxPool2d(kernel_size=2,
                                 stride=2)#[128,56,56]
       self.conv3=nn.Conv2d(in_channels=128,
                            out_channels=256,  # [B,256,56,56]
                           kernel_size=3,
                            stride=1,
                            padding=1)
       self.conv4 = nn.Conv2d(
           in_channels=256,
           out_channels=256,
           kernel_size=3,
           stride=1,
           padding=1#[256,56,56]
       )
       self.MaxPool_3 = nn.MaxPool2d(
           kernel_size=2,
           stride=2)#[256,28,28]
       self.conv5 = nn.Conv2d(
           in_channels=256,
           out_channels=512,
           kernel_size=3,
           stride=1,
           padding=1#[512,56,56]
       )
       self.conv6 = nn.Conv2d(
           in_channels=512,
           out_channels=512,
           kernel_size=3,
           stride=1,
           padding=1#[512,56,56]
       )
       self.MaxPool_4 = nn.MaxPool2d(
           kernel_size=2,
           stride=2)#[512,14,14]
       self.conv7 = nn.Conv2d(
           in_channels=512,
           out_channels=512,
           kernel_size=3,
           stride=1,#[512,28,28]
           padding=1
       )
       self.conv8 = nn.Conv2d(
           in_channels=512,
           out_channels=512,
           kernel_size=3,
           stride=1,#[512,56,56]
           padding=1
       )
       self.MaxPool_5=nn.MaxPool2d(
           kernel_size=2,
           stride=2)#[512,7,7]
       self.fc1 = nn.Linear(
           in_features=512 * 7 * 7,
           out_features=4096
       )
       self.fc2 = nn.Linear(
           in_features=4096,
           out_features=4096
       )
       self.fc3 = nn.Linear(
           in_features=4096,
           out_features=10
       )
   def forward(self,x):
       x=torch.relu(self.conv1(x))
       x=torch.relu(self.MaxPool_1(x))
       x=torch.relu(self.conv2(x))
       x=torch.relu(self.MaxPool_2(x))
       x = torch.relu(self.conv3(x))
       x = torch.relu(self.conv4(x))
       x = torch.relu(self.MaxPool_3(x))
       x = torch.relu(self.conv5(x))
       x = torch.relu(self.conv6(x))
       x = torch.relu(self.MaxPool_4(x))
       x = torch.relu(self.conv7(x))
       x = torch.relu(self.conv8(x))
       x = torch.relu(self.MaxPool_5(x))
       x=torch.flatten(x,1)# nn.Flatten()默认从dim=1开始 torch.flatten()默认从dim=0开始
       x=torch.relu(self.fc1(x))
       x=torch.relu(self.fc2(x))
       out=torch.relu(self.fc3(x))
       return out

对比batch_size=64的全连接网络和le-net5卷积神经网络对MNIST数据集的效果。对数据结果进行数据可视化。



结语

图像的数据是一个矩阵,也就是一个像素点的和它所在位置的上下左右像素点有很大的相关性,将像素矩阵flatten后,左右的位置关系保留了,但是上下的位置关系却被破坏了。

卷积神经网络和全连接神经网络的不同之处在于,卷积神经网络的输入是图像的原始矩阵,这样保留了图像的上下左右位置关系。

数据可视化的结果显示,fcn和Le-net5的精确度达到最好的效果,验证集和训练集的精确度高达99%,FCN这组数据有些过拟合,FCN存在参数过多,而使用CNN可以减少参数,降低过拟合,在 Le-net5模型搭建为了降低过拟合,使用了Dropout方法。在训练VGG过程中可以降低batch_size,也可通过Google Colab进行训练。

目录
相关文章
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
86 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
56 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
3月前
|
机器学习/深度学习
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
本文分析了神经网络中验证集(测试集)准确率高于训练集准确率的四个可能原因,包括数据集大小和分布不均、模型正则化过度、批处理后准确率计算时机不同,以及训练集预处理过度导致分布变化。
|
1月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
46 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
机器学习/深度学习 算法 TensorFlow
深度学习笔记(五):学习率过大过小对于网络训练有何影响以及如何解决
学习率是深度学习中的关键超参数,它影响模型的训练进度和收敛性,过大或过小的学习率都会对网络训练产生负面影响,需要通过适当的设置和调整策略来优化。
271 0
深度学习笔记(五):学习率过大过小对于网络训练有何影响以及如何解决
|
1月前
|
机器学习/深度学习 算法
【机器学习】揭秘反向传播:深度学习中神经网络训练的奥秘
【机器学习】揭秘反向传播:深度学习中神经网络训练的奥秘
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
3月前
|
机器学习/深度学习
|
3月前
|
机器学习/深度学习
CNN网络编译和训练
【8月更文挑战第10天】CNN网络编译和训练。
90 20
|
3月前
|
机器学习/深度学习 API 算法框架/工具
【Tensorflow+keras】Keras API三种搭建神经网络的方式及以mnist举例实现
使用Keras API构建神经网络的三种方法:使用Sequential模型、使用函数式API以及通过继承Model类来自定义模型,并提供了基于MNIST数据集的示例代码。
54 12