[英]Tensorflow No gradients provided for any variable with different shape of variable
[英]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 的性能,这只是从数学上解决了您的问题。 从机器学习的角度来看,我不建议这样做。 最好的方法是确保输出在大小上兼容以进行串联。 很少有方法是,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.