一:概念

卷积神经⽹络,简称为卷积⽹络,与普通神经⽹络的区别是它的卷积层内的神经元只覆盖输⼊特征局部范围的单元,具有稀疏连接(sparse connectivity)和权重共享(weight shared)的特点,⽽且其中的过滤器可以做到对图像关键特征的抽取。因为这⼀特点,卷积神经⽹络在图像识别⽅⾯能够给出更好的结果。
在这里插入图片描述

二:卷积层原理

卷积⽹络是通过卷积层(Conv2D层)中的过滤器(filter)⽤卷积计算对图像核⼼特征进⾏抽取,从⽽提⾼图像处理的效率和准确率。


机器是通过模式(pattern)进⾏图像的识别。优越性是平移不变性,在图像中学习到某个模式,它就可以在任何地⽅识别这个模式。图像对于计算机来说就是一个矩阵。

  1. ⽤滑动窗⼝抽取局部特征
  2. 过滤器进⾏卷积计算(卷积核),进⾏图像特征的提取。不同过滤器(卷积核)抽取不同的特征
    在这里插入图片描述

卷积的原理:抠图,卷积核对抠下来的图进⾏运算,形成响应通道。填充和步幅。

model.add(Conv2D(filters=32,	#	添加Conv2D层,	指定过滤器的个数,	即通道数			
				kernel_size=(3,	3),	#	指定卷积核的⼤⼩
				activation='relu',	#	指定激活函数
				input_shape=(28,	28,	1)))	#	指定输⼊数据样本张量的类型

卷积和池化计算原理请看b站。懒得写了。
卷积计算:直接相乘加一起。(普通乘法不是矩阵乘法)
在这里插入图片描述

填充(padding)操作。填充就是在输⼊特征图的边缘添加适当数⽬的空⽩⾏和空⽩列,使得每个输⼊块都能作为卷积窗⼝的中⼼,然后卷积运算之后,输出特征图的维度将会与输⼊维度保持⼀致。

在这里插入图片描述

填充操作并不是⼀个必需选项。如果需要,可以通过Conv2D层的padding参数设置:model.add(Conv2D(filters=32,	#过滤器
					kernel_size=(3,	3),	#	卷积核⼤⼩
					strides=(1,	1),	#	步幅
					padding='valid'))	#	填充

步幅(stride)
影响输出尺⼨的另⼀个因素是卷积操作过程中,窗⼝滑动抽取特征时候的步幅(stride)
在这里插入图片描述

三,池化层

池化层的功能是对特征图进⾏下采样。在最⼤池化之后,特征维度的尺⼨基本上都会减半。
最⼤池化的原理和卷积有些类似,也是从输⼊特征图中提取窗⼝。但是最⼤池化使⽤固定的张量运算对局部图块进⾏变换,输出每个通道的最⼤值,⽽不是像卷积核那样,权重是通过学习⽽得到的。
池化也有填充和步幅,只不过最大池化是取区域内最大值而不是像卷积相乘。

四,性能优化

  1. 第⼀招:更新优化器并设置学习速率
cnn.compile(loss='categorical_crossentropy',	#	损失函数
			optimizer=optimizers.Adam(lr=1e-4),	#	更新优化器并设定学习速率
			metrics=['acc'])	#	评估指标
  1. 第⼆招:添加Dropout层,降低过拟合⻛险。
  2. 进⾏数据增强

数据增强:

把⼀张图像当成7张、8张甚⾄10张、100张来⽤。
是通过对图像的平移、颠倒、倾斜、虚化、增加噪声等多种⼿段。这是利⽤能够⽣成可信图像的随机变换来增加样本数,如下图所示。这样,训练集就被⼤幅地增强了,⽆论是图像的数⽬,还是多样性。因此,模型在训练后能够观察到数据的更多内容,从⽽具有更好
的准确率和泛化能⼒。

在Keras中,可以⽤ImageData- Generator⼯具来定义⼀个数据增强器:#	定义⼀个数据增强器,	并设定各种增强选项
from	keras.preprocessing.image	
import	ImageDataGenerator
augsgen	=	ImageDataGenerator(
									featurewise_center=False,	
									samplewise_center=False,									
									featurewise_std_normalization=False,										
									samplewise_std_normalization=False,		
									zca_whitening=False,	
									rotation_range=10,		
									zoom_range	=	0.1,	
									width_shift_range=0.2,		
									height_shift_range=0.2,	
									horizontal_flip=True,		
									vertical_flip=False)	
augs_gen.fit(X_train)	#	针对训练集拟合数据增强器

⽹络还是⽤回相同的⽹络,唯⼀的区别是在训练时,需要通过fit_generator⽅法动态⽣成被增强后的训练集:

history	=	cnn.fit_generator(	#	使⽤fit_generator
			augs_gen.flow(X_train,	y_train,	batch_size=16),	#	增强后的训练集
			validation_data		=	(X_test,	y_test),	#	指定验证集
			validation_steps	=	100,	#	指定验证步⻓
			steps_per_epoch		=	100,	#	指定每轮步⻓
			epochs	=	50,		#	指定轮次
			verbose	=	1)	#	指定是否显示训练过程中的信息

更多推荐