• 4.2 Tensorflow笔记:池化函数


    池化

    卷积神经网络的结构

    卷积神经网络

    其中,input为输入,conv为卷积层,由卷积核构成,pool为池层,由池化函数构成最后是全连接层与输出层,其负责对卷积层提取的特征进行处理以获得我们需要的结果

    池化函数的意义

    池化层的输入一般来源于上一个卷积层,主要作用是提供了很强的鲁棒性(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后的结果仍不变),并且减少了参数的数量,防止过拟合现象的发生,同时参数的减少对于计算而言也有一定的帮助。而又因为池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。

    池化层的前向计算

    常用的池化函数有最大池化,平均池化,其前向计算十分简单,最大池化就是求最大值,平均池化就是求平均值.其效果如下:
    1. 最大池化:tf.nn.avg_pool
    maxpool
    这里写图片描述
    2.平均池化:tf.nn.max_pool
    平均池化

    池化层反向计算

    池化层的反向传播根据池化函数的不同也有两种方式
    1. 最大池化,将残差传递给原来最大值的位置,其他位置的值设置为零
    最大池化的反向传播
    2. 平均池化,按照原来每个数字对应的位置,取对应残差的平均值(残差 / 对应位置数组数量)填充即可
    平均池化的反向传播

    code

    # - * - coding: utf - 8 -*-
    import tensorflow as tf
    import os
    import numpy as np
    
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    #
    input_data = tf.Variable(np.random.rand(10, 9, 9, 3), dtype=np.float32)
    filter_data = tf.Variable(np.random.rand(2, 2, 3, 2), dtype=np.float32)
    y = tf.nn.conv2d(input_data, filter_data, strides=[1, 1, 1, 1], padding='SAME')
    print('0. tf.nn.conv2d : ', y)
    
    # 计算池化区域中元素的平均值
    output = tf.nn.avg_pool(value=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
    print('1. tf.nn.avg_pool : ', output)
    
    # 计算池化区域中元素的最大值
    output = tf.nn.max_pool(value=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
    print('2. tf.nn.max_pool : ', output)
    
    # 计算池化区域中元素的最大值,与最大值所在位置
    # 1.1.0似乎只支持GPU,本代码首测运行于 python3.6.2 + Tensorflow(CPU) 1.2.0 + win10
    output, argmax = tf.nn.max_pool_with_argmax(input=y, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME')
    print('2.5 . tf.nn.max_pool : ', output, argmax)
    
    # 与conv2d_transpose 二维反卷积类似
    # 在解卷积网络(deconvolutional network) 中有时被称为'反卷积',但实际上是conv3d的转置,而不是实际的反卷积
    input_data = tf.Variable(np.random.rand(1, 2, 5, 5, 1), dtype=np.float32)
    filters = tf.Variable(np.random.rand(2, 3, 3, 1, 3), dtype=np.float32)
    y = tf.nn.conv3d(input_data, filters, strides=[1, 2, 2, 1, 1], padding='SAME')
    print('3. tf.nn.conv3d : ', y)
    
    # 计算三维下池化区域中元素的平均值
    output = tf.nn.avg_pool3d(input=y, ksize=[1, 1, 2, 2, 1], strides=[1, 2, 2, 1, 1], padding='SAME')
    print('4. tf.nn.avg_pool3d : ', output)
    
    # 计算三维下池化区域中元素的最大值
    output = tf.nn.max_pool3d(input=y, ksize=[1, 1, 2, 2, 1], strides=[1, 2, 2, 1, 1], padding='SAME')
    print('5. tf.nn.max_pool3d : ', output)
    
    # 执行一个N维的池化操作
    # def pool(input, window_shape,pooling_type,padding,dilation_rate=None,strides=None,name=None,data_format=None):
    

    run

    0. tf.nn.conv2d :  Tensor("Conv2D:0", shape=(10, 9, 9, 2), dtype=float32)
    1. tf.nn.avg_pool :  Tensor("AvgPool:0", shape=(10, 9, 9, 2), dtype=float32)
    2. tf.nn.max_pool :  Tensor("MaxPool:0", shape=(10, 9, 9, 2), dtype=float32)
    2.5 . tf.nn.max_pool :  Tensor("MaxPoolWithArgmax:0", shape=(10, 9, 9, 2), dtype=float32) Tensor("MaxPoolWithArgmax:1", shape=(10, 9, 9, 2), dtype=int64)
    3. tf.nn.conv3d :  Tensor("Conv3D:0", shape=(1, 1, 3, 5, 3), dtype=float32)
    4. tf.nn.avg_pool3d :  Tensor("AvgPool3D:0", shape=(1, 1, 2, 5, 3), dtype=float32)
    5. tf.nn.max_pool3d :  Tensor("MaxPool3D:0", shape=(1, 1, 2, 5, 3), dtype=float32)

    参考文章

    【1】 深度学习笔记5:池化层的实现

  • 相关阅读:
    Shortest path of the king
    二分查找c++简单模板
    2017广东工业大学程序设竞赛B题占点游戏
    2017广东工业大学程序设竞赛C题爬楼梯
    2017广东工业大学程序设竞赛E题(倒水)
    p1250 种树 贪心
    P1248 加工生产调度 贪心
    P1209 [USACO1.3]修理牛棚 Barn Repair 贪心
    P1607 [USACO09FEB]庙会班车Fair Shuttle 贪心
    P2602 [ZJOI2010]数字计数 数位dp
  • 原文地址:https://www.cnblogs.com/fonttian/p/9162801.html
Copyright © 2020-2023  润新知