Объединить несколько CNN - PullRequest
       24

Объединить несколько CNN

0 голосов
/ 17 октября 2018

Я пытаюсь выполнить Conv1D на нескольких входах в моей модели.Таким образом, у меня есть 15 входов размером 1х1500 каждый, где каждый является входом для ряда слоев.Итак, у меня есть 15 сверточных моделей, которые я хочу объединить перед Fully Connected Layer.Я определил сверточную модель в функции, но не могу понять, как вызвать функцию и затем объединить их.

def defineModel(nkernels, nstrides, dropout, input_shape):
    model = Sequential()
    model.add(Conv1D(nkernels, nstrides, activation='relu', input_shape=input_shape))
    model.add(Conv1D(nkernels*2, nstrides, activation='relu'))
    model.add(BatchNormalization())
    model.add(MaxPooling1D(nstrides))
    model.add(Dropout(dropout))
    return model


models = {}
for i in range(15):
    models[i] = defineModel(64,2,0.75,(64,1))

Я успешно объединил 4 модели следующим образом:

merged = Concatenate()([ model1.output, model2.output, model3.output, model4.output])

merged = Dense(512, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(1024, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(40, activation='softmax')(merged)
model = Model(inputs=[model1.input, model2.input, model3.input, model4.input], outputs=merged)

Как мне сделать это для 15 слоев в цикле for, так как написание 15 слоев отдельно не эффективно?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Конечно, как предложил @GabrielM, использование функционального API - лучший способ сделать это, однако, если вы не хотите изменять функцию define_model, вы также можете сделать это следующим образом:

models = []
inputs = []
outputs = []
for i in range(15):
    model = defineModel(64,2,0.75,(64,1))
    models.append(model)
    inputs.append(model.input)
    outputs.append(model.output)


merged = Concatenate()(outputs) # this should be output tensors and not models

# the rest is the same ...

model = Model(inputs=inputs, outputs=merged)
0 голосов
/ 17 октября 2018

Я думаю, что лучшее, что вы можете сделать, это использовать функциональный API везде:

def defineModel(nkernels, nstrides, dropout, input_shape):
    l_input = Input( shape=input_shape )
    model = Conv1D(nkernels, nstrides, activation='relu')(l_input)
    model = Conv1D(nkernels*2, nstrides, activation='relu')(model)
    model = BatchNormalization()(model)
    model = MaxPooling1D(nstrides)(model)
    model = Dropout(dropout)(model)
    return model, l_input


models = []
inputs = []
for i in range(15):
    model, input = defineModel(64,2,0.75,(64,1))
    models.append( model )
    inputs.append( input )

Тогда легко восстановить списки входов и выходов подмоделей и объединить их

merged = Concatenate()(models)

merged = Dense(512, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(1024, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(40, activation='softmax')(merged)
model = Model(inputs=inputs, outputs=merged)

Обычно эти операции не являются бутылочным горлышком.Ничто из этого не должно оказывать существенного влияния во время обучения или умозаключения

...