繁体   English   中英

有什么方法可以在 tensorflow 中重新缩放和堆叠具有不同形状的特征图?

[英]any way to rescale and stack features maps with different shape in tensorflow?

我打算在我的实验中使用跳跃连接的概念。 基本上,在我的管道中,将堆叠或连接Conv2D之后的特征图。 但是,特征图的形状不同,尝试将它们堆叠成一个张量时出错。 有谁知道在 tensorflow 中正确执行此操作的任何可能方法? 有什么想法或想法可以实现这一目标吗? 谢谢

创意流程图

这是我要执行的管道流程图:

在此处输入图像描述

我的情况有点不同,因为我在Conv2D之后使用了额外的构建块,它的 output 现在是 15x15x64 的feature maps of 15x15x64等等。 我想将这些功能 map 堆叠成一个,然后再次将其用于Conv2D

我的尝试

这是我可重现的尝试:

import tensorflow as tf
from tensorflow.keras.layers import Dense, Dropout, Activation, Conv2D, Flatten, MaxPool2D, BatchNormalization


inputs = tf.keras.Input(shape=(32, 32, 3))
x = inputs
x = Conv2D(32, (3, 3), input_shape=(32,32,3))(x)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
fm1 = MaxPooling2D(pool_size=(2,2))(x)

x = Conv2D(32,(3, 3), input_shape=(15,15,32))(fm1)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
fm2 = MaxPooling2D(pool_size=(2,2))(x)

concatted = tf.keras.layers.Concatenate(axis=1)([fm1, fm2])

但是这样我最终遇到了以下错误: ValueError: A Concatenate layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 15, 15, 32), (None, 6, 6, 32)] ValueError: A Concatenate layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 15, 15, 32), (None, 6, 6, 32)] 我不确定堆叠不同形状的特征图的正确方法是什么。 我们怎样才能做到这一点? 任何可能的想法?

希望 output

在我实际的 model 中,我得到的特征图形状是TensorShape([None, 15, 15, 128])TensorShape([None, 6, 6, 128]) 我需要找到合并它们或将它们堆叠成一个的方法。 理想情况下,连接或堆叠的特征图的形状为: [None, 21,21,128] 有什么方法可以将它们堆叠成一个吗? 任何的想法?

您要实现的目标在数学上行不通。 让我举例说明。 以简单的一维问题(如一维卷积)为例。 您有一个(None, 64, 128) (fm1) 大小的 output 和一个(None, 32, 128) (fm2) output 您想要连接。 然后,

concatted = tf.keras.layers.Concatenate(axis=1)([fm1, fm2])

工作得很好,给你一个 output 大小(None, 96, 128)

让我们来谈谈二维问题。 现在你有两个张量(None, 15, 15, 128)(None, 6, 6, 128)并希望最终得到一个(None, 21, 21, 128)大小为 output 的张量。数学不成立这里。 要了解原因,请将其简化为一维格式。 然后你得到了

fm1 -> (None, 225, 128)
fm2 -> (None, 36, 128)

通过连接你得到,

concatted -> (None, 261, 128)

如果数学可行,您应该得到(None, 441, 128) ,它可以重塑为(None, 21, 21, 128) 因此,除非您在重塑张量上用441-261 = 180较小的边缘,否则这是无法实现的。 然后将其重塑为所需的形状。 以下是您如何做到这一点的示例,

concatted = tf.keras.layers.Lambda(
    lambda x: K.reshape(
                  K.concatenate(
                      [K.reshape(x[0], (-1, 225, 128)), 
                       tf.pad(
                           K.reshape(x[1], (-1, 36, 128)), [(0,0), (0, 180), (0,0)]
                       )
                      ], axis=1
                  ), (-1, 21, 21, 128))
              )([fm1, fm2])

重要提示:但我不能保证您的 model 的性能,这只是从数学上解决了您的问题。 从机器学习的角度来看,我不建议这样做。 最好的方法是确保输出在大小上兼容以进行串联。 很少有方法是,

  • 不减小卷积输出的大小(stride = 0 and padding='same')
  • 使用转置卷积操作对较小的进行 size-up

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM