Keras中Conv2D图层的意外结果

fae0ux8s  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(166)

我在Keras的Conv2D图层上运行一些测试,我不明白我得到的结果之一。
我正在运行一个简单的例子来了解发生了什么。我采取了一个测试数组,并创建了一个Conv2D层与2过滤器输出。我使用简单的3*3内核的1。我希望有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与1的3x3内核的卷积。
两个滤波器的卷积权重是相同的,只有1(np. one([3,3,1,2])),并且据我所知,它们应该应用于同一个输入数组,所以我可能遗漏了一些东西。
有人能解释一下我们是如何得到第二个过滤结果的吗?为什么在这种情况下它与第一个过滤结果不一样?

ve7v8dk2

ve7v8dk21#

布局有点误导;两个滤波器给予相同的正确结果。
第一个筛选器:

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)

相关问题