es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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 un output_dim incorrecto. Una forma de corregir esto es aumentar el output_dim de la capa Embedding. Otra forma es disminuir el kernel_size de las capas Conv1D o aumentar el tamaño de entrada al modelo.

    En este caso específico, el output_dim de las capas Embedding 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 el output_dim de la capa Embedding.

    Es más probable que el error sea causado por el submuestreo en las capas Conv1D. Una forma de corregir esto es reducir el kernel_size de las capas Conv1D o aumentar el tamaño de entrada al modelo. Reducir el kernel_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.

    # capas proteína
    x = Embedding(input_dim=CHARPROTLEN+1, output_dim=128, input_length=maximum_amino_acid_sequence_length)(protein_input)
    x = Conv1D(filters=32, padding="same", activation="relu", strides=1, kernel_size=4)(x)
    x = Conv1D(filters=64, padding="same", activation="relu", strides=1, kernel_size=8)(x)
    x = Conv1D(filters=96, padding="same", activation="relu", strides=1, kernel_size=12)(x)
    final_protein = GlobalMaxPooling1D()(x)
    
    # capas compuesto
    y = Embedding(input_dim=CHARCANSMILEN+1, output_dim=128, input_length=maximum_SMILES_length)(compound_input)
    y = Conv1D(filters=32, padding="same", activation="relu", strides=1, kernel_size=4)(y)
    y = Conv1D(filters=64, padding="same", activation="relu", strides=1, kernel_size=6)(y)
    y = Conv1D(filters=96, padding="same", activation="relu", strides=1, kernel_size=8)(y)
    final_compound = GlobalMaxPooling1D()(y)
    

    En este código actualizado, se agrega padding="same" a cada capa Conv1D. 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.

Comments are closed.