美文网首页
tensorflow--卷积计算过程

tensorflow--卷积计算过程

作者: tu7jako | 来源:发表于2020-06-08 23:12 被阅读0次

    1、卷积(Convolutional Neural Networks, CNN)计算过程

    • 全连接神经网络对识别和预测都有非常好的效果,但有时,如Mnist数据集中,输入是一幅28行28列的784个像素点的灰度值,仅两层全连接网络就有10多w个带训练参数(784128+128 + 12810+10),而实际中输入神经网络的是具有更高分辨率的彩色图片(近乎乘以3),使得全连接神经网络的输入特征过多,网络规模过大,待优化参数过多,很容易使得模型过拟合。为了减少模型参数,在实际应用中会先对原始图片进行特征提取,再把提取到的特征送给全连接网络。
    • 卷积计算是一种有效的特征提取方法。一般会用一个正方形的卷积核,按指定步长,在输入特征上滑动,遍历输入特征图上的每一个点。每一个步长,卷积核会与输入特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项得到输出特征的一个像素点。一般要使卷积核的通道数与输入特征图的通道数一致。所以,当前输入特征图使用了几个卷积核,就决定了输出特征图的深度(如果模型在某层特征提取能力不足,可以在这层多使用几个卷积核提高这一层的特征提取能力)

    2、感受野(Receptive Field)

    • 卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小(例如,一个5*5的原始图片,分别经过一个5 * 5和两个3 * 3的卷积核作用,都能得到一个感受野是5的输出特征图(输出是1 * 1))
    • 选一个5 * 5 还是两个3 * 3 呢?(近乎都是选两层3*3)
    #  两层3*3计算量
    (x-2)^2 * 9 + ((x-2) -2)^2 * 9 = 18 * x^2 - 108x + 180 
    
    #  一层5*5计算量
    (x-4)^2 * 25 = 25 * x^2 - 200x + 400 
    

    3、全零填充(Padding)

    • 在卷积计算中保持输入特征图的尺寸不变,可以使用全零填充,在输入特征图周围填充0
    • 使用全零填充(padding=SAME):输出特征图边长 = 输入特征图边长 / 步长(向上取整)
    • 不使用(padding=VALID): 输出特征图边长 = (输入特征图边长 - 核长 + 1 )/ 步长(向上取整)

    TF描述卷积层

    tf.keras.layers.Conv2D(
        filters=卷积核个数,
        kernel_size=卷积核尺寸,
        strides=滑动步长,  # 横纵向相同写步长整数,或(纵向步长h, 横向步长w),默认1
        padding="same" or "valid"(默认),
        activation=激活函数,  # 如relu,sigmoid,tanh,softmax等
        input_shape=(高,宽,通道数)
    )
    

    4、批标准化(Batch Normalization, BN)

    • 神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况。标准化可以使数据符合以0为均值,1为标准差的分布BN就是对一小批数据(batch),做标准化处理。常用在卷积操作和激活操作之间。
    • 使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力
    • 现实意义举例:顶级富豪几百亿的身家增加了几亿,和普通上班族年薪增加了几(十)万的模型在sigmoid函数里的表达
    • 但是标准化后的特征数据,集中在激活函数的线性表达区域(sigmoid函数在0附近导数很接近1),使得激活函数丧失了非线性特征,因此,在BN操作中为每个卷积核引入了两个可训练参数,缩放因子γ和偏移因子β,调整归一化的力度。

    5、池化(pooling):用于减少特征数量。

    • 最大值池化:可提取图片纹理
    • 均值池化:可保留背景特征
    [[1, 1, 2, 4],    
     [5, 6, 7, 8],
     [3, 2, 1, 0],
     [1, 2, 3, 4]]
    
    # 用2*2的池化核、步长为2的最大值池化
    [[6, 8,],
     [3, 4]]
    
    
    # 用2*2的池化核、步长为2的均值池化
    [[3.25, 5.25,],
     [2, 2]]
    

    TF描述池化:

    tf.keras.layers.MaxPool2D(
        pool_size=池化核尺寸,
        strides=池化步长,  # 步长整数,或纵向尺寸h,横向尺寸w
        padding="valid" or "same"  # 是否使用全零填充
    )
    
    tf.keras.layers.AveragePooling2D(
        pool_size=池化核尺寸,
        strides=池化步长,  # 步长整数,或纵向尺寸h,横向尺寸w
        padding="valid" or "same"  # 是否使用全零填充
    )
    

    6、舍弃(Dropout)

    为了缓解神经网络过拟合,在神经网络训练过程中,常把隐藏层的部分神经元按照一定比例从神经网络中临时舍弃。在使用神经网络时,被舍弃的神经元再回复链接。
    tf.keras.layers.Dropout(舍弃的概率)

    7、总结

    卷积神经网络,就是借助卷积核提取特征后,送入全连接网络。


    cnn.png

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

    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same'),  # C
        tf.keras.layers.BatchNormalization(),  # B
        tf.keras.layers.Activation("relu"),  # A
        tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding="same"),  # P
        tf.keras.layers.Dropout(0.2)  # D
    ])
    

    相关文章

      网友评论

          本文标题:tensorflow--卷积计算过程

          本文链接:https://www.haomeiwen.com/subject/kinnzhtx.html