作业2:反向传播、训练神经网络和卷积神经网络

在本作业中(2018版),将练习编写反向传播代码,训练神经网络和卷积神经网络。本作业的目标如下:

  • 理解神经网络及其分层结构
  • 理解并实现(向量化)反向传播
  • 实现多个用于神经网络最优化的更新方法
  • 实现用于训练深度网络的批量归一化( batch normalization )和层归一化(Layer Normalization)。
  • 实现随机失活(dropout)。
  • 进行高效的交叉验证并为神经网络结构找到最好的超参数
  • 理解卷积神经网络的结构,并积累在数据集上训练此类模型的经验。
  • 获得主要深度学习框架的经验,例如TensorFlowPyTorch

注:本次作业在本地完成。

本人作业代码点击这里

0 环境搭建

  1. 本次作业都是在本地Windows10系统上完成。

  2. 最后一个问题需要使用TensorFlow或PyTorch训练卷积神经网络,所以首先需要能有NVIDIA GPU,(我的是GTX 860M,很差的显卡,凑合能用。)如果有先百度一下自己的显卡能否支持TensorFlow GPU版本。理论上也可以在没有GPU的情况下完成整个任务,尽管这会使训练变得更慢。参考代码在没有GPU的双核笔记本电脑上运行10-15分钟。

  3. 如果符合硬件要求,建议安装TensorFlow GPU版本,这样训练速度会很快。安装需要先搭建其工作环境,包括显卡驱动、CUDA、cuDNN等。详细的搭建教程请参考本人的一篇相关攻略:点击这里(不过最后一步建议安装tensorflow1.9版本,因为版本过高cuDNN会出问题:pip install tensorflow-gpu==1.9.0

  4. 下载作业并解压(2018年版本2):点击这里.

  5. 下载 CIFAR-10 数据。有三种方式,一是可以去Linux系统,按照官方操作,进入assignment2文件夹,执行:

cd cs231n/datasets
./get_datasets.sh

将下载的数据拷贝到Windows下相同位置即可;二是直接去官网下载,解压到cs231n/datasets,下载地址点击这里;三是如果已完成作业一,可以直接将作业一里的数据集拷贝到作业二相同位置。

  1. 在assignment2目录下启用IPython notebook服务器,输入指令:jupyter notebook,自动进入浏览器打开Notebook,选择相应的 .ipynb文件即可。

1 全连接神经网络

要求:IPython Notebook文件FullyConnectedNets.ipynb将会介绍模块化设计,然后使用不同的层来构建任意深度的全连接网络。为了对模型进行最优化,还需要实现几个常用的更新方法。

要点
1. 数据结构与之前的不同,这次是4维的,比如(50000, 3, 32, 32);
2. 全连接、ReLU、softmax/svm损失都比较简单,和之前类似;
3. 合理性检查、梯度检查、更新方式,按说明做即可;
4. 专门用于训练的Solver模块设计的很巧妙,要能看懂!
5. 不定深度的全连接网络注意分析网络初始化特点,采用循环结构。

2 批量归一化

要求:在IPython Notebook文件BatchNormalization.ipynb中需要实现批量归一化,然后将其应用于深度全连接网络的训练中。

要点
1. 批量归一化的前向传播反向传播一定要参考论文!
2. 理解批量归一化对权重初始化的作用,以及批量大小对批量归一化的影响;
3. 层归一化是为了解决批量尺寸的问题,实现过程就是批量归一化的转置。
4. 将批量/层归一化加到全连接网络,理清逻辑。

3 随机失活(Dropout)

要求:IPython Notebook文件Dropout.ipynb将会实现随机失活,然后在模型泛化中检查它的效果。

要点
1. 随机失活的实现很简单,前向反向都承掩模即可,对抑制过拟合效果特别好;
2. 将随机失活加入到全连接网络时,可以自定义一组新的前向传播反向传播函数,包含全连接 – 批量归一化 – Dropout – ReLU。

4 卷积神经网络

要求:在IPython Notebook文件ConvolutionalNetworks.ipynb中实现几个卷积神经网络中常用的新的层。

要点
1. 卷积层的实现比较复杂,不考虑速度时可以使用4层循环嵌套;
2. 卷积层反向传播原理在本人作业中有详细介绍;
3. 池化层相对来说比较简单,也需要使用循环;
4. 以上的实现不用考虑速度,因为早已有了快速的卷积池化,可以直接用;
5. 空间批量归一化可以变换数据后直接调用批量归一化;
6. 组归一化的实现逻辑和层归一化很相似。

5 使用PyTorch / TensorFlow

要求:对于最后一部分,使用TensorFlow或PyTorch这两个流行且功能强大的深度学习框架。只需要完成这两个笔记本中的一个,不需要同时执行这两项工作。打开PyTorch.ipynbTensorFlow.ipynb。 在那里了解框架的工作原理,最终在CIFAR-10上训练自己设计的卷积网络,以获得最佳性能。

要点
1. 选择TensorFlow环境:
打开命令行输入:

activate tensorflow  # 激活自己的TensorFlow环境
conda install ipykernel  
python -m ipykernel install --user --name tensorflow --display-name "Python tensorflow"
pip install matplotlib  # 安装需要的包

这样再次使用jupyter notebook命令打开笔记时就可以选择conda环境了,方法是进入TensorFlow.ipynb点击上方 kernel->change kernel ->Python tensorflow,选中的kernel只对当前的文件有效。如果遇到cuDNN初始化失败的错误,一般来说是因为TensorFlow版本过高,建议安装1.9版本:pip install tensorflow-gpu==1.9.0
2. 第一次运行需要下载数据,耐心等待,以后就不用再下载了。处理后的数据是:
(50000, 32, 32, 3)格式
3. 剩下的跟着步骤做即可,基本都是以两层神经网络为例,模仿者实现三层卷积网络,内容很相似;
4. 注意TensorFlow的静态图结构,所有的节点在计算图上,运行时提供数据实现真正的计算;API的层次会越来越高,用起来也会越来越方便;
5. 最后一步自由训练时,提示中说不能使用层对象构建批量归一化和Dropout,否则train_34()函数失效,实际上没有问题;由于图片数据尺寸很小,不建议使用大的卷积核,最大5×5就可以了;如果使用很深的网络,建议一定要使用Dropout来抑制过拟合;通过全连接网络时,需要使用flatten()函数展平数据;主要调节的超参数就是学习率、随机失活比、卷积核尺寸、卷积核数量等;本人的方法可以在5次epoch之内达到73%的验证准确率,感兴趣可以参考。

    原文作者:HRain
    原文地址: https://www.jianshu.com/p/1085b196cdfd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