использование python keras для вычисления потерь Хэмминга

#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 функции