Можно ли вручную вставить входной нейрон в скрытый слой в Керасе? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть CNN, и я хочу добавить дополнительную информацию в один из последних уровней.

Вот упрощенная версия кода. Следите за комментариями

def define_model():
    model = Sequential()
    model.add(Conv2D(32, (3,3))
    model.add(Conv2D(32, (3,3))
    model.add(MaxPooling2D((2,2))
    model.add(Conv2D(64, (3,3))
    model.add(Conv2D(64, (3,3))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    # this next layer is where I want to sneak the neuron(s) in
    model.add(Dense(1024))
    model.add(Dropout(rate=0.4))
    model.add(Dense(168))
    model.compile()
    return model

Итак, у меня есть дополнительная информация о входном изображении, которая может помочь сети. Думайте об этом как о ключе, который может или не может заслуживать разумного количества взвешивания.

Ключ находится в форме целого числа, которое технически находится в [0, inf), но практически вероятно в [0, 20].

Итак, мои вопросы:

  1. Как правильно представить эту подсказку, говоря с точки зрения архитектуры NN в целом.

  2. Как настроить модель Keras, чтобы это происходило на практике?

  3. Бонус: если бы я хотел, мог ли я предотвратить последующее выбытие из когда-нибудь пропускал эту добавленную функцию?

1 Ответ

1 голос
/ 20 февраля 2020

Это может работать с использованием функционального API Keras:

def define_model():
    inputs = Input(input_shape=(...))
    hints = Input(input_shape=(...))

    x = Conv2D(32, (3,3))(inputs)
    x = Conv2D(32, (3,3))(x)
    x = MaxPooling2D((2,2))(x)
    x = Conv2D(64, (3,3))(x)
    x = Conv2D(64, (3,3))(x)
    x = MaxPooling2D((2,2))(x)
    x = Flatten()(x)

    x = Add()([x, hints])

    x = Dense(1024)(x)
    x = Dropout(rate=0.4)(x)
    outputs = Dense(168)(x)

    model = Model([inputs, hints], outputs)

    model.compile()
    return model

Я не знаю, как защитить его от выпадения с помощью Keras.

...