深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

这篇具有很好参考价值的文章主要介绍了深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

  • 本文是使用pytorch对卷积神经网络(Convolutional Neural Network, CNN)的代码实现,作为之前介绍CNN原理的一个代码补充。
  • 本文代码相关介绍相对较为详细,也为自己的一个学习过程,有错误的地方欢迎指正。
  • 本人介绍CNN原理的链接:CNN原理介绍1
    CNN原理介绍2

简述CNN结构

  • 为方便理解,如下图所示(详细介绍看上方链接)

深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

  • 结构:一个卷积神经网络由若干卷积层、Pooling层、全连接层组成
  • 流程通俗理解(卷积):输入图片通过卷积核提取特征参数Feature Maps,此为卷积层的操作;
  • 流程通俗理解(池化):得到的特征参数经过池化层进行化简减少参数量,此为池化层的操作
  • 流程通俗理解(全连接):将最终提取到的特征信息输入到全连接神经网络进行计算
  • 上面图中一张图变成了3张Feature Maps是因为Feature Maps数量跟图片通道数有关,卷积核也同样是对应的,一个通道对应一个卷积核
  • 具体名称的介绍可以见:名称介绍

完整流程:

step1 导入需要的包

import torch
import torch.nn as nn
import torch.utils.data as Data
from torch.autograd import Variable
import torchvision # pytorch的一个视觉处理工具包(需单独安装)
  • PyTorch中主要的包
    • torch.nn :包含用于构建神经网络的模块和可扩展类的子包。
    • torch.autograd :支持PyTorch中所有的可微张量运算的子包
    • torch.nn.functional :一种功能接口,包含用于构建神经网络的典型操作,如损失函数、激活函数和卷积运算
    • torch.optim :包含标准优化操作(如SGD和Adam)的子包。
    • torch.utils :工具包,包含数据集和数据加载程序等实用程序类的子包,使数据预处理更容易
    • torchvision :一个提供对流行数据集、模型架构和计算机视觉图像转换的访问的软件包
  • 这些包可能代码中并未用到;参考资料1

step2 数据预处理

首先是关于将数据转换成tensor的原因

  • Tensor的意义:Tensor之于PyTorch就好比是array之于Numpy或者DataFrame之于Pandas,都是构建了整个框架中最为底层的数据结构;
  • Tensor的区别:Tensor又与普通的数据结构不同,具有一个极为关键的特性——自动求导而且它表示一个多维矩阵,在计算方面还可以在GPU上使用以加速计算.
  • PyTorch中对于数据集的处理有三个非常重要的类:Dataset、Dataloader、Sampler,它们均是 torch.utils.data 包下的模块(类)
    • Dataloader是数据的加载类,它是对于Dataset和Sampler的进一步包装,用于实际读取数据,可以理解为它是这个工作的真正实践者。参考资料2

关于torchvision中的数据集

  • torchvision中datasets中所有封装的数据集都是torch.utils.data.Dataset的子类,它们都可以用torch.utils.data.DataLoader进行数据加载。以datasets.MNIST类为例,具体参数和用法如下所示:
CLASS torchvision.datasets.MNIST(
          root: str, 
          train: bool = True, 
          transform: Optional[Callable] = None, 
          target_transform: Optional[Callable] = None, 
          download: bool = False
)
  • root (string): 表示数据集的根目录,其中根目录存在MNIST/processed/training.pt和MNIST/processed/test.pt的子目录(其实就是对下载的文件指定位置)
  • train (bool, optional): 如果为True,则从training.pt创建数据集,否则从test.pt创建数据集
  • download (bool, optional): 如果为True,则从internet下载数据集并将其放入根目录。如果数据集已下载,则不会再次下载
  • transform (callable, optional): 接收PIL图片并返回转换后版本图片的转换函数(就是把图片或者numpy中的数组转换成tensor)
  • target_transform (callable, optional): 接收PIL接收目标并对其进行变换的转换函数
  • 具体参考:参考资料3

