关于CIFAR-10图像分类总结

关于CIFAR-10图像分类问题,网络上有很多资源,这里记录一些在我的学习过程中的资料,主要是关于深度卷积神经网络处理图像分类的,包括VGGNet,GoogLeNet以及ResNet,也记录了一些杂七杂八的东西,像TensorFlow的函数、神经网络的优化技巧等等。如果没有合适工具进行学习,可以浏览关于Google Colaboratory的介绍部分。

一、综述:图像分类算法、深度学习在图像分类中的应用

这一部分主要是一些综述的文字,要完成一个图像分类任务,还是要懂一些大背景知识的是吧!
首先,关于图像分类的综述,可以阅读这一篇文章:
图像物体检测与分类综述
要了解深度学习在图像分类中的应用:
深度学习在图像分类中的发展
还有:从大方面了解深度学习的图像分类的话看一看:
深度学习-图像分类
很多网站都转载了这篇文章,文章比较了五种图像分类算法,传统机器学习以及深度学习的方法都有涉及,了解图像分类可以看一看
原文:Image Classification in 5 Methods
翻译等可见:图像分类 | 深度学习PK传统机器学习

二、关于传统机器学习算法处理图像分类

例如KNN、SVM等算法都可以处理图像分类(当然简单实现的话,准确率emmm),很多资料都是来源于CS231n,在这门公开课中,介绍了一些传统机器学习算法来实现CIFAR-10图像分类任务,了解的话,可以看:
CS321n课程笔记翻译
接下来是一些具体算法:

关于KNN的资料:
KNN原理,以及使用KNN思想设计图像分类模型:
KNN原理介绍以及构建一个KNN分类器来进行图像分类
还是关于KNN的文章,虽然不实用,但是看看代码还是好的:
实验小结 CS231n assignment1 knn部分
CS231n,图像分类的KNN实现:
CS231n–图像分类(KNN实现)
那么如何最迅速,并且最方便地实现一个KNN模型呢?当然要祭出sklearn大杀器了:
sklearn之KNN详解+GridSearchCV使用方法

关于SVM图像分类模型:
关于SVM的图像分类:
线性SVM算法实现图像分类
基于SVM的分类器还有很多资料,这里就不再过多列举了。

还有贝叶斯类的方法:
关于一些其他的传统机器学习算法实现图像分类:
CIFAR-10数据集图像分类【PCA+基于最小错误率的贝叶斯决策】

网上关于CS231n这门课的文章很多,关于这门课,有一个GitHub项目,里面实现了CS231n课程中的多种图像分类算法,有时间可以看一看,没时间。。。当然是调包啊
CoderEugene/cs231n

同样是关于sklearn的使用,介绍了KNN、SVM算法如何通过sklearn库进行实现,学习一下代码吧:
python_基于Scikit learn库中KNN,SVM算法的笔迹识别

三、关于简单卷积神经网络实现CIFAR-10分类以及论文阅读问题

如果对卷积神经网络不太清楚的话,可以看一看,文章从卷积定义讲起:
CNN基础+CIFAR-10图像分类

关于介绍经典的几种卷积神经网络模型的文章:
这一篇写的比较简单,但是参数规格写的很清楚:
经典卷积神经网络结构:LeNet-5,AlexNet ,VGGNet

TensorFlow关于CIFAR-10分类的代码,我看很多书以及博客都有研究这份代码,代码还是很高级的。。。就是不怎么容易懂。。。作者把代码功能都封装在不同的函数(以及不同的文件里),所以对我这样的新手小白有点不友好,不过网上有些博客专门对这份代码进行了解释,可以看一看。
代码GitHub地址

解释代码的文章,例如:
TensorFlow中cnn-cifar10样例输入部分代码详解

这一篇文章中对TensorFlow案例代码做了一些改进,对,也就是那份在几个文件中跳来跳去的代码。。。作者对代码进行了一些合并,读起来就不会那么费劲了。:
Tensorflow基于卷积神经网络的向导程序的改进

另一篇CNN+CIFAR-10图像分类的文章:
卷积神经网络

如果阅读英文论文有困难的话,可以看一下这篇文章,文章介绍了一些GitHub项目,主要是针对优秀论文翻译的,可以参考一下:
深度学习论文集锦(中英文对照):图像分类、物体识别等

如果只是针对这几种卷积神经网络的话,可以参考这篇文章:
深度学习系列-图像分类模型-论文阅读&详解

四、VGGNet模型的文章汇总

首先,如果想要熟悉VGGNet的论文,但是读起来又感觉吃力的话,可以参考:
关于VGGNet论文理解:
深度学习图像分类(二)–VGGNet论文理解

关于VGGNet的博客,博客写的很详细了,此外,这是一系列的博客,值得一看:
大话CNN经典模型:VGGNet

学习使用Kearas的话,可以看看这一篇文章,准确率也开始变高了~:
如何用Keras从头开始训练一个在CIFAR10上准确率达到89%的模型

文章很干货,完全是代码。文中最后给出了训练数据图,最终的模型准确率大概在93%左右:
tensorflow基于vgg进行cifar-10训练

五、关于GoogLeNet模型的文章汇总

Inception论文细读,确实很详细,作者标注了一些问题,值得一看:
Google Inception Net论文细读

关于Inception的综述,这篇还是很清晰的,文中把每一代模型的问题以及改进措施都列出来了,感觉这一点很不错:
一文概括Inception家族奋斗史

还是关于Inception的文章,对各代的Inception模型都做了介绍,姑且一看:
经典网络结构GoogleNet之Inception-v1 v2 v3 v4 Resnet

