Keras 如何开发适用于任意大小输入的图层

Keras 如何开发适用于任意大小输入的图层,keras,Keras,我正在尝试在Keras中开发一个层,它可以处理3D张量。为了使它更灵活,我希望尽可能推迟依赖于输入的精确形状的代码 我的图层覆盖了5种方法: from tensorflow.python.keras.layers import Layer class MyLayer(Layer): def __init__(self, **kwargs): pass def build(self, input_shape): pass def cal

我正在尝试在Keras中开发一个层,它可以处理3D张量。为了使它更灵活,我希望尽可能推迟依赖于输入的精确形状的代码

我的图层覆盖了5种方法:

from tensorflow.python.keras.layers import Layer

class MyLayer(Layer):
    def __init__(self, **kwargs):
        pass

    def build(self, input_shape):
        pass

    def call(self, inputs, verbose=False):
        second_dim = K.int_shape(inputs)[-2]
        # Do something with the second_dim

    def compute_output_shape(self, input_shape):
        pass

    def get_config(self):
        pass
我使用的这个图层是这样的:

input = Input(batch_shape=(None, None, 128), name='input')
x = MyLayer(name='my_layer')(input)
model = Model(input, x)

但是我面临一个错误,因为
第二个dim
None
。我如何开发一个依赖于输入维度的层,但它由实际数据而不是输入层提供是可以的?

我最后以不同的方式问了同样的问题,我得到了一个完美的答案:

其要点是,不要直接处理尺寸。通过引用而不是通过值来使用它们。因此,不要使用
K.int\u shape
,而是使用
K.shape
。并使用Keras操作组合并生成新形状:

shape = K.shape(x)
newShape = K.concatenate([
                             shape[0:1], 
                             shape[1:2] * shape[2:3],
                             shape[3:4]
                         ])

最后我以不同的方式问了同一个问题,我得到了一个完美的答案:

其要点是,不要直接处理尺寸。通过引用而不是通过值来使用它们。因此,不要使用
K.int\u shape
,而是使用
K.shape
。并使用Keras操作组合并生成新形状:

shape = K.shape(x)
newShape = K.concatenate([
                             shape[0:1], 
                             shape[1:2] * shape[2:3],
                             shape[3:4]
                         ])

我不是肋骨层专家,但我认为你需要分别将
super(MyLayer,self)
super(MyLayer,self)
build(input_shape)
添加到
init(MyLayer,self)
。可能值得一试。@Lafayette谢谢,但这只是一个模式,不是实际的代码。我的代码中确实有它们,我只是不想让这篇文章太长。我不是costum层的专家,但我认为你需要分别添加
super(MyLayer,self)。\uuuu init\uuugs(**kwargs)
super(MyLayer,self)。build(input\u shape)
\uu init\uuu
build
。可能值得一试。@Lafayette谢谢,但这只是一个模式,不是实际的代码。我的代码中确实有它们,我只是不想把这篇文章写得太长。