本节我们利用tf的一些函数来实现一个最简单的均值滤波器对图片进行滤波,假设图片的大小为16*16*1,设计一个模块来实现均值滤波
首先介绍一下tf.nn.conv2d函数
conv2d(
input,filter,strides,padding,use_cudnn_on_gpu=None,data_format=None,name=None
)
其中input应该为四维tensor: [batch, in_height, in_width, in_channels]
filter为四维tensor:[filter_height, filter_width, in_channels, out_channels]
padding可以选择:‘SAME'也就是使得输入输出W,H不改变。'VALID'指不加padding
关于padding,查看api可以看到,'SAME'的意思并不是说输入输出不变
For the'SAME'padding, the output height and width are computed as:
out_height=ceil(float(in_height)/float(strides[1]))
out_width=ceil(float(in_width)/float(strides[2]))
也就是说与strides有关,而valid是指不加padding
strides强制要求首尾必须为一:[1,s,s,1]
以一个错误为例子,学习conv2d的用法:
想法:输入一个 [1,32,32,3]的全部为4的tensor,滤波器尺寸为[2,2,3,6]其值全部为1,步长为2.
希望输出[1,32,32,,6] 其值全部为1
实际上:输出 [1,16,16,,6] 其值全部为12
问题:
1.关于输出值12 :这里是卷积的运算概念没有掌握,filter为6个 [2,2,3]的滤波器,每一个滤波器应该对3个channel的值进行计算:所以是(0.25*4+0.25*4+0.25*4+0.25*4)*3=0.25*4*4*3=12
2.关于padding:上面也提到了,'SAME’并不表示输入输出w,h一致,而是与步长有关
网友评论