第三周作业:卷积神经网络(Part1)

深度学习计算

这部分主要是介绍了神经网络中的一些基础知识。
跟李沐学AI-动手学深度学习-深度学习计算
在一开始学习高级编程语言的时候,我们就听说过一个词“模块化”。如果我们按照前边的所学知识一步一步的顺下来去构建神经网络,会存在大量的代码重复,现在则是将神经网络中的层和块两个概念提出来,进一步去提高代码的复用性和健壮性。
层是十分易于理解的概念,即存在于神经网络中的一个卷积层/池化层/全连接层等,通过调用torch库Module来进行抽象实现。
块则是可以描述单个层。由多个层组成的组件或者整个模型本身。使用块进行抽象的一个好处是可以将一些块组合成更大的组件。
块,可以分为:自定义块,顺序块,在正向传播函数中执行代码,混搭各种组合块。
块是一种抽象的概念,但是它可以极大程度的提高代码的书写能力,相当于高级语言中的封装,那么与封装密切相关的另一个概念就是参数。
神经网络更像是一个我们仅仅知道功能的黑盒子,我们只知道它的功能,只需要将数据输入,就可以得到最后的结果,其中的参数的变换我们是很难通过手动计算来得出的,这个时候我们可以使用输出参数的功能。来进一步了解模型的运行情况。

卷积神经网络

跟李沐学AI-动手学深度学习-卷积神经网络
之前学了一种叫做MLP的网络,它都过激活函数可以实现一些功能,但是它也有明显的弊端,比如说梯度的控制,过拟合等问题。
在通过数学公式的推导,以及平移不变性、局部性等可以得到卷积层。
卷积层的作用在我看来是可以进行特征的提取和组合,从而可以实现由低级特征转换到高级特征,最后实现一些问题。
与卷积类似,但是作用是为了增强图像的抗敏感程度的池化层。
卷积层中特征图的大小是由输入大小,卷积核大小,步长,填充这几个决定的。
但是具体在某一个卷积层能提取的特征数目,则是由该层的通道数决定的。
之前做过一个优化,就是在卷积核数目不变的情况,使用合适的步长,填充,实现特征图的数目不变,但是降低通道数目,从而实现降低运算量的操作,在实现必要的功能后,再使用相反的步骤对其进行恢复。
还有就是卷积层存在感受野相同的情况下,可以使用多个串联的小卷积核来替代一个大的卷积核,比如一个55的卷积核是可以由2个串联的卷积核进行替换的,这里可以降低参数的数目,从而降低运算代价。
在神经网络中,我们会奇怪的遇见1
1大小的卷积核,这里它的用途就是上边我说的第一种情况,就是对通道融合。
第三周作业:卷积神经网络(Part1)_第1张图片

LeNet是一种比较经典的神经网络,它是使用卷积层来学习图片的空间信息,使用池化层来提高稳定度,最后使用全连接层来转换到类别空间。
最初它应用于MNIST手写数字识别这个问题。

实训:猫狗大战

相比于上边手写数字识别的十分类问题,猫狗大战则是一个二分类问题,目前有很多不错的算法可以实现不错的效果。这里选择使用LeNet来进行实现。
但是目前的问题是,电脑没有配置gpu,只能使用cpu去训练模型,这就导致模型的训练周期特别长,所以原本的epoch=30修改为了epoch=2。
参考的主要是kaggle上的一位奆佬的代码(附上链接):https://www.kaggle.com/sahiltinky/nb-i-simple-convnet-using-pytorch
第三周作业:卷积神经网络(Part1)_第2张图片

但是最后的结果并不好,本地训练的时候,将train数据集进行划分,准确率只有75%~80%之间,最后提交的结果也仅仅为72.55。
在这里插入图片描述

本周总结:

  1. 对于数学公式的推导能力不足,但是目前这点感觉不知道从何下手,比如如何从全连接层推导到卷积层的。
  2. 自己代码能力不太够,上边的猫狗大战的代码更多是借鉴网上的资源,感觉缺乏一种整体的感觉。
  3. 对各种网络的理解不足,更多的是知道名字,但是不晓得具体的网络里边是什么,其创新点是什么。

你可能感兴趣的:(深度学习,神经网络,深度学习,pytorch)