CNN-建立模型

1.导入所需模块

from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D
2.建立Keras的sequential模型
建立一个Sequential线性堆叠模型,后续只需要使用model.add方法将各个神经网络层加入模型即可

model = Sequential()
3.建立卷积层1和池化层1
建立卷积层1
使用下列代码建立卷积层1,输入的数字图像大小为28×28,进行第一次卷积运算产生16个图像,卷积运算并不会改变图像大小,所以图像大小仍然是28×28

model.add(Conv2D(filters=16,kernel_size=(5,5),padding='same',input_shape=(28,28,1), activation='relu'))
filters滤镜数
kernel_size每一个滤镜大小
padding让卷积运算产生的图像大小不变
input_shape第一二维:代表输入的图像形状为28×28,第三维:因为单色灰度图像,所以最后的维数值是1
activation设置relu激活函数
建立池化层1
下面的程序代码建立池化层1,输入参数pool_size=(2,2),执行第一次缩减采样,将16个28×28的图像缩小为16个14×14的图像

model.add(MaxPool2D(pool_size=(2,2)))
4.建立卷积层2和池化层2
使用下面的程序建立卷积层2,执行第二次卷积运算:将原本的16个图像转换为36个图像,卷积运算不会改变图像大小
model.add(Conv2D(filters=36,kernel_size=(5,5),padding=’same’, activation=’relu’))
建立池化层2,并且加入Dropout避免过度拟合

model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
5.建立神经网络(平坦层,隐藏层,输出层)
(1)建立平坦层
以下程序代码建立平坦层,将之前的步骤已经建立的池化层2,共36个7×7图像转换为一维向量36x7x7=1764个float数,正好对应1764个神经元.

model.add(Flatten())
(2)建立隐藏层
并且把Dropout层加入模型中,Dropout(0.5)的功能是,每次训练迭代时,会随机的神经网络中放弃50%的神经元,以避免过度拟合

model.add(Dense(128,activation='relu'))
model.add(Dropout(0.5))
建立输出层
最后输出层,共有10个神经元,对应0-9共10个数字,并且使用softmax激活函数进行转换,softmax可以将神经元转换为每一个数字的概率
6.显示模型的摘要
我们可以使用下列指令查看模型的摘要
print(model.summary())
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 16)        416
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16)        0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 14, 14, 36)        14436
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 36)          0
_________________________________________________________________
dropout_1 (Dropout)          (None, 7, 7, 36)          0
_________________________________________________________________
flatten_1 (Flatten)          (None, 1764)              0
_________________________________________________________________
dense_1 (Dense)              (None, 128)               225920
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290
=================================================================
Total params: 242,062
Trainable params: 242,062
Non-trainable params: 0
_________________________________________________________________
None