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.

Excepción encontrada al llamar la capa “peso_de_atención” (tipo Atención)

Soy un traductor de documentos de TI que traduce al español. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy nuevo en el uso de “atención”. Mi forma de entrada por muestra es de forma (6,128). No logro entender cuál podría ser la solución.

El código de error se presenta a continuación. Por favor ayúdame a resolver el problema. Sólo un poco de información adicional. Estoy tratando de agregar la capa de atención a un mapa de características concatenando las características de un modelo CNN y un modelo LSTM.

“`
Valor de error Rastro de pila (traceback) más reciente.
<ipython-input-20-ddc4e6d2fec2> en <module>()
—-> 1 model = MLSTM<em>FCN((X</em>train.shape[1], X<em>train.shape[2]), train</em>label.shape[1])

2 frames
<ipython-input-19-ac6ce541a216> in MLSTM<em>FCN(shape, num</em>classes)
19 y = GlobalAveragePooling1D()(y)
20 x = concatenate([x,y])
—> 21 x = keras.layers.Attention(name='attention_weight')(x)
22 out = Dense(numclasses, activation='softmax')(x)
23 model = Model(ip, out)

/usr/local/lib/python3.7/dist-packages/keras/utils/traceback<em>utils.py in error</em>handler(<em>args, **kwargs)
65 except Exception as e: # pylint: disable=broad-except
66 filtered<em>tb = _process</em>traceback<em>frames(e.<strong>traceback</strong>)
—> 67 raise e.with</em>traceback(filtered<em>tb) from None
68 finally:
69 del filtered</em>tb

/usr/local/lib/python3.7/dist-packages/keras/layers/dense<em>attention.py in _validate</em>call<em>args(self, inputs, mask)
186 if not isinstance(inputs, list):
187 raise ValueError(
–> 188 f'{class</em>name} layer must be called on a list of inputs, '
189 'namely [query, value] or [query, value, key]. '
190 f'Received: {inputs}.')

Valor de error: Se encontró una excepción al llamar a la capa "attention_weight" (tipo Atención).

La capa Atención debe ser llamada en una lista de entradas, es decir, [query, value] o [query, value, key]. Recibido: Tensor("Placeholder:0", shape=(None, 520), dtype=float32).

Argumentos de llamada recibidos:
• inputs=tf.Tensor(shape=(None, 520), dtype=float32)
• mask=None
• training=None
• return<em>attention</em>scores=False
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error sugiere que la capa de atención debe ser invocada en una lista de entradas, específicamente [query, value] o [query, value, key], pero que se está invocando en un solo tensor. Esto se debe a que concatenamos la salida de las capas LSTM y CNN antes de pasarla a la capa de atención, y esta última espera dos entradas separadas.

    Para resolver este error, necesitamos separar el tensor concatenado en dos tensores separados antes de pasarlos a la capa de atención. Podemos hacer esto utilizando la capa Lambda de Keras junto con operaciones de slicing. Aquí está el código modificado:

    from keras.layers import Lambda
    
    def MLSTM_FCN(shape, num_classes):
        x = Input(shape=(6, 128))
        ip = x
        x = Masking()(ip)
        x = LSTM(units=8)(x)
        x = Dropout(0.8)(x)
        y = Permute((2, 1))(ip)
        y = Conv1D(32, 3, padding='same', kernel_initializer='he_uniform')(y)
        y = BatchNormalization()(y)
        y = Activation('relu')(y)
        y = squeeze_excite_block(y)
        y = Conv1D(512, 3, padding='same', kernel_initializer='he_uniform')(y)
        y = BatchNormalization()(y)
        y = Activation('relu')(y)
        y = squeeze_excite_block(y)
        y = Conv1D(512, 9, padding='same', kernel_initializer='he_uniform')(y)
        y = BatchNormalization()(y)
        y = Activation('relu')(y)
        y = GlobalAveragePooling1D()(y)
        x = concatenate([x,y])
        x = Lambda(lambda x: [x[:,:8], x[:,8:]])(x) # dividir en dos tensores
        x = keras.layers.Attention(name='attention_weight')(x)
        x = Flatten()(x)
        out = Dense(num_classes, activation='softmax')(x)
        model = Model(ip, out)
        model.compile(optimizer="adam", loss="categorical_crossentropy",metrics=['accuracy','AUC','Recall'])
        model.summary()
    
        return model
    

    Utilizamos la capa Lambda con una función lambda para dividir el tensor concatenado en dos tensores, siendo el primer tensor la salida de la capa LSTM y el segundo tensor la salida de la capa CNN. Luego pasamos estos dos tensores a la capa de atención utilizando una lista. Finalmente, aplanamos el tensor de salida de la capa de atención antes de pasarlo a la capa Dense de salida.

Comments are closed.