将任意长度的列表传递到自定义图层的巧妙方法

时间:2019-01-26 16:52:09

标签: python tensorflow keras

我必须在Keras中建立一种特殊的神经网络,该神经网络在层的某个点接受具有N行和每行5个元素的多维数组。让我们将此多维数组称为 bboxes bboxes 如下:

[[  0, x1, x2, y1, y2] # row 0
 ...
 [  0, x1, x2, y1, y2]] # row N

因此,如您所见,行数是不确定的。我们所知道的是它是一个充满行的数组,其中每行包含 5 个整数。

因此,我可以为 bboxes 创建以下输入:

from keras.layers import Input

bboxes = Input(shape=(None, 5), dtype='int32', name='bboxes')

问题:

我必须将 bboxes 传递到名为 MyLayer 的自定义图层,在某些调用方法中,该图层需要获取 bboxes 中的行数>:

from keras.engine.topology import Layer

class MyLayer(Layer):
    def __init__(self):
        ...
    ...

    def call(x):
        ...
        N = x.shape[0]  # Get amount of rows (N) of bboxes
        ...
    ...

但是,您可能已经知道,Keras具有一种特定类型的体系结构,该体系结构首先由空的形状对象定义。

在编译模型后传递实际的整数N值。因此,它返回N而不是整数?,它基本上是一个空张量...

但是N = x.shape[0]作为整数的变量对于MyLayer正常工作很重要。我可能会做类似range(0, N)的操作,它将返回以下错误:

  

TypeError:int应该返回int对象

当涉及到此类问题时,我对Keras功能API感到非常困惑。我可以通过任何巧妙的方式将具有任意定义的行数(bboxes)的数组N传递到MyLayer,以后再使用N的实际值吗?

简而言之,我如何将形状为(N,5)的输入传递给图层,以便该图层知道N的确切数量?

如果有任何解决方法,我将不胜感激。谢谢!

0 个答案:

没有答案