DeepLearning (五) 基于Keras的CNN 训练cifar-10 数据库

    • 数据库介绍
    • 开发工具
    • 网络框架
    • 训练结果
    • 训练要点
    • 激活函数
    • Dropout 的作用
    • 训练代码

【原创】Liu_LongPo

转载请注明出处【CSDN】http://blog.csdn.net/llp1992

数据库介绍

Cifar-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。

Cifar-10由60000张32*32的RGB彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。

数据集可到 cifar 官网 下载。

同已经成熟的人脸识别相比,普适物体识别挑战巨大,数据中含有大量特征、噪声,识别物体比例不一。

开发工具

现在流行的DeepLearning库挺多的,现在 GitHub 上关注最火的应该是 caffe 。不过我个人觉得caffe封装的太死了,很多东西都封装成库,要学习原理的话,还是得去看看 Theano 版本的。

我个人使用的库是朋友推荐的 Keras ,是基于 Theano的,优点是使用方便,可以快速开发。

网络框架

网络框架参考 caffe 的cifar-10的框架,但自己做了修改。

框架如下:

layer1 Conv1:

kernel :32 ,kernel size : 5 , activation : relu ,dropout : 0.25

layer2 Conv2:

kernel: 32,kernel size: 5, activation : relu ,dropout : 0.25

layer3 MaxPooling1: poolsize:2

layer4 Conv3:

kernel: 64,kernel size: 3, activation : relu ,dropout : 0.25

layer5 MaxPooling2: poolsize:2

layer6: full connect 512 ,activation :tanh

layer7: softmax

训练结果

对比 Alex的论文里 的训练误差图走向,论文里说,用 relu 替换 tanh 作为激活函数可以使算法快速收敛,不过实际中我并不感觉得出可以快多少。

或者说,看loss的走向并没有论文中的那么好,当然我的框架跟作者的不完全相同。

进行 35 次迭代,最终训练准确率为 0.86,交叉验证准确率为: 0.78

感觉已经快过拟合了,于是没有再增加迭代次数。

训练要点

  • 必须要做的,对cifar-10数据库进行预处理,也就是去均值,归一化以及做白化处理。
  • 用 relu 替换 tanh 作为激活函数之后,必须讲learningrate 调低一个数量级,否则会出现过拟合。
  • relu 应该使用在什么layer呢?答案是除了最后一层的 softmax 要用tanh之外,其他层都可以。
  • 关于Dropout的比例,论文中说是 0.5 ,但是我却发现 0.25 效果更好,这可能需要根据数据进行调整

激活函数

深度学习中的激活函数有:sigmoid,tanh,ReLUs,Softplus

目前最好的是 rectified linear units (ReLUs)修正线性单元

多层的神经网络如果用sigmoid或tanh激活函数也不做pre-training的话会因为 gradient vanishing problem 而会无法收敛。使用ReLU则这没有这个问题。

预训练的用处:规则化,防止过拟合;压缩数据,去除冗余;强化特征,减小误差;加快收敛速度。

标准的sigmoid输出不具备稀疏性,需要用一些惩罚因子来训练出一大堆接近0的冗余数据来,从而产生稀疏数据,例如L1、L1/L2或Student-t作惩罚因子。因此需要进行无监督的预训练。

而ReLU是线性修正,公式为:g(x) = max(0, x),函数图如下。它的作用是如果计算出的值小于0,就让它等于0,否则保持原来的值不变。这是一种简单粗暴地强制某些数据为0的方法,然而经实践证明,训练后的网络完全具备适度的稀疏性。而且训练后的可视化效果和传统方式预训练出的效果很相似,这也说明了ReLU具备引导适度稀疏的能力

Dropout 的作用

Dropout: 防止过拟合,做法:在训练时,FP中随机将Hidden layer 中的节点输出值按照比例随机设置为0,同时BP过程中相对应的被置为0的Hidden layer 节点的误差也为0,稀疏化。这样会使得神经元不得不去学习一些更加具备鲁棒性以及更加抽象的features.

训练代码

# -*- coding: utf-8 -*-
"""
Created on Thu Aug 27 11:27:34 2015

@author: lab-liu.longpo
"""

from __future__ import absolute_import
from __future__ import print_function
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils

import matplotlib.pyplot as plt
import numpy as np
import scipy.io as sio

d = sio.loadmat(‘data.mat‘)
data = d[‘d‘]
label = d[‘l‘]
data = np.reshape(data,(50000,3,32,32))
label = np_utils.to_categorical(label, 10)

print (‘finish loading data‘)

model = Sequential()

