#python #tensorflow #keras #scikit-learn #multilabel-classification
#python #tensorflow #keras #scikit-learn #multilabel-классификация
Вопрос:
Я хочу рассчитать потери Хэмминга для многоуровневой классификации. Я определил некоторые пользовательские показатели модели keras следующим образом:
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy',recall_m,precision_m,custom_f1,HAMMING_LOSS])
Можно ли использовать sklearn.metrics?
from sklearn.metrics import hamming_loss
def HAMMING_LOSS(y_true, y_pred):
return hamming_loss(y_true, y_pred)
Я не могу заставить это работать
Есть ли другой способ?
Спасибо
ОБНОВЛЕНИЕ я также попробовал функцию потери Хэмминга cutom, и она все еще не работает
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list[2])
я получил ошибку
TypeError: in user code:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function *
return step_function(self, iterator)
<ipython-input-34-cf5b14c1e9f9>:160 hamming_score *
for i in range(y_true.shape[0]):
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/operators/py_builtins.py:353 range_ **
return _py_range(start_or_stop, stop, step)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/operators/py_builtins.py:378 _py_range
return range(start_or_stop)
TypeError: 'NoneType' object cannot be interpreted as an integer
Комментарии:
1. не могли бы вы сообщить о последней части вашей сети, чтобы я мог построить потери Хэмминга, совместимые с keras
2. привет @MarcoCerliani, последняя часть модели выглядит следующим образом: deep_inputs = Input(shape =(maxlen,)) embedding_layer = Встраивание (vocab_size, 100, обучаемый = False)(deep_inputs) LSTM_Layer_1 = LSTM(128)(embedding_layer) dense_layer_1 = Плотный (6, активация = ‘сигмоид’)(LSTM_Layer_1)#softplus, selu, model = Модель (входные данные = deep_inputs, выходные данные = dense_layer_1) model.compile(потеря = ‘binary_crossentropy’, оптимизатор = ‘adam’, метрики =[‘точность’, recall_m,precision_m,custom_f1,hamming_score])
3. какую ошибку вы получаете от этого
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy',recall_m,precision_m,custom_f1, hamming_loss])
, обратите внимание на нижний регистр4. привет @Kenan, я получил ошибку в функции подгонки после обратной трассировки ошибки компиляции (последний последний вызов) <ipython-input-34-cf5b14c1e9f9> в <module>() 206 print(model.metrics_names) 207 —> 208 история = model.fit(X_train, y_train, batch_size=64, epochs = 1, verbose = 1, validation_split= 0.3) 209 оценка = model.evaluate(X_test, y_test, verbose=1) 210
5. основываясь на вашем сообщении об ошибке, это выглядит как
y_true is None
в вашей пользовательскойhamming_score
функции