【问题标题】:TensorFlow convolution of 2D array二维数组的TensorFlow卷积
【发布时间】:2018-10-12 09:42:33
【问题描述】:

我有一些数据,其中有一个二维数组 A 和一个内核 K。我想计算这些的卷积。我如何在 TensorFlow 中做到这一点。看起来内置的卷积运算将 4D 张量作为输入,因为它们假设我们正在计算具有多个颜色通道的批次。如何对我的数据使用这些操作?

例子:

a = np.random.randint(2, size=(10,10))
k = [[1,1,1],[1,1,1],[1,1,1]]
# Compute convolution of these??
c = ...

【问题讨论】:

    标签: tensorflow


    【解决方案1】:
    import tensorflow as tf
    import numpy as np
    
    a = np.random.randint(2, size=(10,10))
    k = [[1,1,1],[1,1,1],[1,1,1]]
    
    tensor_a = tf.constant(a, tf.float32)
    tensor_k = tf.constant(k, tf.float32)
    
    tensor_res = tf.nn.convolution(tf.reshape(tensor_a, [1, 10, 10, 1]), tf.reshape(tensor_k, [3, 3, 1, 1]), padding='VALID')
    
    sess = tf.Session()
    print(sess.run(tensor_res))
    

    计算图教程是here

    卷积助手doc

    【讨论】:

      【解决方案2】:

      到目前为止发布的答案都错过了一个重要点:Tensorflow 计算卷积,而是计算交叉相关,如 doc 中所述:

      请注意,虽然这些操作称为“卷积”,但它们是 严格来说是“互相关”,因为滤波器是组合的 带有输入窗口而不反转过滤器。

      如果您真的想计算卷积,则必须先反转内核,然后再将其传递给conv2d,即在水平轴上翻转一次,然后在垂直轴上翻转一次。使用 Miriam 的答案,这可能看起来像这样:

      import tensorflow as tf
      import numpy as np
      
      a = np.random.randint(2, size=(10,10))
      k = np.array([[1,1,1],[1,1,1],[1,1,1]],dtype=np.float32)
      flip = [slice(None, None, -1), slice(None, None, -1)]
      k = k[flip]
      
      a=a.astype(np.float32)
      a_tensor = tf.reshape(a, [1, 10, 10, 1])
      k_weight = tf.reshape(np.array(k), [3,3,1,1])
      c=tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1])
      sess=tf.Session()
      c.eval(session=sess)
      

      请注意,在这个特定示例中,翻转内核在技术上是徒劳的,因为对于对称内核,卷积和互相关是一回事。然而,一旦你有了一个非对称内核,如果你想让 Tensorflow 实际计算卷积,就必须翻转它。

      【讨论】:

        【解决方案3】:

        除了 kaufmanu 的回答,如果您需要 2D 结果,您可以使用tf.squeeze。即,

        c=tf.squeeze(tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1]))
        

        执行卷积。

        【讨论】:

          猜你喜欢
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          相关资源
          最近更新 更多