CNN神经网络图像分类---全流程

    Hello,又是一个分享的日子,上期博主介绍了CNN神经网络文本分类----招聘信息分类,并介绍了文本在进入神经网络前的预处理工作。今天博主给大家分享的是用CNN神经网络对图像数据的分类,不可避免的,这也同样需要对图像数据进行预处理

    当然啦,博主也在往期的推文中也介绍了CNN卷积神经网络的原理,还不熟悉CNN卷积神经网络原理的小伙伴可以翻一下什么?卷积层会变胖?人工智能之光---CNN卷积神经网络(原理篇),这里博主就不进行过多的赘述了。

    

图像预处理

数据集                                                                                         

640?wx_fmt=gif

    这一期,我们是基于fashion MNIST数据的图像分类去做实验。在20178月份,德国研究机构Zalando ResearchGitHub上推出了一个全新的数据集,其中训练集包含60000个样例,测试集包含10000个样例,分为10类,每一类的样本训练样本数量和测试样本数量相同。样本都来自日常穿着的衣裤鞋包,每个都是28×28灰度图像,其中总共有10类标签,每张图像都有各自的标签。

CNN神经网络图像分类---全流程_第1张图片

    使用这个数据集的目的是为了让大家了解整个图像分类的处理流程,即如何将图像数据转成计算机能够读懂的格式,并灌入神经网络模型中训练,最后得到我们想要的分类结果。

    那为什么不用Keras自带的数据集呢?那是因为如果我们单纯用Keras自带的数据集如Cifar-10,这些数据集都是已经被处理好的了,我们直接调用即可,这样大家的知识体系就少了预处理的过程,而且对于后面的迁移学习做图像分类,我们同样也是用fashion MNIST这个数据集,确保大家都对整体的图像分类流程有个明确的思路。

    图像预处理相对文本预处理要简单一些,只需要用Python将数据读入,然后将其转换成同样大小的矩阵格式即可,然后对矩阵进行归一化,这样就可以被神经网络所读入。这些操作均在后面代码中体现。

    这里还需要讲的是Keras的图像生成器ImageDataGenerator。这个生成器有很多操作如翻转、旋转和缩放等,目的是生成更加多且不一样的图像数据,这样我们得到的训练模型泛化性更加的好,从而得到的模型更加准确。

      

 datagen = ImageDataGenerator(	
        featurewise_center=False,  	
        # set input mean to 0 over the dataset	
        samplewise_center=False, 	
         # set each sample mean to 0	
        featurewise_std_normalization=False,  	
        # divide inputs by std of the dataset	
        samplewise_std_normalization=False,  	
        # divide each input by its std	
        zca_whitening=False,  	
        # apply ZCA whitening	
        zca_epsilon=1e-06,  	
        # epsilon for ZCA whitening	
        rotation_range=0,  	
        validation_split=0.0)

    上面就是图像增强的核心代码,这只是对图像的一部分操作,更多的操作我们可以通过官网去查询,每个参数的意思在官网已经有详细描述,因此博主就不进行太多的赘述了。这里博主给大家附上链接即可。

Keras图像生成器参数含义

https://keras.io/zh/preprocessing/image/

实验

实验环境                                                                                          

640?wx_fmt=gif

  • Anaconda Python 3.7 

  • Jupyter Notebook

  • Keras

    开发环境安装在之前的推文中已经介绍,还没安装的小伙伴可以翻一下。

  • Python开发环境---Windows与服务器篇

  • Python深度学习开发环境---Keras

  • 图像数据集

提取码:ffbp

https://pan.baidu.com/s/1D4EKsd3GpWXcjRnmJtFGXw

 

实验流程                                                                                          

640?wx_fmt=gif

  • 加载图像数据

  • 图像数据预处理  

  • 训练模型

  • 保存模型与模型可视化

  • 训练过程可视化

代码                                                                                                 

640?wx_fmt=gif

  •     核心代码

