卷积神经网络-深度学习
卷积神经网络(CNN)是一类深度神经网络。这是受人类大脑视觉皮层的启发。每当我们看到某些东西时,一系列的神经元皮层就会被激活,每层都会检测到一些特征,如线条,边缘(如垂直边缘,水平边缘)。
CNN广泛用于 图像识别 , 图像分类,对象检测,人脸识别等。
过度简化图:
CNN的基本层: - C onvolution - Pooling - Flattening - Fully Connected Layer(Neural network)
卷积神经网络
示例
了解这一点的一些先决条件:
计算机将输入图像视为像素数组,这取决于图像的分辨率。根据图像分辨率,可以看到 h * w * d(h =高度,w =宽度,d =维度)。
彩色图像有 3个通道即 RGB,而黑/白图像只有 一个通道。例如,24*24* 3阵列的 RGB矩阵图像(3指RGB值)和一幅图像为4 * 4 * 1阵列的灰度矩阵(b / w)图像。
现在让我们了解过滤器(卷积/特征图):
要应用某些过滤器,我们需要将图像与过滤器矩阵相乘。以下是标准过滤器及其矩阵表示的一些示例。
过滤器的重要性:
在自动驾驶汽车的情况下,边缘检测过滤器非常重要。
现在我们已经准备好了解CNN层及其工作原理。
卷积层(Convolution Layer)
卷积是从输入图像中提取特征的第一层。这里我们将输入图像与不同的卷积(过滤器)相乘以获得具有提取特征的新图像。
例如:考虑一个6 * 6 * 3的图像,这里我们应用两个尺寸为3 * 3 * 3的不同过滤器,输出为4 * 4
输出的公式:
- 输入(Input): n * n * nc
- 过滤器(Filter): f * f * nc
- 填充(Padding): p (本文后面部分介绍)
- 步幅(Stride): s
Stride是输入矩阵上的像素移位数。当步幅为1时,我们一次将过滤器移动到1个像素。当步幅为2时,我们一次将过滤器移动到2个像素,依此类推
- 输出: [(n+2p-f)/s+1] *[(n+2p-f)/s+1] *nc'
例如:n = 6,p = 0,f = 3,s = 1,
[(6+(0*2)–3)/1+1]*[(6+(0*2)–3)/1+1]*3 = 4*4*3
nc是输入和过滤器中的通道数,而nc'是过滤器的数量。
工作说明:
池化层(Pooling Layer)
当图像太大时,池化层会减少参数的数量。它减少了每个映射的维度,但保留了重要信息。空间池化(Spatial pooling )可以是不同类型的:
- 最大池化
- 均支池化
- 求和池化
最大池化从调整过的特征映射中获取最大元素。采用最大元素也可以采用均值池化。将特征映射调用中的所有元素的和称为求和池化。
最大池化
填充(padding):
填充在输入卷积的外部添加额外的0,以便卷积最终具有与输入相同数量的输出。如果我们不使用填充,则在每个卷积层之后,边界处的信息将丢失,这将减小卷积的大小以及性能。
类型:有效填充,相同填充。
在有效填充中,与输入相比,该特征的维度降低,而在相同填充中,维度增加或保持相同。
零填充
展平(Flattening ):
在应用了所有上述层后,我们得到矩阵形式的最终输出,但神经网络需要向量形式(1D)的输入数据,因此我们需要将我们的池化的特征映射展平成如下图所示的列。
完全连接层(Fully connected Layer)(FC):
在这里,我们将展平数据提供给FC的输入层(例如 x1,x2 ...)。我们在中间层应用ReLU等激活函数。
这里基本的神经网络工作发生像反向传播,优化。
激活函数:
在中间层中,优选ReLu,而对于输出层,则使用Softmax或sigmoid。
以下是部分代码展示:
Importing the Libraries and Packages from keras.models import Sequential from keras.layers import Convolution2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense
创建神经网络的第一步是使用keras中的顺序类初始化网络。
Initialising the CNN model = Sequential() Convolutional Layer model.add(Convolution2D(filters = 32, kernel_size = (3, 3), input_shape = (64, 64, 3), activation = ‘relu’))
池化层
model.add(MaxPooling2D(pool_size = (2, 2)))
pool_size:池化窗口的形状。
展平层
model.add(Flatten())
完全连接的层
Adding the Hidden layer model.add(Dense(units = 128, activation = ‘relu’)) Adding the Output Layer model.add(Dense(units = 1, activation = ‘sigmoid’))
编译CNN
model.compile(optimiser = ‘adam’,loss = ‘binary_crossentropy’,metrics = [‘accuracy’])
重要提示:
如果训练的数据非常少,那么我们可以通过应用缩放,翻转原始图像和创建新图像等操作从现有数据创建新数据。
Generating Image Data from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.1, zoom_range = 0.2, horizontal_flip = True) test_datagen = ImageDataGenerator(rescale = 1./255)