TensorFlow之keras.layers.Conv2D( )

Posted 谦曰盛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow之keras.layers.Conv2D( )相关的知识,希望对你有一定的参考价值。

  keras.layers.Conv2D( ) 函数参数

    def __init__(self, filters,
                 kernel_size,
                 strides=(1, 1),
                 padding=\'valid\',
                 data_format=None,
                 dilation_rate=(1, 1),
                 activation=None,
                 use_bias=True,
                 kernel_initializer=\'glorot_uniform\',
                 bias_initializer=\'zeros\',
                 kernel_regularizer=None,
                 bias_regularizer=None,
                 activity_regularizer=None,
                 kernel_constraint=None,
                 bias_constraint=None,
                 **kwargs):

参数:

filters 卷积核个数的变化,filters 影响的是最后输入结果的的第三个维度的变化,例如,输入的维度是 (600, 600, 3), filters 的个数是 64,转变后的维度是 (600, 600, 64)

>>> from keras.layers import (Input, Reshape)
>>> input = Input(shape=(600, 600, 3))
>>> x = Conv2D(64, (1, 1), strides=(1, 1), name=\'conv1\')(input)
>>> x
<tf.Tensor \'conv1_1/BiasAdd:0\' shape=(?, 600, 600, 64) dtype=float32>

kernel_size 参数 表示卷积核的大小,可以直接写一个数,影响的是输出结果前两个数据的维度,例如,(600, 600, 3)=> (599, 599, 64)

>>> from keras.layers import (Input, Conv2D)
>>> input = Input(shape=(600, 600, 3))
>>> Conv2D(64, (2, 2), strides=(1, 1), name=\'conv1\')(input)
<tf.Tensor \'conv1/BiasAdd:0\' shape=(?, 599, 599, 64) dtype=float32>

直接写 2 也是可以的

>>> from keras.layers import (Input, Conv2D)
>>> input = Input(shape=(600, 600, 3))
>>> Conv2D(64, 2, strides=(1, 1), name=\'conv1\')(input)
<tf.Tensor \'conv1_2/BiasAdd:0\' shape=(?, 599, 599, 64) dtype=float32>

strides  步长 同样会影响输出的前两个维度,例如,(600, 600, 3)=> (300, 300, 64),值得注意的是,括号里的数据可以不一致,分别控制横坐标和纵坐标,这里步长的计算公式为:

>>> from keras.layers import (Input, Conv2D)
>>> input = Input(shape=(600, 600, 3))
>>> Conv2D(64, 1, strides=(2, 2), name=\'conv1\')(input)
<tf.Tensor \'conv1_4/BiasAdd:0\' shape=(?, 300, 300, 64) dtype=float32>

padding 是否对周围进行填充,“same” 即使通过kernel_size 缩小了维度,但是四周会填充 0,保持原先的维度;“valid”表示存储不为0的有效信息。多个对比效果如下:

>>> Conv2D(64, 1, strides=(2, 2), padding="same", name=\'conv1\')(input)
<tf.Tensor \'conv1_6/BiasAdd:0\' shape=(?, 300, 300, 64) dtype=float32>
>>> Conv2D(64, 3, strides=(2, 2), padding="same", name=\'conv1\')(input)
<tf.Tensor \'conv1_7/BiasAdd:0\' shape=(?, 300, 300, 64) dtype=float32>
>>> Conv2D(64, 3, strides=(1, 1), padding="same", name=\'conv1\')(input)
<tf.Tensor \'conv1_8/BiasAdd:0\' shape=(?, 600, 600, 64) dtype=float32>
>>> Conv2D(64, 3, strides=(1, 1), padding="valid", name=\'conv1\')(input)
<tf.Tensor \'conv1_9/BiasAdd:0\' shape=(?, 598, 598, 64) dtype=float32>

通过这种最简单的方式,可以观察 ResNet50 的组成结构

 Conv Block 的架构:

def conv_block(input_tensor, kernel_size, filters, stage, block, strides):

    filters1, filters2, filters3 = filters  # filters1 64, filters3 256  将数值传入到filters。。。中
    conv_name_base = \'res\' + str(stage) + block + \'_branch\'
    bn_name_base = \'bn\' + str(stage) + block + \'_branch\'

    x = Conv2D(filters1, (1, 1), strides=strides, name=conv_name_base + \'2a\')(input_tensor)
    x = BatchNormalization(name=bn_name_base + \'2a\')(x)
    x = Activation(\'relu\')(x)

    x = Conv2D(filters2, kernel_size, padding=\'same\', name=conv_name_base + \'2b\')(x)
    x = BatchNormalization(name=bn_name_base + \'2b\')(x)
    x = Activation(\'relu\')(x)

    x = Conv2D(filters3, (1, 1), name=conv_name_base + \'2c\')(x)
    x = BatchNormalization(name=bn_name_base + \'2c\')(x)

    shortcut = Conv2D(filters3, (1, 1), strides=strides, name=conv_name_base + \'1\')(input_tensor)
    shortcut = BatchNormalization(name=bn_name_base + \'1\')(shortcut)

    x = layers.add([x, shortcut])
    x = Activation("relu")(x)
    return x

Identity Block 的架构:

def identity_block(input_tensor, kernel_size, filters, stage, block):
    filters1, filters2, filters3 = filters

    conv_name_base = \'res\' + str(stage) + block + \'_branch\'
    bn_name_base = \'bn\' + str(stage) + block + \'_branch\'

    x = Conv2D(filters1, (1, 1), name=conv_name_base + \'2a\')(input_tensor)
    x = BatchNormalization(name=bn_name_base + \'2a\')(x)
    x = Activation(\'relu\')(x)

    x = Conv2D(filters2, kernel_size, padding=\'same\', name=conv_name_base + \'2b\')(input_tensor)
    x = BatchNormalization(name=bn_name_base + \'2b\')(x)
    x = Activation(\'relu\')(x)

    x = Conv2D(filters3, (1, 1), name=conv_name_base + \'2c\')(input_tensor)
    x = BatchNormalization(name=bn_name_base + \'2c\')(x)

    x = layers.add([x, input_tensor])
    x = Activation(\'relu\')(x)
    return x  

附上理论链接 Resnet-50网络结构详解  https://www.cnblogs.com/qianchaomoon/p/12315906.html

以上是关于TensorFlow之keras.layers.Conv2D( )的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow篇--Tensorflow框架可视化之Tensorboard

TensorFlow 之创建交互式 TensorFlow 会话

tensorflow笔记之基础知识

TensorFlow 之 手写数字识别MNIST

TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)

TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)