Использование метрики отзыва с переменной class_id для mask_zero=True для слоя встраивания

#python #tensorflow #keras #tensorflow2.0

Вопрос:

Я не могу понять, как использовать tensorflow.keras.metrics.Recall параметр class_id=1 при настройке mask_zero=True на слое встраивания.

Когда я пытаюсь использовать этот параметр, я получаю следующую ошибку:

 ValueError: weights can not be broadcast to values. values.rank=2. weights.rank=3. values.shape=(None, 5). weights.shape=(None, 5, 1).
 

Проблема, по-видимому, заключается в том, что при установке mask_zero=True на слой встраивания в тензор конечных весов добавляется дополнительное измерение размером 1. Recall(class_id=1) ожидается, что конечное измерение будет иметь тот же размер, что и количество классов (источник).

Вот воспроизведение этого вопроса

 import numpy as np
from tensorflow import keras
from tensorflow.keras import layers, optimizers, losses, metrics

EMBEDDING_SIZE = 4
VOCAB_SIZE = 3
N_EPOCHS = 5
N_CLASSES = 2

def get_data():
    X = np.asarray([
        [1, 2, 3, 0, 0],
        [3, 1, 0, 0, 0],
        [2, 2, 2, 2, 2]
    ])

    Y = np.eye(N_CLASSES)[np.random.choice(N_CLASSES, X.shape)].astype(np.int32)
    return X, Y

def mask_test():
    X, Y = get_data()
    input_length = X.shape[1]
    inputs = keras.Input((input_length,))
    embed = layers.Embedding(VOCAB_SIZE   1, EMBEDDING_SIZE, input_length=input_length, trainable=True, mask_zero=True)(inputs)
    lstm = layers.LSTM(EMBEDDING_SIZE, return_sequences=True)(embed)
    outputs = layers.Dense(2, activation='softmax')(lstm)
    model = keras.Model(inputs=inputs, outputs=outputs)
    
    # this doesn't work but [metrics.Recall()] does
    model_metrics = [metrics.Recall(class_id=1)]

    model.compile(optimizer=optimizers.Adam(), loss=losses.BinaryCrossentropy(from_logits=False), metrics=model_metrics)
    model.fit(X, Y, epochs=N_EPOCHS)

if __name__ == "__main__":
    mask_test()