卷积
卷积(Convolution),也叫摺积,是分析数学中一种重要的运算。在信号处理或图像处理中,经常使用一维或二维卷积。
卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络由卷积层、汇聚层和全连接层交叉堆叠而成,利用反向传播算法进行训练。卷积神经网络有三个特性:局部连接、权重共享以及子采样,这些特性使得卷积神经网络具有一定程度上的平移、缩放和旋转不变性,和前馈神经网络相比,其参数较少。
卷积层
卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。由于卷积网络主要应用在图像处理上,而图像为两维结构,因此为了更充分地利用图像的局部信息,通常将神经元组织为三维结构的神经层,其大小为高度 M × 宽度N×深度D,由D个M ×N大小的特征映射构成。
汇聚层(池化层)
汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量。池化也称为下采样,主要用于特征降维,压缩数据和参数数量,减小过拟合,提高模型的容错性,常用的有最大池化和平均池化。
全连接层
在卷积神经网络最后会加一个flatten层,将之前所得到的feature map“压平”,然后用一个全连接层输出最后的结果,如果是分类的话,一般会利用softmax激活函数,最后就可以输出相应的分类结果了。
书写数字识别model训练过程
此次卷积神经网络训练mnist,使用了3层卷积,1层全连接,激活函数为 softmax
下载mnist数据集,代码如下
mnist = keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
第一层卷积
# 一层卷积
model.add(
Conv2D(
filters=16,
kernel_size=(5, 5),
padding='same', # 保证卷积核大小,不够补零
input_shape=(28, 28, 1),
activation='relu'))
第一层 池化
# 池化层1
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第二层卷积和池化
# 二层卷积
model.add(
Conv2D(filters=32, kernel_size=(5, 5), padding='same', activation='relu'))
# 池化层2
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第三层卷积和池化层
model.add(
Conv2D(filters=64, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(
Conv2D(filters=128, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
全连接层
model.add(Flatten()) # 平坦层
model.add(Dense(128, activation='relu')) # 全连接层
model.add(Dropout(0.25))
model.add(Dense(10, activation='softmax')) # 激活函数
训练模型
# 训练模型
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
train_history = model.fit(x=X_train4D_Normalize,
y=y_trainOnehot,
validation_split=0.2,
batch_size=300,
epochs=10,
verbose=2)
最后的效果还可以,训练准确率可以达到99%,测试准确率可以达到97%
此程序配合之前的手写板程序即可实现手写数字识别任务。
大家对程序有任何疑问或建议均可留言,感谢大家支持!!!