卷积神经网络

目录

为什么用到卷积神经网络?

一.什么是卷积?

二、卷积的简单介绍

三、卷积过程设计到的知识点

1.感受野

 2.全零填充

 四、Tensorflow2.0中卷积神经网络主要模块

1.C:卷积 Convolutional

 2.B:批标准化 BN

3.A:激活 Activation

4.P:池化 Pooling

5.D:舍弃 Dropout

五、代码

总结:


为什么用到卷积神经网络?

全连接NN:每个神经元与前后相邻层的每一个神经元都 有连接关系,输入是特征,输出为预测的结果。

实际项目中:原始图片或者其他素材,都不是单一的

实际应用时会先对原始图像进行特征提 再把提取到的特征送给全连接网络

引入:卷积计算可认为是一种有效提取图像特征的方法

一.什么是卷积?

卷积就是特征提取器,就是CBAPD

认识:卷积就是Sequential内部的操作,对特征进行提取,提醒:CBAPD不一定要求全部都有。

model = tf.keras.models.Sequential([
C    Conv2D(filters=6, kernel_size=(5, 5), padding='same'), # 卷积层
B    BatchNormalization(), # BN层
A    Activation('relu'), # 激活层
P    MaxPool2D(pool_size=(2, 2), strides=2, padding='same'), # 池化层
D   Dropout(0.2), # dropout层
])

前向传播:特征提取+处理

卷积神经网络_第1张图片

二、卷积的简单介绍

解释:一般会用一个正方形的卷积核,按指定步长,在输入特征图上滑动 ,遍历输入特征图中的每个像素点。将其特征提取出来

 过程图

卷积神经网络_第2张图片

三、卷积过程设计到的知识点

1.感受野

概念:卷积神经网络各输出特征图中的每个 像素点,在原始输入图片上映射区域的大小。

2个3*3的比1个5*5的好

卷积神经网络_第3张图片卷积神经网络_第4张图片

 2.全零填充

概念:为了放置数据的丢失,给将要进行卷积的对象外边添加步长的数,以0作为填充

 

卷积神经网络_第5张图片

 四、Tensorflow2.0中卷积神经网络主要模块

1.C:卷积 Convolutional

tf.keras.layers.Conv2D (

filters = 卷积核个数,

kernel_size = 卷积核尺寸, #正方形写核长整数,或(核高h,核宽w)

strides = 滑动步长, #横纵向相同写步长整数,或(纵向步长h,横向步长w),默认1

padding = “same” or “valid”, #使用全零填充是“same”,不使用是“valid”(默认)

activation = “ relu ” or “ sigmoid ” or “ tanh ” or “ softmax”等 , #如有BN此处不写

input_shape = (高, 宽 , 通道数) #输入特征图维度,可省略 )

 2.B:批标准化 BN

概念:

标准化:使数据符合0均值,1为标准差的分布。

批标准化:对一小批数据(batch),做标准化处理 。

卷积神经网络_第6张图片卷积神经网络_第7张图片

代码:

BatchNormalization(), # BN层

3.A:激活 Activation

选择激活函数

Activation('relu'), # 激活层

4.P:池化 Pooling

目的:池化用于减少特征数据量。

最大值池化可提取图片纹理,均值池化可保留背景特征。

最大池化:

tf.keras.layers.MaxPool2D(

pool_size=池化核尺寸,#正方形写核长整数,或(核高h,核宽w)

strides=池化步长,#步长整数, 或(纵向步长h,横向步长w),默认为pool_size padding=‘valid’or‘same’ #使用全零填充是“same”,不使用是“valid”(默认) )

均值池化:

tf.keras.layers.AveragePooling2D(

pool_size=池化核尺寸,#正方形写核长整数,或(核高h,核宽w)

strides=池化步长,#步长整数, 或(纵向步长h,横向步长w),默认为pool_size padding=‘valid’or‘same’ #使用全零填充是“same”,不使用是“valid”(默认)

举例

MaxPool2D(pool_size=(2, 2), strides=2, padding='same'), # 池化

5.D:舍弃 Dropout

概念:在神经网络训练时,将一部分神经元按照一定概率从神经网络 中暂时舍弃。神经网络使用时,被舍弃的神经元恢复链接

代码

Dropout(0.2), # dropout层

五、代码

CBAPD引用

class Baseline(Model):
    def __init__(self):
        super(Baseline, self).__init__()
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')  # 卷积层
        self.b1 = BatchNormalization()  # BN层
        self.a1 = Activation('relu')  # 激活层
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层
        self.d1 = Dropout(0.2)  # dropout层
        self.flatten = Flatten()
        self.f1 = Dense(128, activation='relu')
        self.d2 = Dropout(0.2)
        self.f2 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)
        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y
model = Baseline()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

checkpoint_save_path = "./checkpoint/Baseline.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
    print('-------------load the model-----------------')
    model.load_weights(checkpoint_save_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                 save_weights_only=True,
                                                 save_best_only=True)

history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                    callbacks=[cp_callback])
model.summary()

总结:

  • 本文主要借鉴:mooc曹健老师的《人工智能实践:Tensorflow笔记》
  • 卷积神经网络是特征提取器,提取完数据送入全连接网络,应用场景更丰富
  • 卷积神经网络需要选择我们需要用的卷积核大小和移动步长
  • CBAPD不是必须都要具备的,也可以只包含一部分

你可能感兴趣的:(cnn,深度学习,神经网络,计算机视觉)