Tensorflow 二维阵列的张量流卷积

Tensorflow 二维阵列的张量流卷积,tensorflow,Tensorflow,我有一些数据,其中有一个2D数组a和一个内核K。我想计算这些的卷积。如何在TensorFlow中执行此操作。看起来内置的卷积运算以4D张量作为输入,因为它们假设我们正在计算具有多个颜色通道的批次。如何将这些ops用于我的数据 例如: a = np.random.randint(2, size=(10,10)) k = [[1,1,1],[1,1,1],[1,1,1]] # Compute convolution of these?? c = ... 计算图教程是 卷积助手到目前为止发布的答案都

我有一些数据,其中有一个2D数组
a
和一个内核
K
。我想计算这些的卷积。如何在TensorFlow中执行此操作。看起来内置的卷积运算以4D张量作为输入,因为它们假设我们正在计算具有多个颜色通道的批次。如何将这些ops用于我的数据

例如:

a = np.random.randint(2, size=(10,10))
k = [[1,1,1],[1,1,1],[1,1,1]]
# Compute convolution of these??
c = ...
计算图教程是


卷积助手

到目前为止发布的答案都忽略了一个重要的点:Tensorflow不计算卷积,而是一个互相关,如下所述:

请注意,尽管这些操作称为“卷积”,但它们是 严格地说,“互相关”是因为滤波器是组合的 使用输入窗口,而不反转过滤器

如果您真的想计算卷积,则必须先反转内核,然后再将其传递到
conv2d
,即在水平轴上翻转一次,然后在垂直轴上翻转。根据米里亚姆的回答,这可能是这样的:

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实际计算卷积,你就必须翻转它。

除了考夫曼努的答案,如果你需要一个2D结果,你可以使用
tf.squesh
。即

c=tf.squeeze(tf.nn.conv2d(a_tensor, k_weight,padding='VALID',strides=[1, 1, 1, 1]))
执行卷积运算

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