【问题标题】:Tensorflow Keras Conv2D multiple filtersTensorflow Keras Conv2D 多个过滤器
【发布时间】:2020-05-14 15:31:47
【问题描述】:

如果我有一个 1X2X3X3 输入(我首先使用通道)和权重 2X2X2X2,如下图所示,我不太了解 Keras Conv2D 输出,有人可以帮我理解输出特征图,过滤器如何卷积通过输入得到输出?

这是我的代码:

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)

【问题讨论】:

    标签: tensorflow keras conv-neural-network


    【解决方案1】:

    换个角度看每个操作符会更容易理解。您有一个形状为 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] |
    

    等等。

    【讨论】:

    • 男人!你是个天才
    猜你喜欢
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2021-05-20
    • 2018-01-16
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多