8 CNN中的预定义二进制卷积滤波器 - Tensorflow

时间:2017-09-09 16:58:18

标签: python python-2.7 tensorflow convolution

我试图在Tensorflow中执行以下操作:

I need this

为此我到目前为止做了以下事情:

def new_weights(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))

# From here down is another function
shape = [3, 3, 1, 8,]

H = [
    [[0,  1, 0,],[0, -1, 0,],[0,  0, 0,],],
    [[0,  0, 1,],[0, -1, 0,],[0,  0, 0,],],
    [[0,  0, 0,],[0, -1, 1,],[0,  0, 0,],],
    [[0,  0, 0,],[0, -1, 0,],[0,  0, 1,],],
    [[0,  0, 0,],[0, -1, 0,],[0,  1, 0,],],
    [[0,  0, 0,],[0, -1, 0,],[1,  0, 0,],], 
    [[0,  0, 0,],[1, -1, 0,],[0,  0, 0,],],
    [[1,  0, 0,],[0, -1, 0,],[0,  0, 0,],]
]

anchor_weights = tf.reshape(tf.cast(H, tf.float32), shape)

layer = tf.nn.conv2d(input=input,
                     filter=anchor_weights,
                     strides=[1, 1, 1, 1],
                     padding='SAME')

layer = tf.nn.max_pool(value=layer,
                       ksize=[1, 2, 2, 1],
                       strides=[1, 2, 2, 1],
                       padding='SAME')

layer = tf.nn.relu(layer)

feature_maps = layer

shape = [1, 1, 8, 1]

v = tf.cast(new_weights(shape), tf.float32)

# To put all together
layer = tf.nn.conv2d(input=feature_maps,
                     filter=v,
                     strides=[1, 1, 1, 1],
                     padding="SAME")

但是当我去打印anchor_weights和feature_maps时,我会做出回应。

anchor_weights e feature_maps

对我而言,我所需要的东西似乎完全错了,就像我向你展示的第一张图片一样。

我不知道如何解决这个问题,任何想法?

1 个答案:

答案 0 :(得分:1)

我认为H数组中的元素顺序错误。您将H填充为[8,3,3]张量。然后使用tf.reshape,这会改变张量的形状,但不会交换元素。你需要这样的东西:

H = [
     [ 
      [[0, 0, 0, 0, 0, 0, 0, 1]],
      [[1, 0, 0, 0, 0, 0, 0, 0]],
      [[0, 1, 0, 0, 0, 0, 0, 0]]
     ],
     [ 
      [[ 0, 0, 0, 0, 0, 0, 1, 0]],
      [[-1,-1,-1,-1,-1,-1,-1,-1]],
      [[ 0, 0, 1, 0, 0, 0, 0, 0]]
     ],
     [ 
      [[0, 0, 0, 0, 0, 1, 0, 0]],
      [[0, 0, 0, 0, 1, 0, 0, 0]],
      [[0, 0, 1, 0, 0, 0, 0, 0]]
     ]
    ]
anchor_weights = tf.cast(H, tf.float32)