Keras 如何开发适用于任意大小输入的图层
我正在尝试在Keras中开发一个层,它可以处理3D张量。为了使它更灵活,我希望尽可能推迟依赖于输入的精确形状的代码 我的图层覆盖了5种方法: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
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谢谢,但这只是一个模式,不是实际的代码。我的代码中确实有它们,我只是不想把这篇文章写得太长。