tensorflow 卷积:设定特定卷积核

镜像问题:pytorch 自定义卷积核进行卷积--卷积核订制

有时想用tensorflow的conv2d的卷积操作,实现一些特定的滤波操作,如patch求和、计算梯度等,这时可以通过设计特定的卷积核来实现功能。

先看tf.nn.conv2d的各个参数:

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
参数:
    input : tf张量,shape=[N,H,W,C] ,dtype=tf.float32(最好)
    filter: 卷积核,tf张量,dtype=tf.float32(与input保持一致),
            shape=[filter_height,filter_weight,input_channel=C,output_channels ],
            其中 filter_height 为卷积核高度,
                 filter_weight 为卷积核宽度,
                 in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,
                 out_channel 是卷积核的个数,代表输出的feature_map的通道数。
    strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],
              第一位和最后一位固定必须是1,最后一个维度步长必须是1,是因为卷积是逐个通道进行的。
    padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。
             "SAME"是考虑边界,不足的时候用0去填充周围,
             "VALID"则不考虑
    use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true
 

主要需要注意的是:input,filter,strides的shape及各维度的含义。尤其filter各维度的含义与input是不同的。stride是4个维度。

示例:

"""
脚本功能:将256*256的图像不重叠的划分为64*64的patch,计算每个patch中的像素值之和
实现:设计64*64的全1卷积核,以stride=64移动,不添加0 padding
"""
feature_map = tf.ones([1,256,256,1],dtype=tf.float32)
filter = tf.ones((64,64,1,1),dtype=tf.float32)
padding = "VALID"
result = tf.nn.conv2d(feature_map, filter, strides=(1,64,64,1), padding=padding)
print(result.shape)

with tf.Session() as sess:
    print(sess.run(result))

返回结果:

(1, 4, 4, 1)

[[[[4096.]
   [4096.]
   [4096.]
   [4096.]]

  [[4096.]
   [4096.]
   [4096.]
   [4096.]]

  [[4096.]
   [4096.]
   [4096.]
   [4096.]]

  [[4096.]
   [4096.]
   [4096.]
   [4096.]]]]

 

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值