CV

卷积神经网络(CNN)

卷积、池化、全链接

Posted by 新宇 on July 21, 2020

一、CNN简介

  • 利用全连接神经网络对图像进行处理存在以下两个问题:
    • 需要处理的数据量大,效率低,并且非常消耗资源
    • 图像在维度调整的过程中很难保留原有的特征,导致图像处理的准确率不高
  • CNN网络受人类视觉神经系统的启发,
  • 人类的视觉原理:
    • 从原始信号摄入开始(瞳孔摄入像素 Pixels),
    • 接着做初步处理(大脑皮层某些细胞发现边缘和方向),
    • 然后抽象(大脑判定,眼前的物体的形状,是圆形的),
    • 然后进一步抽象(大脑进一步判定该物体是只人脸)

1. CNN网络构成

  • CNN网络主要有三部分构成:
    • 卷积层:负责提取图像中的局部特征
    • 池化层:用来大幅降低参数量级(降维)
    • 全连接层:类似人工神经网络的部分,用来输出想要的结果。

二、卷积层

卷积层是卷积神经网络中的核心模块,卷积层的目的是提取输入特征图的特征,如下图所示,卷积核可以提取图像中的边缘信息。

1. 卷积的计算方法

2. padding

3. stride

4. 多通道卷积

5. 多卷积核卷积

有多少卷积核,feature map就有多少维度

6. 特征图大小

7. API

三、池化层

  • 池化层迎来降低了后续网络层的输入维度,缩减模型大小,提高计算速度,并提高了Feature Map的鲁棒性,防止过拟合;
  • 它主要对卷积层学习到的特征图进行下采样(subsampling)处理,主要由两种:
    • 最大池化
    • 平均池化

1. 最大池化

2. 平均池化

四、全链接层

  • 全连接层位于CNN网络的末端,经过卷积层的特征提取与池化层的降维后,将特征图转换成一维向量送入到全连接层中进行分类或回归的操作;
  • 在tf.keras中全连接层使用tf.keras.dense实现。

五、卷积神经网络的构建案例

import tensorflow as tf
# 数据集

from tensorflow.keras.datasets import mnist

# 数据加载

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据处理:num,h,w,c

# 训练集数据

train_images = tf.reshape(train_images, (train_images.shape[0],train_images.shape[1],train_images.shape[2], 1))
print(train_images.shape)
# 测试集数据

test_images = tf.reshape(test_images, (test_images.shape[0],test_images.shape[1],test_images.shape[2], 1))


# 模型构建

net = tf.keras.models.Sequential([
    # 卷积层:6个5*5的卷积核,激活是sigmoid

      tf.keras.layers.Conv2D(filters=6,kernel_size=5,activation='sigmoid',input_shape=  (28,28,1)),
    # 最大池化

    tf.keras.layers.MaxPool2D(pool_size=2, strides=2),
    # 卷积层:16个5*5的卷积核,激活是sigmoid

    tf.keras.layers.Conv2D(filters=16,kernel_size=5,activation='sigmoid'),
    # 最大池化

    tf.keras.layers.MaxPool2D(pool_size=2, strides=2),
    # 维度调整为1维数据

    tf.keras.layers.Flatten(),
    # 全卷积层,激活sigmoid

    tf.keras.layers.Dense(120,activation='sigmoid'),
    # 全卷积层,激活sigmoid

    tf.keras.layers.Dense(84,activation='sigmoid'),
    # 全卷积层,激活softmax

    tf.keras.layers.Dense(10,activation='softmax')

])

# 优化器

optimizer = tf.keras.optimizers.SGD(learning_rate=0.9)

# 模型编译:损失函数,优化器和评价指标

net.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 模型训练

net.fit(train_images, train_labels, epochs=5, validation_split=0.1)

# 模型评估

score = net.evaluate(test_images, test_labels, verbose=1)
print('Test accuracy:', score[1])