当接触深度学习算法的时候,大家都很想自己亲自实践一下这个算法,但是一想到那些复杂的程序,又感觉心里面很累啊,又要学诸如tensorflow、theano这些框架。那么,有没有什么好东西能够帮助我们快速搭建这个算法呢?当然是有咯!,现如今真不缺少造轮子的大神,so,我强烈向大家推荐keras,Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow或Theano。Keras为支持快速实验而生,能够把你的idea迅速转换为结果。 具体keras的安装与使用,请参看keras-cn.readthedocs.io/en/latest/ (中文版的哦)。
anyway ,你经过一丢丢时间了解keras,是不是手有点痒想实践一下呢?好,现在进入主题利用keras搭建cnn进行mnist数据集的分类。
![](http://upload-images.jianshu.io/upload_images/4182914-adf33b620d00a961.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上面这个是CNN比较简单的形式,具体你想搞懂CNN,请参看www.jeyzhang.com/cnn-learning-notes-1.html 。我把文章重点放在程序的讲解上面,好,开始吧!
"keras后端我使用的是tensorflow,该程序运行在64位linux系统“
import numpy as np
from matplotlib import pyplot as plt
np.random.seed(6) #随机数,这样做的目的是在每次运行程序时,初始值保持一致。seed的值可以随便设置。
import keras
from keras.models import Sequential
from keras.layers import Dense , Dropout ,Activation, Flatten
from keras.layers import Conv2D ,MaxPooling2D #卷积层,池化层
from keras.utils import np_utils
from keras.datasets import mnist
(X_train,y_train),(X_test,y_test)=mnist.load_data() #导入mnist数据
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
#这里大家可能不是很了解,主要是为了把mnist数据变成二维图片形式
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255 #做标准化(0,1)之间 ,深度学习对样本值敏感需要做标准化处理
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)
#把标签值变成一维数组显示,例如 标签1 ——0100000000
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=(28,28,1)))
#第一层卷积层,32个特征图,每个特征图中的神经元与输入中的3×3的领域相连。参数可调
model.add(Conv2D(64, (3, 3), activation='relu')) #第二层卷积层,64个特征图。参数可调
model.add(MaxPooling2D(pool_size=(2, 2))) #池化层 2×2做映射,参数可调
model.add(Dropout(0.25)) #Dropou算法用于测试集的精确度的优化,这个也可以换。
model.add(Flatten()) #把二维数组拉成一维
model.add(Dense(128, activation='relu')) #正常的神经网络层
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax')) #输出层
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']) #交叉熵,训练优化算法adam
model.fit(X_train, Y_train, batch_size=32, nb_epoch=10, verbose=1) # batch=32,epoch=10,参数可调,总迭代次数大家会算吗?
score = model.evaluate(X_test, Y_test, verbose=0)
CNN其实说白了,就是前期的卷积池化处理加后期全连接神经网络,卷积池化就是特征提取过程呗!
程序运行结果 准确率99.2%,当然你们也看到了,有许多参数是可以调整的,so 大家动起来吧。有什么问题可以在@我。