Хорошо, у меня есть решение, но я не уверен, что это лучшее ..:
from sklearn import preprocessing #for LAbelEncoder
labels_list = [x[1] for x in labels.items()] #get the list of all sequences
def convert(list):
res = int("".join(map(str, list)))
return res
label_int = [convert(i) for i in labels_list] #Convert each sequence to int
print(label_int) #E.g : [1,2,3] become 123
le = preprocessing.LabelEncoder()
le.fit(label_int)
labels = le.classes_ #Encode each int to only get the uniques
print(labels)
d = dict([(y,x) for x,y in enumerate(labels)]) #map each unique sequence to an label like 0, 1, 2, 3 ...
print(d)
labels_encoded = [d[i] for i in label_int] #get all the sequence and encode them with label obtained
print(labels_encoded)
labels_encoded = to_categorical(labels_encoded) #encode to_cagetorical
print(labels_encoded)
Это не совсем чисто, я думаю, но оно работает
Вам нужно изменить ваш последний плотный слой имеет количество нейронов, равное длине последовательностей label_encoded.
Для прогнозов у вас будет диктант "d", который отображает прогнозируемое значение в ваш стиль оригинальной последовательности.
Скажите, если вам нужны пояснения!
Для несколько тестовых последовательностей, это дает вам:
labels = {'id-0': [1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
'id-1': [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
'id-2': [0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
'id-3': [1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
'id-4': [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]}
[100100001100000001011, 10100001100000000001, 100001100010000001, 100100001100000001011, 10100001100000000001]
[100001100010000001 10100001100000000001 100100001100000001011]
{100001100010000001: 0, 10100001100000000001: 1, 100100001100000001011: 2}
[2, 1, 0, 2, 1]
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]
[0. 1. 0.]]
РЕДАКТИРОВАТЬ после уточнения:
Хорошо, я прочитал еще немного о предмете, еще раз проблема softmax
в том, что он будет попытайтесь максимизировать класс, в то время как минимизируйте другие.
Так что я бы посоветовал сохранить ваши массивы из 21 единиц и нулей, но вместо использования Softmax
используйте Sigmoid
(для прогнозирования вероятности между 0 и 1 для каждого класса ) с binary_crossentropy
.
И используйте порог для своих прогнозов:
preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
Держите меня в курсе результатов!