gpt4 book ai didi

填充为 ='SAME' 的 Tensorflow/Keras Conv2D 层表现异常

转载 作者:行者123 更新时间:2023-12-04 01:33:40 27 4
gpt4 key购买 nike

我的问题:

我进行的一个简单的实验表明,使用 padding='SAME'在 Keras/TF 中的 conv2d 层与使用 padding='VALID' 不同带有前面的零填充层。

  • 这怎么可能?
  • Keras/TF 是否在张量周围对称地填充零?

  • 实验说明 - 如果您有兴趣进一步阅读:

    我用了 onnx2keras将我的 Pytorch 模型转换为 keras/TF 的包。

    onnx2keras遇到一个带有 padding > 0 的卷积层在 ONNX 模型中,它将其转换为 Keras 的 Conv2Dvalid填充(即没有填充!),前面是 Keras 的 ZeroPadding2D层。这非常有效,并返回与 Pytorch 网络产生的输出相同的输出。

    我还觉得奇怪的是它不是简单地使用 padding='SAME' ,正如大多数引用资料所说,Keras/TF 使用零填充,就像 Pytorch 一样。

    尽管如此,我还是修补了 onnx2keras并让它生产了我 Conv2D层与 padding='SAME'而不是 'VALID' 的现有解决方案用前面的零填充层填充。这使得生成的模型返回与零填充层不同的输出,当然与我的 Pytorch 模型不同,后者在补丁之前是相同的。

    最佳答案

    padding='Same'在 Keras 中意味着当输入大小和内核大小不完全适合时,根据需要添加填充以弥补重叠。

    padding='Same' 示例:

    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Same'))

    # Model Summary
    model.summary()

    代码的输出 -
    Model: "sequential_20"
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_28 (Conv2D) (None, 3, 3, 24) 120
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________

    图文表示:
    下图显示了当 padding='Same' 时输入的填充 (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2))。

    enter image description here

    -------------------------------------------------- -------------------------------------------------- --------------
    padding='Valid'在 Keras 中意味着不添加填充。

    padding='Valid' 示例:对 Conv2D 使用了与我们上面用于 padding = 'Same' 相同的输入。即(input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2))
    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

    # Model Summary
    model.summary()

    代码的输出 -
    Model: "sequential_21"
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_29 (Conv2D) (None, 2, 2, 24) 120
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________

    图文表示:
    下图显示当 padding='Valid' 时没有为输入添加填充 (input_shape=(5,5,1), kernel_size=(2,2), strides =(2,2))。
    enter image description here

    -------------------------------------------------- -------------------------------------------------- --------------

    现在让我们尝试使用与 padding='Valid' 相同的代码对于输入 (input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2))。 这里padding='Valid'行为应该与 padding='Same' 相同.

    代码 -
    # Importing dependency
    import keras
    from keras.models import Sequential
    from keras.layers import Conv2D

    # Create a sequential model
    model = Sequential()

    # Convolutional Layer
    model.add(Conv2D(filters=24, input_shape=(6,6,1), kernel_size=(2,2), strides =(2,2) ,padding='Valid'))

    # Model Summary
    model.summary()

    代码的输出 -
    Model: "sequential_22"
    _________________________________________________________________
    Layer (type) Output Shape Param #
    =================================================================
    conv2d_30 (Conv2D) (None, 3, 3, 24) 120
    =================================================================
    Total params: 120
    Trainable params: 120
    Non-trainable params: 0
    _________________________________________________________________

    关于填充为 ='SAME' 的 Tensorflow/Keras Conv2D 层表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323897/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com