Tensorflow Keras Conv2D多个过滤器

时间:2020-05-14 15:31:47

标签: tensorflow keras conv-neural-network

如果我有一个1X2X3X3输入(我首先使用通道)并且权重为2X2X2X2,则我不太了解Keras Conv2D输出,如下图所示,有人可以帮助我了解输出特征图,滤镜如何卷积超过输入以获得输出?

enter image description here

这是我的代码:

import os

import tensorflow as to
import tensorflow.python.util.deprecation as deprecation
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv1D, Conv2D


data = tf.range(3 * 3 * 2)
print(data)
data = tf.reshape(data, (1, 2, 3, 3))
print(data)

print('-------')
e = tf.range(2 * 2 * 2 * 2)
print(e)
e = tf.reshape(e, (2, 2, 2, 2))
print(e)
print('-------')

model = Sequential()
model.add(Conv2D(2, (2, 2), input_shape=(2, 3, 3), data_format='channels_first'))

weights = [e, tf.constant([0.0,0.0])]
model.set_weights(weights)

print(model.get_weights())

yhat = model.predict(data)
print(yhat.shape)
print(yhat)

enter image description here

1 个答案:

答案 0 :(得分:2)

在查看每个操作员时是否更改视角更容易理解。您有一个形状为1x2x3x3的输入。由于您使用的是data_format='channels_first',这意味着您有1张带有2个通道的图像,尺寸为3x3。您可以像这样可视化该图像:

| [ 0  9] [ 1 10] [ 2 11] |
| [ 3 12] [ 4 13] [ 5 14] |
| [ 6 15] [ 7 16] [ 8 17] |

这是您的3x3图像,其中每个“像素”都有两个通道。滤镜的形状为2x2x2x2,表示2x2滤镜从2个通道变为2个通道。可以这样表示:

|  0  1 |  |  4   5 |
|  2  3 |  |  6   7 |

|  8  9 |  | 12  13 |
| 10 11 |  | 14  15 |

这是您的2x2滤镜,其中每个滤镜位置包含一个2x2矩阵。形状为1x2x2x2的结果是1个具有2个通道且大小为2x2的图像:

| [456 508] [512 571] |
| [624 700] [680 764] |

要了解该操作的工作原理,我将逐步介绍输出[456 508]的第一个“像素”的计算。此输出是从输入图像的第一个2x2窗口计算得出的:

| [ 0  9] [ 1 10] |
| [ 3 12] [ 4 13] |

您要做的是获取每个“像素”(两个元素的向量),然后将它们乘以滤镜中相应位置的矩阵:

# Top-left
          |  0  1 |
[ 0  9] x |       | = [18 27]
          |  2  3 |
# Top-right
          |  4  5 |
[ 1 10] x |       | = [64 75]
          |  6  7 |
# Bottom-left
          |  8  9 |
[ 3 12] x |       | = [144 159]
          | 10 11 |
# Bottom-right
          | 12 13 |
[ 4 13] x |       | = [230 247]
          | 14 15 |

然后,您只需添加所有结果向量:

[18 27] + [64 75] + [144 159] + [230 247] = [456 508]

其余输出的计算方法相同,例如,通过将滤镜应用于下一个图像窗口,可以计算输出[512 571]

| [ 1 10] [ 2 11] |
| [ 4 13] [ 5 14] |

以此类推。