将卷积层的4D张量输出重塑为5D张量以馈送到ConvLSTM2D层

时间:2020-09-12 12:02:23

标签: python tensorflow keras tensorflow2.0 tf.keras

我有一个VGG预训练模型。我将形状(160,120,3)的图像传递给它,并以批处理大小10传递。批处理中的每个帧代表一个时间步。

我知道VGG网络的输出形状为(10,5,3,512),因为我已经通过了批处理大小10。但是当我运行vggnet.output.shape时,我显然得到了(None,5,3,512)

接下来,我想将此输出从VGGnet馈送到ConvLSTM2D层。但是为此,我不得不将其转换为5D张量。

当我使用X = tf.keras.layers.Reshape((-1,10,5,3,512))(X)时,训练时会出错。 错误是

InvalidArgumentError:  Input to reshape is a tensor with 76800 values, but the requested shape has 768000
     [[node ds_model/reshape_2/Reshape (defined at <ipython-input-40-4fa9476bf8a0>:1) ]] [Op:__inference_train_function_5897]

Function call stack:
train_function

如何解决此错误?有什么方法可以将4D张量重塑为5D吗?

我想将(None,5,3,512)转换为(None,10,5,3,512)

1 个答案:

答案 0 :(得分:0)

from tensorflow.keras.layers import Layer

NUM_FRAMES = 16

class ReshapeLayer(Layer):
    def call(self,inputs):
        nshape = (BATCH_SIZE,NUM_FRAMES) + inputs.shape[1:]
        return tf.reshape(inputs,nshape)


inp = Input(shape = (H,W,C))
out = ReshapeLayer()(inp)

上面的代码用于将4D输入重塑为提供的5D输入,该4D输入包含BATCH_SIZE x NUM_FRAMES x H x W x C个元素。

BATCH_SIZE用于模型的LSTM部分