我正在尝试创建一个自定义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