Estoy intentando realizar Conv1D en múltiples entradas en mi modelo. Entonces tengo 15 entradas de tamaño 1x1500 cada una, donde cada una es una entrada a una serie de capas. Entonces, tengo 15 modelos convolucionales que quiero fusionar antes de la capa completamente conectada. He definido el modelo convolucional en una función, pero no puedo entender cómo llamar a la función y luego fusionarlas.

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))

He concatenado con éxito 4 modelos de la siguiente manera:

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)

¿Cómo lo hago para 15 capas en el bucle for ya que escribir 15 capas por separado no es eficiente?

2
Gala 17 oct. 2018 a las 09:20

2 respuestas

La mejor respuesta

Creo que lo mejor que puedes hacer es usar la API funcional en todas partes:

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 )

Entonces es fácil recuperar las listas de entradas y salidas de los submodelos y fusionarlos

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)

Normalmente, estas operaciones no son un cuello de botella. Nada de esto debería tener un impacto importante durante el entrenamiento o la inferencia

1
Gabriel M 17 oct. 2018 a las 07:13

Por supuesto, como sugirió @GabrielM, el uso de API funcional es la mejor manera de hacerlo, sin embargo, si no desea modificar la función define_model, también puede hacerlo así:

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)
2
today 17 oct. 2018 a las 09:56