¿Cómo se utiliza correctamente la capa de inserción de Keras?
He escrito el siguiente modelo Keras TensorFlow de entrada múltiple:
CHARPROTLEN = 25 #tamaño del vocabulario
CHARCANSMILEN = 62 #tamaño del vocabulario
protein_input = Input(shape=(train_protein.shape[1:]))
compound_input = Input(shape=(train_smile.shape[1:]))
Capas de proteínas
x = Embedding(input_dim=CHARPROTLEN+1,output_dim=128, input_length=maximum_amino_acid_sequence_length) (protein_input)
x = Conv1D(filters=32, padding="valid", activation="relu", strides=1, kernel_size=4)(x)
x = Conv1D(filters=64, padding="valid", activation="relu", strides=1, kernel_size=8)(x)
x = Conv1D(filters=96, padding="valid", activation="relu", strides=1, kernel_size=12)(x)
final_protein = GlobalMaxPooling1D()(x)
Capas de compuestos
y = Embedding(input_dim=CHARCANSMILEN+1,output_dim=128, input_length=maximum_SMILES_length) (compound_input)
y = Conv1D(filters=32, padding="valid", activation="relu", strides=1, kernel_size=4)(y)
y = Conv1D(filters=64, padding="valid", activation="relu", strides=1, kernel_size=6)(y)
y = Conv1D(filters=96, padding="valid", activation="relu", strides=1, kernel_size=8)(y)
final_compound = GlobalMaxPooling1D()(y)
join = tf.keras.layers.concatenate([final_protein, final_compound], axis=-1)
x = Dense(1024, activation="relu")(join)
x = Dropout(0.1)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.1)(x)
x = Dense(512, activation='relu')(x)
predictions = Dense(1,kernel_initializer='normal')(x)
model = Model(inputs=[protein_input, compound_input], outputs=[predictions])
Las entradas tienen las siguientes formas:
train_protein.shape
TensorShape([5411, 1500, 1])
train_smile.shape
TensorShape([5411, 100, 1])
Recibo el siguiente mensaje de error:
ValueError: One of the dimensions in the output is <= 0 due to downsampling in conv1d. Consider increasing the input size. Received input shape [None, 1500, 1, 128] which would produce output shape with a zero or negative value in a dimension.
¿Se debe a que la capa “Embedding” tiene el “output_dim” incorrecto? ¿Cómo puedo corregir esto? Gracias.
davy.ai
El mensaje de error sugiere que el submuestreo en las capas Conv1D ha causado que una de las dimensiones de la salida sea cero o negativa. Esto podría deberse a que la capa
Embedding
tiene unoutput_dim
incorrecto. Una forma de corregir esto es aumentar eloutput_dim
de la capaEmbedding
. Otra forma es disminuir elkernel_size
de las capasConv1D
o aumentar el tamaño de entrada al modelo.En este caso específico, el
output_dim
de las capasEmbedding
se establece en 128, lo cual es suficiente para la mayoría de los casos. Por lo tanto, es poco probable que el error sea causado por eloutput_dim
de la capaEmbedding
.Es más probable que el error sea causado por el submuestreo en las capas
Conv1D
. Una forma de corregir esto es reducir elkernel_size
de las capasConv1D
o aumentar el tamaño de entrada al modelo. Reducir elkernel_size
significaría que la capa Conv1D realizaría un submuestreo menos severo, lo que permitiría que la forma de salida tenga una dimensión distinta de cero. Aumentar el tamaño de entrada proporcionaría más muestras para que el modelo aprenda y también reduciría la severidad del submuestreo.Otra solución para este error es agregar relleno (padding) a las capas convolucionales. Agregar relleno centrará el kernel en cada ubicación al comienzo de la dimensión de entrada, lo que puede ayudar a evitar que la forma de salida se reduzca a cero o negativa porque evitará la eliminación de una gran parte de la entrada.
En este código actualizado, se agrega
padding="same"
a cada capaConv1D
. Esto garantizará que el kernel de convolución esté centrado en cada ubicación al comienzo de la dimensión de entrada y mantenga la longitud de la salida al realizar una operación de convolución en la entrada en lugar de cambiar drásticamente la salida.