tensorflow卷积层模板

  • 这里看的
  • 但我认为downsample部分不用自己填充,只设置步长为2就行,padding用SAME。因为filter的大小一般是奇数,padding用SAME,在卷积的时候,自动填充filters_shape[0] // 2
def convolutional(input_data, filters_shape, trainable, name, downsample=False, activate=True, bn=True):

    with tf.variable_scope(name):
        if downsample:
            # 就是filters_shape[0] // 2,佛祖来了也是
            pad_h, pad_w = (filters_shape[0] - 2) // 2 + 1, (filters_shape[1] - 2) // 2 + 1
            # NHWC
            paddings = tf.constant([[0, 0], [pad_h, pad_h], [pad_w, pad_w], [0, 0]])
            # input_data左右各填充pad_h列0,上下个填充pad_w行0
            input_data = tf.pad(input_data, paddings, 'CONSTANT')
            # 步长,第一位和最后一位固定必须是1
            strides = (1, 2, 2, 1)
            # 当filter全部在特征图里面的时候,进行卷积运算,即filter的每个值都有效时才开始计算
            padding = 'VALID'
        else:
            strides = (1, 1, 1, 1)
            # 当filter的中心与特征图的边角重合时,开始做卷积运算,步长为一时,输出的特征图大小不变
            padding = "SAME"

        # shape:高, 宽, 输入维度, 输出维度
        weight = tf.get_variable(name='weight', dtype=tf.float32, trainable=True,
                                 shape=filters_shape, initializer=tf.random_normal_initializer(stddev=0.01))
        conv = tf.nn.conv2d(input=input_data, filter=weight, strides=strides, padding=padding)

        if bn:
            conv = tf.layers.batch_normalization(conv, beta_initializer=tf.zeros_initializer(),
                                                 gamma_initializer=tf.ones_initializer(),
                                                 moving_mean_initializer=tf.zeros_initializer(),
                                                 moving_variance_initializer=tf.ones_initializer(), training=trainable)
        else:
            bias = tf.get_variable(name='bias', shape=filters_shape[-1], trainable=True,
                                   dtype=tf.float32, initializer=tf.constant_initializer(0.0))
            conv = tf.nn.bias_add(conv, bias)

        if activate == True: conv = tf.nn.leaky_relu(conv, alpha=0.1)

    return conv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值