model.add(Convolution2D(32, 3, 5, 5, border_mode=‘valid‘))
model.add(Activation(‘relu‘))
#model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(32, 32, 5, 5, border_mode=‘valid‘))
model.add(Activation(‘relu‘))
model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 32, 3, 3, border_mode=‘valid‘))
model.add(Activation(‘relu‘))
model.add(MaxPooling2D(poolsize=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(64*5*5, 512, init=‘normal‘))
model.add(Activation(‘tanh‘))

model.add(Dense(512, 10, init=‘normal‘))
model.add(Activation(‘softmax‘))

sgd = SGD(l2=0.001,lr=0.0065, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss=‘categorical_crossentropy‘, optimizer=sgd,class_mode="categorical")

#checkpointer = ModelCheckpoint(filepath="weight.hdf5",verbose=1,save_best_only=True)
#model.fit(data, label, batch_size=100,nb_epoch=10,shuffle=True,verbose=1,show_accuracy=True,validation_split=0.2,callbacks=[checkpointer])
result = model.fit(data, label, batch_size=50,nb_epoch=35,shuffle=True,verbose=1,show_accuracy=True,validation_split=0.2)
#model.save_weights(weights,accuracy=False)

# plot the result

plt.figure
plt.plot(result.epoch,result.history[‘acc‘],label="acc")
plt.plot(result.epoch,result.history[‘val_acc‘],label="val_acc")
plt.scatter(result.epoch,result.history[‘acc‘],marker=‘*‘)
plt.scatter(result.epoch,result.history[‘val_acc‘])
plt.legend(loc=‘under right‘)
plt.show()

plt.figure
plt.plot(result.epoch,result.history[‘loss‘],label="loss")
plt.plot(result.epoch,result.history[‘val_loss‘],label="val_loss")
plt.scatter(result.epoch,result.history[‘loss‘],marker=‘*‘)
plt.scatter(result.epoch,result.history[‘val_loss‘],marker=‘*‘)
plt.legend(loc=‘upper right‘)
plt.show()

今天将自己以前实现的机器学习以及深度学习算法放到 GitHub 上,本文的数据集以及数据预处理,训练代码等也将会放到GitHub上,如果觉得有用就请给个star。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 15:58:22

DeepLearning (五) 基于Keras的CNN 训练cifar-10 数据库的相关文章

DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)

DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现) @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43277187 本文代码下载地址:我的github 本文主要讲解将CNN应用于人脸识别的流程,程序基于python+numpy+theano+PIL开发,采用类似LeNet5的CNN模型,应用于olivettifaces人脸数据库,实现人脸识别的功能,模型的

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43225445 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Convolutional Neural Networks (LeNet).经详细注释的代码和原始代码:放在我的github地址上,可下载. 一.CNN卷积神经网络原理

基于Pre-Train的CNN模型的图像分类实验

基于Pre-Train的CNN模型的图像分类实验 MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “imagenet-caffe-ref”的模型,提取图像特征(softmax前一层的输出,4096维),在几个常用的图像分类的数据库中进行了相应的分类实验.这实验的过程中,有对图片进行左右翻转用于增加训练数据.下面结果的表格中:Original原始结果,Flip增加翻转后的结果. 需要用到的toolbox及

利用keras搭建CNN进行mnist数据集分类

当接触深度学习算法的时候,大家都很想自己亲自实践一下这个算法,但是一想到那些复杂的程序,又感觉心里面很累啊,又要学诸如tensorflow.theano这些框架.那么,有没有什么好东西能够帮助我们快速搭建这个算法呢?当然是有咯!,现如今真不缺少造轮子的大神,so,我强烈向大家推荐keras,Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow或Theano.Keras为支持快速实验而生,能够把你的idea迅速转换为结果. 具体keras的安装与使用,请参

CNN眼中的世界:利用Keras解释CNN的滤波器

目录 原文信息 使用Keras探索卷积网络的滤波器 可视化所有的滤波器 Deep Dream(nightmare) 愚弄神经网络 革命尚未成功,同志仍需努力 原文信息 本文地址:http://blog.keras.io/how-convolutional-neural-networks-see-the-world.html 本文作者:Francois Chollet 本文的翻译版最先由我发布在Keras中文文档,为了方便各位网友,特将此文搬移到CSDN. 使用Keras探索卷积网络的滤波器 本文

基于 Keras 用 LSTM 网络做时间序列预测

基于 Keras 用 LSTM 网络做时间序列预测 本文主要参考了 Jason Brownlee 的博文 Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras 原文使用 python 实现模型,这里是用 R 时间序列预测是一类比较困难的预测问题. 与常见的回归预测模型不同,输入变量之间的"序列依赖性"为时间序列问题增加了复杂度. 一种能够专门用来处理序列依赖性的神经网络被称为 递归

[AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).windows上该环境的搭建 :) 前面三篇博客代码实现均基于该环境(开发或者测试过): [AI开发]Python+Tensorflow打造自己的计算机视觉API服务 [AI开发]基于深度学习的视频多目标跟踪实现 [AI开发]视频多目标跟踪高级版 运行环境 1) centOS 7.5 ,不要安装GUI桌面:

对比学习用 Keras 搭建 CNN RNN 等常用神经网络

Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上运行无阻碍. 今天来对比学习一下用 Keras 搭建下面几个常用神经网络: 回归 RNN回归 分类 CNN分类 RNN分类 自编码分类 它们的步骤差不多是一样的: [导入模块并创建数据] [建立模型] [定义优化器] [激活模型] [训练模型] [检验模型] [可视化结果

玩转Android Camera开发(五):基于Google自带算法实时检测人脸并绘制人脸框(网络首发,附完整demo)

本文主要介绍使用Google自带的FaceDetectionListener进行人脸检测,并将检测到的人脸用矩形框绘制出来.本文代码基于PlayCameraV1.0.0,在Camera的open和preview流程上进行了改动.原先是放在单独线程里,这次我又把它放到Surfaceview的生命周期里进行打开和开预览. 首先要反省下,去年就推出了静态图片的人脸检测demo,当时许诺一周内推出Camera预览实时检测并绘制的demo,结果拖到现在才整.哎,屌丝一天又一天,蹉跎啊.在demo制作过程中