什么是Variable?

  • variable是tensor的封装,在神经网络中,常需要反向传播这些的,所以需要各个节点是连接在一起的,是个计算图,tensor的数据格式就好比星星之火,但是无法汇聚一起;等变成variable之后就可以慢慢燎原了。
  • 关于Variable

代码分析

深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

  • Data.DataLoader:加载数据
    • shuffle:表示打乱数据顺序
  • torch.unsqueeze:个人理解就是改变数据shape,此处就是把训练数据本来是一维的给"竖"起来作为一条一条数据进行训练(等以后我想起来更通俗的再修改,具体函数用法看下面参考资料)
    • 详情介绍:参考资料4 参考资料5
    • 图像尺寸是28*28的,具体验证可见最下面我jupyter转成的html结果

step3 定义网络结构

深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

  • Net需要继承自nn.Module,通过super(python中的超类)完成父类的初始化,个人理解类比于python中定义类要继承Object类,这样很多基础定义就可以略去了
    • nn.Module是nn中十分重要的类,包含网络各层的定义及forward方法参考资料6
  • nn.Sequential返回的是一个序列容器用于搭建神经网络的模块,按照被传入构造器的顺序添加到nn.Sequential()容器中,比如con1中就是进行封装先进行第一层的卷积和池化,conv2同理,然后定义前向传播(注意是卷积两次) 参考资料7
    • nn.Conv2d: 在Pytorch的nn模块中,封装了nn.Conv2d()类作为二维卷积的实现,二维卷积应该是最常用的卷积方式了 参考资料8
关于网络结构中流程梳理
  • 关于卷积层nn.Conv2d中的参数介绍:in_channels 输入图片的通道数,同理out_channels为输出图片的通道数(都为自定义的,我搜集资料看到有1,3,16,32等等);kernel_size为卷积核大小,5 * 5可以直接简写,如果是3 * 5就要写成元组的形式;stride为卷积核移动的步长;padding为填充的大小,具体意义可见文章顶部原理介绍

  • nn.ReLU()为激活函数,使用ReLU激活函数有解决梯度消失的作用(具体作用看文章顶部原理中有介绍)

  • nn.MaxPool2d:maxpooling有局部不变性而且可以提取显著特征的同时降低模型的参数,从而降低模型的过拟合,具体操作看下图,除了最大值,还可以取平均值

  • nn.Linear主要是用于全连接层 参考资料8

  • x.view()就是对tensor进行reshape:参考资料9
    深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

  • 关于卷积时候图片size的变化

    • 首先输入通道为1,尺寸大小为28 * 28,即(1,28,28)
    • 经过卷积后因为自定义输出通道为16,那么尺寸为(16,28,28)
    • 经过池化层,因为卷积核是2 * 2的,所以尺寸降低为(16,14,14)
    • 继续conv2卷积,池化后就尺寸变成了(32,7,7)
    • nn.Linear具体用法(10是因为这个识别结果是0-9,为10个类别):参考资料10
  • 关于输出尺寸的计算公式

    • O = (I - K + 2P)/ S +1
    • I输入尺寸,K是卷积核大小,P是padding大小,S是步长

step4 训练模型

深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)

  • 关于优化器torch.optim.Adam,个人也还不是特别理解详细的作用,此处待补充链接
  • 交叉熵损失函数(适合分类模型): 个人之前的总结
  • optimizer.zero_grad()关于优化器清空上层的梯度
    • 有介绍是为了优化内存的 : 参考资料11
    • 有介绍是一种tips故意不清零来进行梯度优化的
    • 总之还是那句,优化器我搞懂了再补上…
    • 其实单纯论反向传播得时候梯度的更新貌似没有提及是否需要清空上层梯度:梯度下降与反向传播
  • loss.backward()反向传播上面介绍Variable的时候已经讲过,已经封装好了(看CNN原理部分反向传播求各个参数不同层级参数的偏导求得相似,结果在这里只需要调用api…)
  • torch.max 通俗讲就是返回列表中最大的数,具体用法可以见最下方html文件

