为什么 Conv2D 似乎只能在 1D 中执行?

Why does Conv2D seems to only performing in 1D?

我想了解 Tensorflow 的工作原理。 我有这段代码试图对大小为 (5,5) 的输入图像执行 2D 卷积。 但是好像只是在一维而不是二维进行卷积。

代码如下:

iX = iY = 5
kX = kY = 3
image = np.ones((iY,iX)).reshape((iY,iX,1))
kernel = np.ones((kY,kX)).reshape((kY,kX,1,1))
bias = np.array([0.0])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(1, (kY,kX), strides=1, padding="same", activation='linear',weights=[kernel,bias])(i)#l_conv2d(i)
model = keras.Model(i, x)

model(image).numpy()

实际输出:

[2, 3, 3, 3, 2]  
[2, 3, 3, 3, 2]  
[2, 3, 3, 3, 2]  
[2, 3, 3, 3, 2]  
[2, 3, 3, 3, 2]  

预期输出:

[4, 6, 6, 6, 4]  
[6, 9, 9, 9, 6]  
[6, 9, 9, 9, 6]  
[6, 9, 9, 9, 6]  
[4, 6, 6, 6, 4]  

我做错了什么?

您已经提到 padding='same' 这就是为什么您得到的输出具有与输入图像 5x5x1x1 相同的形状,格式为 Height X Width X Channel X No_of_filterspadding='same' 参数向图像添加额外的填充值以获得所需的输出体积形状。您可以使用 padding='valid' 来避免填充。

您在向模型提供图像时也错过了批量维度:

iX = iY = 9
kX = kY = 3
no_of_filter = 2
image = np.ones((iY,iX)).reshape((1,iY,iX,1))
kernel = np.ones((kY,kX,no_of_filter)).reshape((kY,kX,1,no_of_filter))
bias = np.array([0.0 for _ in range(no_of_filter)])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(no_of_filter, (kY,kX), strides=1, padding="valid", activation='linear',weights=[kernel,bias])(i) #l_conv2d(i)
model = keras.Model(i, x)
model.summary()
model(image).numpy().shape