Возьмите точность n вывода с высокой вероятностью из модели Keras Lstm - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть модель Lstm для прогнозирования последовательности, которая показана здесь:

def create_model(max_sequence_len, total_words):
    input_len = max_sequence_len - 1
    model = keras.models.Sequential()
    model.add(layers.Embedding(total_words, 50, input_length=input_len))
    model.add(layers.LSTM(50, input_shape=predictors[:1].shape))
    model.add(layers.Dropout(0.2))
    model.add(layers.Dense(activation='softmax', units = total_words))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'], lr=0.01)  
    return model

model_sb = create_model(max_sequence_len, total_words)

history = model_sb.fit(X_train, y_train, epochs = 20 , shuffle = True, validation_split=0.3, )

и это работает хорошо, но я хочу взять 2 вывода из моей модели, которые с большей вероятностью выводятся в плотном слое softmax. чтобы взять их я могу использовать этот код:

predicted = model_sb.predict(test_sequence, verbose=1) 

А затем по этому коду найдите первый n вывод с высокой вероятностью:

y_sum = predicted.sum(axis=0)
ind = np.argpartition(y_sum, -n)[-n:]
ind[np.argsort(y_sum[ind])]

Но мне нужно знать точность моей модели, если на выходе будет один из этих n выходных данных (с условием "или") Есть ли пакет, который мне поможет? Я имею в виду, что я не хочу оценивать мою модель только с одним выходом с наибольшей вероятностью, я хочу оценить точность и потерю по результату с высокой вероятностью 2.

1 Ответ

1 голос
/ 22 апреля 2019

Это называется точностью top-k, с k = 2 в вашем случае. У Keras уже есть реализация этой точности:

from keras.metrics import top_k_categorical_accuracy

def my_acc(y_true, y_pred):
    return top_k_categorical_accuracy(y_true, y_pred, k=2)

Затем вы передаете эту пользовательскую метрику своей модели:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=[my_acc]) 
...