from tensorflow.contrib import slim
import tensorflow as tf
input1 = tf.Variable(tf.random_normal([1,513,513,3]))
input2 = tf.Variable(tf.random_normal([1,513,513,3]))
def conv2d_same(inputs, num_outputs, kernel_size, stride, rate=1, scope=None):
if stride == 1:
return slim.conv2d(inputs, num_outputs, kernel_size, stride=1, rate=rate,
padding='SAME', scope=scope)
else:
kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1)
pad_total = kernel_size_effective - 1
pad_beg = pad_total // 2
pad_end = pad_total - pad_beg
inputs = tf.pad(inputs,
[[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]])
return slim.conv2d(inputs, num_outputs, kernel_size, stride=stride,
rate=rate, padding='VALID', scope=scope)
input1 = conv2d_same(input1, 32, 3, stride=2)
input2 = conv2d_same(input2, 32, 3, stride=1)
print(input1)
print(input2)
最终运行结果为 input1 = Tensor("Conv/Relu:0", shape=(1, 257, 257, 32), dtype=float32) input2 = Tensor("Conv_1/Relu:0", shape=(1, 513, 513, 32), dtype=float32)
从结果可以看出当步长为1时,conv2d_same函数和普通卷积函数没有区别,如conv2d一样;
当步长大于1时则会进行其他操作,如上面所示,首先使用空洞卷积的特性改变卷积核大小,由于空洞率rata为1,故卷积核大小不变,之后使用填充0的方式扩充图像边缘尺寸,最后使用conv2d函数进行卷积。
版权声明:本文为m0_37799466原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。