前言
卷积神经网络是近年发展起来,并引起广泛重视的一种高效识别方法。20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN)。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用.
深层数学内涵先不考究,与之前的多层感知器比较一下代码模型上的区别在于特征值的提取:
多层感知器对于特征值的提取仅仅是将图片的3维矩阵转化为了一维矩阵,然后作为输入层输入;在卷积神经网络里,将数据使用不同滤镜产生多种特征图层,再使用池化层缩减采样,最后使用平坦层达到和多层感知器预处理步骤的功能,将多维矩阵转换为一维作为输入层输入.
关于池化层
- 可以减少需处理的数据点,减少运算量
- 让图像位置差异变小,例如图像的位置可能在背景的左上或右下=方造成干扰
- 参数的数量和计算量下降,在一定程度上控制了过度拟合
源码
#数据预处理
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPooling2D
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.random.seed()
Using TensorFlow backend.
def images_labels_prediction(images, labels, prediction, index, num=10):
"""
:param images: 点阵像素点图像列表
:param labels: 图像对应真实值
:param prediction: 预测结果
:param index: 数据开始索引
:param num: 显示数据项数
:return:
"""
if num > 25:
num = 25
fig = plt.gcf() # 实例化图形
fig.set_size_inches(15, 15) # 设定图形大小
for i in range(0, num):
ax = plt.subplot(5, 5, 1 + i) # 建立sub_graph子图,为5行5列
ax.imshow(images[index], cmap="binary") # 画出子图
title = "label=" + str(labels[index])