完整代码

  • 参考资料12
  • 参考资料13
import torch
import torch.nn as nn
import torchvision 
import torch.utils.data as Data
 
torch.manual_seed(1)  # 设置随机种子, 用于复现
 
# 超参数
EPOCH = 1       # 前向后向传播迭代次数
LR = 0.001      # 学习率 learning rate 
BATCH_SIZE = 50 # 批量训练时候一次送入数据的size
DOWNLOAD_MNIST = True 
 
# 下载mnist手写数据集
# 训练集
train_data = torchvision.datasets.MNIST(  
    root = './MNIST/',                      
    train = True,                            
    transform = torchvision.transforms.ToTensor(),                                                
    download=DOWNLOAD_MNIST 
)
 
# 测试集
test_data = torchvision.datasets.MNIST(root='./MNIST/', train=False)  # train设置为False表示获取测试集
 
# 一个批训练 50个样本, 1 channel通道, 图片尺寸 28x28 size:(50, 1, 28, 28)
train_loader = Data.DataLoader(
    dataset = train_data,
    batch_size=BATCH_SIZE,
    shuffle=True
) 
#  测试数据预处理;只测试前2000个
test_x = torch.unsqueeze(test_data.data,dim=1).float()[:2000] / 255.0
# shape from (2000, 28, 28) to (2000, 1, 28, 28)
test_y = test_data.targets[:2000]
 
class CNN(nn.Module):
    def __init__(self):
        super(CNN,self).__init__()
 
        self.conv1 = nn.Sequential(
            nn.Conv2d(                      # 输入的图片 (1,28,28)
                in_channels=1,
                out_channels=16,            # 经过一个卷积层之后 (16,28,28)
                kernel_size=5,
                stride=1,                    # 如果想要 con2d 出来的图片长宽没有变化, padding=(kernel_size-1)/2 当 stride=1
                padding=2
            ),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)      # 经过池化层处理,维度为(16,14,14)
        )
 
        self.conv2 = nn.Sequential(
            nn.Conv2d(                         # 输入(16,14,14)
                in_channels=16,
                out_channels=32,
                kernel_size=5,
                stride=1,
                padding=2
            ),                                 # 输出(32,14,14)
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2)        # 输出(32,7,7)
        )
 
        self.out = nn.Linear(32*7*7,10)
 
    def forward(self, x):
        x = self.conv1(x)                     #(batch_size,16,14,14)
        x = self.conv2(x)                     # 输出(batch_size,32,7,7)
        x = x.view(x.size(0),-1)              # (batch_size,32*7*7)
        out = self.out(x)                     # (batch_size,10)
        return out
 
cnn = CNN()
optimizer = torch.optim.Adam(cnn.parameters(),lr=LR) # 定义优化器
loss_func = nn.CrossEntropyLoss() # 定义损失函数
 
for epoch in range(EPOCH):
 
    for step,(batch_x,batch_y) in enumerate(train_loader):
        pred_y = cnn(batch_x)
        loss = loss_func(pred_y,batch_y)
        optimizer.zero_grad() # 清空上一层梯度
        loss.backward() # 反向传播
        optimizer.step() # 更新优化器的学习率,一般按照epoch为单位进行更新
 
        if step % 50 == 0:
            test_output = cnn(test_x)
            pred_y = torch.max(test_output, 1)[1].numpy()  # torch.max(test_out,1)返回的是test_out中每一行最大的数)
                                                                # 返回的形式为torch.return_types.max(
                                                                #           values=tensor([0.7000, 0.9000]),
                                                                #           indices=tensor([2, 2]))
                                                                # 后面的[1]代表获取indices
            print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy())
 
 
# 打印前十个测试结果和真实结果进行对比
test_output = cnn(test_x[:10])
pred_y = torch.max(test_output, 1)[1].numpy()
print(pred_y, 'prediction number')
print(test_y[:10].numpy(), 'real number')

