Я пытаюсь создать пользовательский слой Keras, который состоит из переменного числа других слоев Keras. Я хочу, чтобы доступ как к сгруппированным слоям обрабатывался как один слой с входом и выходом, так и к отдельным подуровням.
Мне просто интересно, что такое "правильный" метод для выполнения этой формы абстракции слоя в Keras?
Я не уверен, следует ли это делать через API слоев Keras или я могу работать с областями имен и переносом слоев в функции, а затем выбирать все слои в некоторой области имен. (например, model.get_layer('custom1/*')
, но я не думаю, что это работает, и name_scope, кажется, не применяется к именам слоев)
Одна из других проблем, связанных с использованием слоев Keras для этого, заключается в том, что вам необходимо назначить дочерние переменные в качестве прямых атрибутов (я предполагаю, что он использует API дескриптора) для класса, чтобы можно было добавить обучаемые веса в модель (которая сложнее, когда у нас нет фиксированного количества слоев, что означает, что нам нужно что-то взломать вместе с setattr()
, что, ew).
Кстати, это не мой настоящий код, а упрощенное упрощение того, чего я пытаюсь достичь.
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