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