Tensorflow 卷积

Tensorflow convolution

我正在尝试对可变尺寸的图像执行卷积 (conv2d)。我有这些图像的一维数组形式,我想对它们执行卷积,但我在形状方面遇到了很多麻烦。 这是我的代码 conv2d:

tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')

其中 x 是输入图像。 错误是:

ValueError: Shape must be rank 4 but is rank 1 for 'Conv2D' (op: 'Conv2D') with input shapes: [1], [5,5,1,32].

我想我可以重塑 x,但我不知道正确的尺寸。当我尝试此代码时:

x = tf.reshape(self.x, shape=[-1, 5, 5, 1]) # example

我明白了:

ValueError: Dimension size must be evenly divisible by 25 but is 1 for 'Reshape' (op: 'Reshape') with input shapes: [1], [4] and with input tensors computed as partial shapes: input[1] = [?,5,5,1].

您不能将 conv2d 与 1 阶张量一起使用。这是文档中的描述:

Computes a 2-D convolution given 4-D input and filter tensors.

这四个维度是 [batch, height, width, channels](正如 Engineero 已经写过的)。

如果您事先不知道图像的尺寸,tensorflow 允许提供 动态 形状:

x = tf.placeholder(tf.float32, shape=[None, None, None, 3], name='x')
with tf.Session() as session:
    print session.run(x, feed_dict={x: data})

在此示例中,创建了一个 4-D 张量 x,但只有通道数是静态已知的 (3),其他一切都在运行时确定。所以你可以把这个 x 传递给 conv2d,即使大小是动态的。

但是还有一个问题。你没有说你的任务,但如果你正在构建一个卷积神经网络,恐怕你需要知道输入的大小以确定所有池化操作后 FC 层的大小 - 这个大小必须是静态的。如果是这种情况,我认为最好的解决方案实际上是在将输入传递到卷积网络之前将其缩放到通用大小。

更新:

由于不清楚,以下是将任何图像重塑为 4 维数组的方法。

a = np.zeros([50, 178, 3])
shape = a.shape
print shape    # prints (50, 178, 3)
a = a.reshape([1] + list(shape))
print a.shape  # prints (1, 50, 178, 3)