关于TensorFlow使用Inception V3,文章介绍如何使用已经训练好模型,也就是迁移学习的思路:
TensorFlow学习笔记:使用Inception V3进行图像分类

这篇文章主要介绍了几种inception的结构以及实现,很值得一读:
TensorFlow实现inception-resnet

接下来就是介绍实现的文章了:
Tensorflow使用Inception思想实现CIFAR-10十分类demo

六、关于ResNet的文章汇总

关于ResNet的论文,这里有一篇翻译的文章,可以看一看:
ResNet论文翻译——中英文对照
还有这个:
ResNet v2论文笔记

关于ResNet的介绍的文章:
ResNet解析

关于ResNet的实现方法,这个博主的文章很实用的,代码满满,诚意满满,对于我这样很想提高模型的准确率,但是又不会写代码的小白来说,非常友好!!
基于Tensorflow的Resnet程序实现(CIFAR10准确率为91.5%)

为什么ResNet可以这么深?这篇文章做了介绍:
为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题。

这里插一个关于BN层的介绍部分:
BN(batch normalization)

以及这个知乎提问:
深度学习中 Batch Normalization为什么效果好?

七、关于卷积神经网络的训练技巧类文章

在学习过程中看到了一些关于神经网络训练优化的文章,在这里记录一下。
这篇博客介绍了很多CNN处理CIFAR-10图像分类的技巧,其实不仅仅局限于此,博主介绍的很多注意点对于神经网络训练都有所帮助。
CNN训练CIFAR-10的技巧

又一个图像分类算法训练技巧:
图像处理图像分类算法优化技巧

关于调优技巧的介绍,很不错:
卷积神经网络(CNN)参数优化方法

同样的技巧介绍:
深度学习训练的小技巧,调参经验。总结与记录

八、关于TensorFlow的一些函数、API介绍的文章

TensorFlow读取Batch数据的方法:
tensorflow训练时读取batch数据的方法

关于图像处理的技巧
tensorflow实现数据增强(随机裁剪、翻转、对比度设置、亮度设置)

神经网络的滑动平均介绍:
神经网络优化(二) - 滑动平均

关于TensorFlow的变量管理的介绍文章,不知道对这一点有疑惑的同学是不是跟我一样,首先在TensorFlow可视化那一部分遇到这个问题的呢?
TensorFlow的变量管理:变量作用域机制

这里开始涉及一些在写代码的过程中使用道德一些函数以及API,例如,对于如何使用 dataset,可以阅读这篇文章:
Tensorflow中API------tf.data.Dataset使用
还有这一篇,与上文有重叠:
『TensorFlow』数据读取类_data.Dataset

关于 tf.slice函数切分数组的方式,这个函数有点。。绕:
tf.slice()函数

关于tf.layers.的使用,比高级的API,比直接使用tf.nn.conv2d()更容易使用一些:
TensorFlow学习(十七):高级API之tf.layers

关于TensorFlow中的各种优化器,可以参考这个问题:
tensorflow中各种优化器有什么区别?
以及这篇博客:
深度学习优化算法解析(Momentum, RMSProp, Adam)

九、关于TensorFlow中的报错信息

之所以把TensorFlow的报错信息单独拿出来,其实个人认为,解决一些报错信息比那些函数之类的更能熟悉这个框架的使用,因此,单独摘出报错信息。

1. 第一个问题是在训练过程中,发现输出的损失值变成了nan?而且还困扰了很长时间。。。简单来说,就是训练过程中如果发现损失值变成了 nan,不妨试试将学习率调小一点:
使用tensorflow训练模型时可能出现nan的几种情况

2.

InvalidArgumentError: You must feed a value for placeholder tensor 'inputs/x_input'

可以参考这篇博客, 其实关键点就一句话,也就是在你的模型最最最前面,添加一句 tf.reset_default_graph()仅仅只是清除一下训练的图,就能解决很多莫名其妙的错误:
Tensorflow报错之一:InvalidArgumentError: You must feed a value for placeholder tensor ‘inputs/x_input’

3.

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, 
strings, lists, or numpy ndarrays.

这里的错误其实挺低级的,如果解决了的话,但是有些时候,总是很难避免,还是记录一下比较好,特别是如果使用了Python代码进行了一些数据处理的话,很容易一不小心就直接使用了(就是那个意思,不太好表达。。。)
其实解决的方法非常简单。
Tensorflow Error笔记2

十、其他的一些问题

这些问题不知道应该归到哪一类中了,全都放在这里好了:

如果写过一些代码,我觉得很多人都会有这样的疑问:为啥这个卷积核定义成这样大?为什么这个参数大家都这么写?这里有一篇文章,虽然不是非常详细以解惑,但是看一看还是很有帮助哟:
卷积神经网络的卷积核大小、个数,卷积层的个数如何确定?

此外,如果你是像博主一样的贫穷大学生,对机器学习感兴趣但是有没有 “装备” ,那么,不妨试试 Google Colaboratory,作为基础,你要了解登陆Google等基础技能,虽然不太稳定,但是相对于只用笔记本电脑的CPU跑数据来说,还是体验非常棒的!
这里贴出几篇基础介绍的博客:
Google Colab 免费GPU服务器使用教程-TensorFLow

如何利用谷歌云计算资源(Google Colab)训练自己的神经网络以及模型的保存、移植应用

很多情况下会用到较大的数据集,这里需要一个谷歌云盘,然后于笔记本进行绑定,参见:
谷歌云盘Colaboratory如何载入文件

目前想到的就这么多~

你可能感兴趣的:(深度学习)