Keras上实现卷积神经网络CNN

一、概述及完整代码

本例的代码主要来自Keras自带的example里的mnist_cnn模块,主要用到keras.layers中的Dense, Dropout, Activation, Flatten模块和keras.layers中的Convolution2D,MaxPooling2D。构建一个两层卷积层两层全连接层的简单卷积神经网络,12次循环后可以达到99.25%的准确率,可见CNN的预测准确率已经相当高了。

完整代码:

[python]  view plain  copy
  1. import numpy as np  
  2. np.random.seed(1337)  # for reproducibility  
  3. from keras.datasets import mnist  
  4. from keras.models import Sequential  
  5. from keras.layers import Dense, Dropout, Activation, Flatten  
  6. from keras.layers import Convolution2D, MaxPooling2D  
  7. from keras.utils import np_utils  
  8. from keras import backend as K  
  9.   
  10. # 全局变量  
  11. batch_size = 128  
  12. nb_classes = 10  
  13. epochs = 12  
  14. # input image dimensions  
  15. img_rows, img_cols = 2828  
  16. # number of convolutional filters to use  
  17. nb_filters = 32  
  18. # size of pooling area for max pooling  
  19. pool_size = (22)  
  20. # convolution kernel size  
  21. kernel_size = (33)  
  22.   
  23. # the data, shuffled and split between train and test sets  
  24. (X_train, y_train), (X_test, y_test) = mnist.load_data()  
  25.   
  26. # 根据不同的backend定下不同的格式  
  27. if K.image_dim_ordering() == 'th':  
  28.     X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)  
  29.     X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)  
  30.     input_shape = (1, img_rows, img_cols)  
  31. else:  
  32.     X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)  
  33.     X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)  
  34.     input_shape = (img_rows, img_cols, 1)  
  35.   
  36. X_train = X_train.astype('float32')  
  37. X_test = X_test.astype('float32')  
  38. X_train /= 255  
  39. X_test /= 255  
  40. print('X_train shape:', X_train.shape)  
  41. print(X_train.shape[0], 'train samples')  
  42. print(X_test.shape[0], 'test samples')  
  43.   
  44. # 转换为one_hot类型  
  45. Y_train = np_utils.to_categorical(y_train, nb_classes)  
  46. Y_test = np_utils.to_categorical(y_test, nb_classes)  
  47.   
  48. #构建模型  
  49. model = Sequential()  
  50. """ 
  51. model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], 
  52.                         border_mode='same', 
  53.                         input_shape=input_shape)) 
  54. """  
  55. model.add(Convolution2D(nb_filters, (kernel_size[0], kernel_size[1]),  
  56.                         padding='same',  
  57.                         input_shape=input_shape)) # 卷积层1  
  58. model.add(Activation('relu')) #激活层  
  59. model.add(Convolution2D(nb_filters, (kernel_size[0], kernel_size[1]))) #卷积层2  
  60. model.add(Activation('relu')) #激活层  
  61. model.add(MaxPooling2D(pool_size=pool_size)) #池化层  
  62. model.add(Dropout(0.25)) #神经元随机失活  
  63. model.add(Flatten()) #拉成一维数据  
  64. model.add(Dense(128)) #全连接层1  
  65. model.add(Activation('relu')) #激活层  
  66. model.add(Dropout(0.5)) #随机失活  
  67. model.add(Dense(nb_classes)) #全连接层2  
  68. model.add(Activation('softmax')) #Softmax评分  
  69.   
  70. #编译模型  
  71. model.compile(loss='categorical_crossentropy',  
  72.               optimizer='adadelta',  
  73.               metrics=['accuracy'])  
  74. #训练模型  
  75. model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs,  
  76.           verbose=1, validation_data=(X_test, Y_test))  
  77. #评估模型  
  78. score = model.evaluate(X_test, Y_test, verbose=0)  
  79. print('Test score:', score[0])  
  80. print('Test accuracy:', score[1])  

二、知识点详解

1. 关于Keras可能会使用不同的backend

该选择结构可以灵活对theano和tensorflow两种backend生成对应格式的训练数据格式。举例说明:'th'模式,即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。而TensorFlow,即'tf'模式的表达形式是(100,16,32,3),即把通道维放在了最后。这两个表达方法本质上没有什么区别。

[python]  view plain  copy
  1. # 根据不同的backend定下不同的格式  
  2. if K.image_dim_ordering() == 'th':  
  3.     X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)  
  4.     X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)  
  5.     input_shape = (1, img_rows, img_cols)  
  6. else:  
  7.     X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)  
  8.     X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)  
  9.     input_shape = (img_rows, img_cols, 1)  

2. 二维卷积层Conv2D

keras.layers.convolutional.Conv2D(filters, kernel_size,strides=(1,1), padding='valid', data_format=None, dilation_rate=(1,1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

二维卷积层对二维输入进行滑动窗卷积,当使用该层作为第一层时,应提供input_shape参数。

filters:卷积核的数目;

kernel_size:卷积核的尺寸;

strides:卷积核移动的步长,分为行方向和列方向;

padding:边界模式,有“valid”,“same”或“full”,full需要以theano为后端;

其他参数请参看Keras官方文档。

3. 二维池化层MaxPooling2D

keras.layers.pooling.MaxPooling2D(pool_size=(2,2), strides=None, padding='valid', data_format=None)

对空域信号进行最大值池化。

pool_size:池化核尺寸;

strides:池化核移动步长;

padding:边界模式,有“valid”,“same”或“full”,full需要以theano为后端;

其他参数请参看Keras官方文档。

4. Activation层

keras.layers.core.Activation(activation)

激活层对一个层的输出施加激活函数。

预定义激活函数:

softmax,softplus,softsign,relu,tanh,sigmoid,hard_sigmoid,linear等。

5. Dropout层

keras.layers.core.Dropout(p)

为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(p的输入神经元连接,Dropout层用于防止过拟合。

6. Flatten层

keras.layers.core.Flatten()

Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。Flatten不影响batch的大小。

例子:

model =Sequential()

model.add(Convolution2D(64,3, 3, border_mode='same', input_shape=(3, 32, 32)))

# now:model.output_shape == (None, 64, 32, 32)

model.add(Flatten())

# now:model.output_shape == (None, 65536)

7.Dense层全连接层

keras.layers.core.Dense(units,activation=None, use_bias=True, kernel_initializer='glorot_uniform',bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

units:输出单元的数量,即全连接层神经元的数量,作为第一层的Dense层必须指定input_shape。

8. Sequential模型compile方法

compile(self,optimizer, loss, metrics=[], sample_weight_mode=None)

编译用来配置模型的学习过程,其参数有:

optimizer:字符串(预定义优化器名)或优化器对象;

loss:字符串(预定义损失函数名)或目标函数;

metrics:列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是metrics=['accuracy'];

9. Sequential模型fit方法

fit(self,x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,sample_weight=None, initial_epoch=0)

verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录;

validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等;

validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。

10. Sequential模型evaluate方法

evaluate(self,x, y, batch_size=32, verbose=1, sample_weight=None)

相关参数可参考其他方法的同名参数说明。



from:  http://blog.csdn.net/marsjhao/article/details/68490105

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值