自定义重塑层以形状(?,?,?)返回张量

时间:2019-05-13 12:52:55

标签: tensorflow keras conv-neural-network lstm reshape

我需要一个将4D张量从形状为(None,3,3,2048)的卷积层重塑为形状为(None,9,2048)的3D Tensor的层,以供入LSTM,其中9为时间步维度的大小。

当我使用图层本身时,它可以工作,但是当我在顺序模型中使用它时,下一个图层将从我的自定义图层的输出中获取(?,?,?)为input_shape

下面您可以找到我的代码:

class Conv2LSTM(Layer):

    '''The :class:`Conv2LSTM` is a custom layer that reshapes the input tensor collapsing the width and height dimensions to a single dimension that represents the sequence accepted by the LSTM.
    '''

    def __init__(self, **kwargs):
        super(Conv2LSTM, self).__init__(**kwargs)

    def build(self, input_shape):
        self.input_spec = [InputSpec(shape=input_shape)]
        super(Conv2LSTM, self).build(input_shape)

    def call(self, x, mask=None):

        '''Overrides the :class:`keras.engine.topology.Layers` method. It collapses the second and third dimension of the tensor into a single dimension.

        :param x: input tensor
        :param mask: tensor mask
        :return: re-ordered tensor
        '''

        return K.reshape(x, (K.shape(x)[0],) + (K.shape(x)[1]*K.shape(x)[2], K.shape(x)[3]))

    def get_config(self):
        base_config = super(Conv2LSTM, self).get_config()
        return dict(list(base_config.items()))

    def compute_output_shape(self, input_shape):
        return (input_shape[0],) + (input_shape[1]*input_shape[2], input_shape[3])

如果我在图层内打印形状是正确的,如果我创建一个具有该图层的模型可以正常工作,但与连续的图层结合在一起,则返回NoneType形状的可能性如何?

1 个答案:

答案 0 :(得分:0)

由于某些原因,在其他类似问题的每个答案中,建议使用K.shape(x)来检索输入张量的形状,在这种情况下,错误是由此引起的。

K.shape(x)[i]替换为x.shape[i].value就足够了。

call的新实现是:

return K.reshape(x, (-1, x.shape[1].value * x.shape[2].value, x.shape[3].value))