Как создать компонуемые слои Keras при сохранении доступа к дочерним слоям? - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь создать пользовательский слой 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...