如何在保持对子层访问的同时创建可组合的Keras层?

时间:2019-07-10 16:55:35

标签: python tensorflow keras

我正在尝试创建一个自定义Keras图层,该图层由可变数量的其他Keras图层组成。我想访问被视为具有输入和输出的单个层的分组层,以及访问各个子层。

我只是想知道,在Keras中执行这种形式的层抽象的“适当”方法是什么?

我不确定这是否应该通过Keras的Layer API来完成,或者我是否可以使用名称范围并在函数中包装图层,然后选择某个名称范围下的所有图层。 (例如model.get_layer('custom1/*'),但我认为这不起作用,并且name_scope似乎不适用于图层名称)

为此,使用Keras Layers的另一个问题是您需要将子变量作为直接属性(我假设它使用了描述符API)分配给类,以便将可训练的权重添加到模型(当我们没有固定数量的层时,这会更混乱,这意味着我们需要与setattr()一起砍东西)

顺便说一句,这不是我的实际代码,但这是我要完成的工作的准系统简化。

class CustomLayer(Layer):
    def __init__(self, *a, n_layers=2, **kw):
        self.n_layers = n_layers
        super().__init__(*a, **kw)

    def call(self, x):
        for i in range(self.n_layers):
            x = Dense(64, activation='relu')(x)
            x = Dropout(0.2)(x)
        return x

input_shape, n_classes = (None, 100), 10
x = input = Input(input_shape)
x = CustomLayer()(x)
x = CustomLayer()(x)
x = Dense(n_classes, activation='softmax')(x)

model = Model([input], [x])

'''

So this works fine

'''

print([l.name for l in model.layers])
print(model.layers[1].name)
print(model.layers[1].output)

# Output: ['input', 'custom_1', 'custom_2', 'dense']
# Output: 'custom_1'
# Output: the custom_1 output tensor

'''

But I'm not sure how to do something to the effect of this ...

'''

print(model.layers[1].layers[0].name)
print(model.layers[1].layers[0].output)

# Output: custom_1/dense
# Output: custom_1/dense output tensor

0 个答案:

没有答案