tensorflow中的卷积和池化操作,总结.tf.nn.conv2d 和tf.nn.max_pool

卷积和池化

首先介绍一下Tensorflow当中的卷积和池化操作。

  1. .卷积操作如下

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

#添加一个卷积层如下,
conv1 = tf.layers.conv2d(   # shape (28, 28, 1)
    inputs=image,
    filters=16,
    kernel_size=5,
    strides=1,
    padding='same',
    activation=tf.nn.relu
)    

ARGS:

  • input:A Tensor。必须是以下类型之一:float32,float64。
  • filter:A Tensor。必须有相同的类型input。
  • strides:列表ints。1-D长度4.每个尺寸的滑动窗口的步幅input。步长一般为1,strides = [1,X,Y,1],

padding: A string来自:"SAME", "VALID"。使用的填充算法的类型。一般只用SAME,

  • use_cudnn_on_gpu:可选bool。默认为True。
  • name:操作的名称(可选)。激活函数一般选择tf.nn.relu,激活函数的作用,用来增加线性分割能力,sigmoid一般会造成梯度消失,或者计算参数太多,资源消耗

卷积过程 如下

总结输出大小

  • 输入体积大小H_1*W_1*D_1H​1​​∗W​1​​∗D​1​​

  • 四个超参数:

    • Filter数量K
    • Filter大小F
    • 步长SS
    • 零填充大小P
  • 输出体积大小H_2*W_2*D_2H​2​​∗W​2​​∗D​2​​

    • H_2 = (H_1 - F + 2P)/S + 1H​2​​=(H​1​​−F+2P)/S+1
    • W_2 = (W_1 - F + 2P)/S + 1W​2​​=(W​1​​−F+2P)/S+1
    • D_2 = KD​2​​=K

注意如下

  1. 卷积后的长度=(原长度-kernel_size+padding*2)/strides+1
  2. 卷积后的宽度=(原宽度-kernel_size+padding*2)/strides+1
  3. 卷积后的高度=filters
  4. 卷积会造成特征增多,

 


2.   池化操作

tf.nn.max_pool(value, ksize, strides, padding, name=None)

ARGS:

  • value:A 4-D Tensor具有形状[batch, height, width, channels]和类型float32,float64,qint8,quint8,qint32。
  • ksize:长度> = 4的int列表。输入张量的每个维度的窗口大小。
  • strides:长度> = 4的int列表。输入张量的每个维度的滑动窗口的跨度。
  • padding:一个字符串,或者'VALID'或'SAME'。填补算法。
  • name:操作的可选名称。

pool1 = tf.layers.max_pooling2d(
    conv1,
    pool_size=2,
    strides=2,
)  

池化

  1. 池化操作会减小维度,
  2. 池化特征提取
  3. 常用的大小为2*2  步长 也为2
  4. 分类的话需要全连接层,
  5. 全连接层相当于做特征加权加权操作,,卷积和池化相当于特征工程,整个网络相当于一个''分类器''

猜你喜欢

转载自blog.csdn.net/qq_35290785/article/details/88932069