我正在Keras中运行Conv2D层的一些测试,我不理解我得到的结果之一。
我正在运行一个简单的例子来理解正在发生什么。我取一个测试数组并创建一个带有2个过滤器输出的Conv2D层。我用简单的3*3核。我希望有2个过滤器具有相同的输出。
下面是我的最小代码示例:import tensorflow.keras as keras
import functools
from keras import layers
import tensorflow as tf
import tensorflow.keras as keras
import keras.layers as layers
import numpy as np
###define a simple test array
test_array = np.array([[2,2,2,1],[2,1,2,2],[2,2,2,2],[2,2,1,2]],dtype=np.float32)
###reshape to simulate a filter entry of a one channel conv2D layer
test_array = test_array.reshape((1,4,4,1))
###Create conv2Dlayer and initialize
standardConv = layers.Conv2D(filters=2,kernel_size=[3,3])
standardConv(np.ones([1,4,4,1],dtype=np.float32))
###set simple weights for testing
standardConv.set_weights([ np.ones([3,3,1,2]) , np.zeros([2]) ])
###apply convolution layer to test_array
standardConv(test_array)
我得到的结果如下:
Out[46]:
<tf.Tensor: shape=(1, 2, 2, 2), dtype=float32, numpy=
array([[[[17., 17.],
[16., 16.]],
[[16., 16.],
[16., 16.]]]], dtype=float32)>
我不理解第二个过滤器的结果[[16]。16。]、[16。16。]我所期望的是看到两个过滤器具有相同的结果[[17,17],[16,16]],这对应于我的test_array与3x3内核1的卷积。
两个过滤器的卷积权值是相同的,只有一个(np.ones([3,3,1,2]))),它们应该应用于相同的输入数组,据我所知,所以我可能错过了一些东西。
谁能解释一下我们是如何得到第二个过滤器结果的,为什么在这种情况下它与第一个不一样?
布局有点误导;两个过滤器给出相同的正确结果。
第一过滤器:
print(standardConv(test_array)[:, :, :, 0])
输出:
tf.Tensor(
[[[17. 16.]
[16. 16.]]], shape=(1, 2, 2), dtype=float32)
第二过滤器:
print(standardConv(test_array)[:, :, :, 1])
输出:tf.Tensor(
[[[17. 16.]
[16. 16.]]], shape=(1, 2, 2), dtype=float32)
当您使用更多过滤器时,例如5,您将得到这样的输出:
tf.Tensor(
[[[[17. 17. 17. 17. 17.]
[16. 16. 16. 16. 16.]]
[[16. 16. 16. 16. 16.]
[16. 16. 16. 16. 16.]]]], shape=(1, 2, 2, 5), dtype=float32)