补充一个测试过程掌握的小tips

  • 比如使用anaconda中的jupyter测试,但是anaconda中又很多虚拟环境,怎么将jupyter切换到测试用的虚拟环境呢
    • 需要注册,具体参考: 参考资料14
    • 比如我创建CNN测试环境是名称是python36,而默认是python3也就是base环境,按照上述安装并注册后就可以切换啦

深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)文章来源地址https://www.toymoban.com/news/detail-456332.html

附件

  • 测试CNN代码的详细步骤html文件
  • GitHub上资源(html文件自己下载用浏览器打开)
  • csdn资源(这个我设置确实是免费,貌似下载还是要收费)

到了这里,关于深度学习4 -- 卷积神经网络(代码实现篇+付详细流程文件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

    本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。 卷积神经网络是一种多层、前馈型神经网络。从功能上

    2024年02月13日
    浏览(44)
  • 项目实战解析:基于深度学习搭建卷积神经网络模型算法,实现图像识别分类

    随着人工智能的不断发展,深度学习这门技术也越来越重要,很多人都开启了学习机器学习,本文将通过项目开发实例,带领大家从零开始设计实现一款基于深度学习的图像识别算法。 学习本章内容, 你需要掌握以下基础知识: Python 基础语法 计算机视觉库(OpenCV) 深度学习

    2024年02月03日
    浏览(61)
  • 【毕业设计】深度学习图像分类算法研究与实现 - python OpenCV 卷积神经网络

    🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定

    2024年02月08日
    浏览(51)
  • 深度学习|卷积神经网络

    卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习神经网络结构,主要用于 图像识别 、 计算机视觉 等领域。该结构在处理图像等高维数据时表现出色,因为它具有共享权重和局部感知的特点,一方面减少了权值的数量使得网络易于优化,另一方面降低了模型的复

    2024年02月11日
    浏览(40)
  • 深度学习,卷积神经网络

      CV领域发展 CV领域是计算机视觉(Computer Vision)领域的简称。 计算机视觉是指利用计算机模拟人类视觉系统的科学,让计算机具有类似于人类在观察外界的视觉、图像的能力,包括图像处理、图像分析、图像理解等。 计算机视觉领域发展有以下特点: 视觉系统的出现和不

    2024年02月15日
    浏览(51)
  • 【深度学习】6-1 卷积神经网络 - 卷积层

    卷积神经网络(Convolutional Neural Network, CNN )。 CNN 被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础。 首先,来看一下 CNN 的网络结构,了解 CNN 的大致框架。CNN 和之前介绍的神经网络一样,可以像乐高积木一样通过组装层

    2024年02月10日
    浏览(46)
  • 计算机竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

    🔥 优质竞赛项目系列,今天要分享的是 基于人工智能的图像分类技术 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失

    2024年02月11日
    浏览(61)
  • Python中的深度学习:神经网络与卷积神经网络

    当下,深度学习已经成为人工智能研究和应用领域的关键技术之一。作为一个开源的高级编程语言,Python提供了丰富的工具和库,为深度学习的研究和开发提供了便利。本文将深入探究Python中的深度学习,重点聚焦于神经网络与卷积神经网络的原理和应用。 深度学习是机器学

    2024年02月08日
    浏览(41)
  • 深度学习算法及卷积神经网络

    传统神经网络 深度学习不适用情况:跨域(股票预测问题),旧历史数据的规律不适合新数据的规律 矩阵计算: 输入数据x[32×32×3]=3072个像素点,展开成一列, 目的:做一个10分类,10组权重参数,得到10个值,属于各个类别的概率 偏置项b,10个值 权重参数W得到:先随机,

    2023年04月08日
    浏览(49)
  • 深度学习基础——卷积神经网络(一)

    卷积是卷积神经网络中的基本操作,对于图像的特征提取有着关键的作用,本文首先介绍卷积的基本原理与作用,然后通过编写程序实现卷积操作,并展示了均值、高斯与sobel等几种经典卷积核的卷积效果,接着调用MindSpore中的卷积算子Conv2d来实现卷积操作,最后介绍了Mind

    2024年02月20日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包