model = Sequential()	
model.add(Conv2D(32, (3, 3), padding='same',  # 32,(3,3)是卷积核数量和大小	
                 input_shape=x_train.shape[1:]))  # 第一层需要指出图像的大小	
model.add(Activation('relu'))	
model.add(Conv2D(32, (3, 3)))	
model.add(Activation('relu'))	
model.add(MaxPooling2D(pool_size=(2, 2)))	
model.add(Dropout(0.25))	

	
model.add(Conv2D(64, (3, 3), padding='same'))	
model.add(Activation('relu'))	
model.add(Conv2D(64, (3, 3)))	
model.add(Activation('relu'))	
model.add(MaxPooling2D(pool_size=(2, 2)))	
model.add(Dropout(0.25))	

	
model.add(Flatten())	
model.add(Dense(512))	
model.add(Activation('relu'))	
model.add(Dropout(0.5))	
model.add(Dense(num_classes))	
model.add(Activation('softmax'))	

	
# initiate RMSprop optimizer	
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)	

	
# Let's train the model using RMSprop	
model.compile(loss='categorical_crossentropy',	
              optimizer=opt,	
              metrics=['accuracy'])

  • 参数

    Dense: 全连接层。

    CNN2D:2维卷积神经网络,常用于处理图像。

    Dropout: 以一定概率放弃两层之间的一些神经元链接,防止过拟合,可以加在网络层与层之间。

    optimizer: 优化器,梯度下降的优化方法

    这些都在之前的推文中有所介绍,小伙伴们可以去翻阅一下。

    码前须知---TensorFlow超参数的设置

    activation: 激励函数,‘linear’一般用在回归任务的输出层,而‘softmax’一般用在分类任务的输出层

    validation_split 切分一定比例的训练集作为验证集

    loss: 拟合损失方法,这里用到了多分类损失函数交叉熵


        如果你的label 是 数字编码 ,用 sparse_categorical_crossentropy

       如果你的 label是 one-hot 编码,用 categorical_crossentropy

        keras还有别的误差函数,在后续的推文会一一介绍。

  • epochs 与 batch_size:前者是迭代次数,后者是用来更新梯度的批数据的大小,iteration = epochs / batch_size, 也就是完成一个epoch需要跑多少个batch。这这两个参数可以用控制变量法来调参,控制一个参数,调另外一个,看损失曲线的变化。

    小伙伴们可以去keras官网查看更多的参数含义与用途,博主也会在后续的课程中通过实验的方法将这些参数涉及进来,让大家的知识点串联起来。

        

Keras官网

https://keras.io/

  • Git链接

代码

https://github.com/ChileWang0228/DeepLearningTutorial/blob/master/CNN/Tradition_cnn_image.ipynb

训练结果                                                                                             

640?wx_fmt=gif

  • 训练过程

CNN神经网络图像分类---全流程_第2张图片

  • 结果分析

    这里只跑了5个epoch,结果还在呈现上升趋势,说明我们可以将epoch设置大一些,得到的模型会更加准确,有兴趣的小伙伴们,可以尝试对其进行调参。

代码实践视频                                                                                          

640?wx_fmt=gif

视频卡顿?bilibili值得拥有~(っ•̀ω•́)っ✎⁾⁾ 我爱学习

https://www.bilibili.com/video/av60599314/

总结

640?wx_fmt=gif

        好了,到这里,我们就已经将CNN卷积神经网络图像分类的知识点讲完了。大家在掌握了整个流程之后,就可以在博主的代码上修修补补,训练自己的CNN卷积神经网络来做图像分类任务了。

       下一期,博主就带领大家用迁移学习来做图像分类,敬请期待吧~

图片来源于网络,侵删

    

留言

640?wx_fmt=gif

博主刚弄的一个留言功能,欢迎各位小伙伴踊跃留言~smiley_13.png

CNN神经网络图像分类---全流程_第3张图片

CNN神经网络图像分类---全流程_第4张图片

xmorient

你可能感兴趣的:(CNN神经网络图像分类---全流程)