TypeError: объект типа 'Tensor' не имеет len () при использовании пользовательской метрики в Tensorflow - PullRequest
0 голосов
/ 10 февраля 2019

Я разрабатываю модель для задачи классификации нескольких классов (4 класса), используя Keras с бэкэндом Tensorflow.Значения y_test имеют формат 2D:

0 1 0 0
0 0 1 0
0 0 1 0

Это функция, которую я использую для расчета сбалансированной точности:

def my_metric(targ, predict):
    val_predict = predict
    val_targ = tf.math.argmax(targ, axis=1)
    return metrics.balanced_accuracy_score(val_targ, val_predict)

А это модель:

hidden_neurons = 50
timestamps = 20
nb_features = 18

model = Sequential()

model.add(LSTM(
                units=hidden_neurons,
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.15
                #recurrent_dropout=0.2
              )
         )

model.add(TimeDistributed(Dense(units=round(timestamps/2),activation='sigmoid')))

model.add(Dense(units=hidden_neurons,
               activation='sigmoid'))


model.add(Flatten())

model.add(Dense(units=nb_classes,
               activation='softmax'))

model.compile(loss="categorical_crossentropy",
              metrics = [my_metric],
              optimizer='adadelta')

Когда я запускаю этот код, я получаю эту ошибку:

--------------------------------------------------------------------------- TypeError Traceback (последний вызов был последним) в () 30 model.compile (loss = "categoryorical_crossentropy", 31 metrics = [my_metric], # 'precision', ---> 32 optimizer = 'adadelta')

~ / anaconda3 / lib / python3.6 / site-packages / keras / engine / training.py в процессе компиляции (self, оптимизатор, потери, метрики, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, ** kwargs) 449 output_metrics = nested_metrics[i] 450 output_weighted_metrics = nested_weighted_metrics [i] -> 451 handle_metrics (output_metrics) 452 handle_metrics (output_weighted_metrics, weights = weights) 453

~ / anaconda3 / lib / python3.6 / site-packages / keras /engine / training.py в handle_metrics (метрики, веса) 418 metric_result = weighted_metric_fn (y_true, y_pred, 419 весов = весов, -> 420 mask = masks [i]) 421 422 # Добавить к self.metrics_names, self.metric_tensors,

~ / anaconda3 / lib /python3.6 / site-packages / keras / engine / training_utils.py в взвешенном (y_true, y_pred, weights, mask) 402 "" "403 # score_array имеет ndim> = 2 -> 404 score_array = fn (y_true, y_pred)405, если маска не None: 406 # Примените маску к floatX, чтобы избежать трансляции float64 в Theano

в my_metric (targ, прогнозировать) 22 val_predict = прогнозировать 23 val_targ = tf.math.argmax (targ, axis =1) ---> 24 возвращают metrics.balanced_accuracy_score (val_targ, val_predict) 25 # возврат 5 26

~ / anaconda3 / lib / python3.6 / site-packages / sklearn / metrics /ification.py в balance_accuracy_score(y_true, y_pred, sample_weight, настроенный)
1431 1432 "" "-> 1433 C = confusion_matrix (y_true, y_pred, sample_weight = sample_weight) 1434 с np.errstate (деление = 'игнорировать', недействительно = 'игнорировать'): 1435
per_class = np.diag (C) / C.sum (axis = 1)

~ / anaconda3 / lib / python3.6 / site-packages / sklearn / metrics /ification.py в confusion_matrix (y_true, y_pred, метки, sample_weight) 251 252 "" "--> 253 y_type, y_true, y_pred = _check_targets (y_true, y_pred) 254, если y_type отсутствует в ("двоичный", "мультикласс"): 255 повысить ValueError ("% s не поддерживается"% y_type)

~ / anaconda3 / lib / python3.6 / site-packages / sklearn / metrics /ification.py в _check_targets (y_true, y_pred) 69 y_pred: массив или индикаторная матрица 70 "" "---> 71 check_consistent_length (y_true, y_pred)72 type_true = type_of_target (y_true) 73 type_pred = type_of_target (y_pred)

~ / anaconda3 / lib / python3.6 / site-packages / sklearn / utils / validation.py в файле check_consistent_length (* массивы) 229 "«230 -> 231 length = [_num_samples (X) для X в массивах, если X не None] 232 uniques = np.unique (length) 233, если len (uniques)> 1:

~ / anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py в (.0) 229 "" "230 -> 231 длины = [_num_sдостаточно (X) для X в массивах, если X не None] 232 unique = np.unique (length) 233, если len (unique)> 1:

~ / anaconda3 / lib / python3.6 / site-packages / sklearn / utils / validation.py в _num_samples (x) 146 return x.shape [0] 147 else: -> 148 return len (x) 149иначе: 150 return len (x)

TypeError: объект типа 'Tensor' не имеет len ()

1 Ответ

0 голосов
/ 10 февраля 2019

Вы не можете вызвать функцию sklearn для тензора Кераса.Вам нужно будет реализовать эту функциональность самостоятельно, используя бэкэнд-функции Keras или функции TensorFlow, если вы используете бэкэнд TF.

balanced_accuracy_score определяется как как среднее значение отзыва , полученного в каждом столбце.Проверьте эту ссылку для реализации точности и отзыва.Что касается balanced_accuracy_score, вы можете реализовать его следующим образом:

import keras.backend as K

def balanced_recall(y_true, y_pred):
    """
    Computes the average per-column recall metric
    for a multi-class classification problem
    """ 
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)), axis=0)  
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)), axis=0)   
    recall = true_positives / (possible_positives + K.epsilon())    
    balanced_recall = K.mean(recall)
    return balanced_recall
...