объект bool не подлежит подписке - Keras - PullRequest
1 голос
/ 19 марта 2019

В настоящее время я участвую в проекте глубокого обучения, который мне нужно оценить с использованием метрик чувствительности и специфичности, которые не включены в готовые керасы.

Я реализовал функцию чувствительностиследующим образом:

from keras import backend as K

def sensitivity(y, y_pred):
    TP = 0
    FP = 0
    TN = 0
    FN = 0
    for i in range(5):
        true = (y == i)
        preds = (y_pred == i)
        print(preds)
        TP += K.sum(preds[true == 1])
        FP += K.sum(true[np.invert(preds) == 1])
        TN += K.sum(np.invert(preds)[true == 1])
        FN += K.sum(true[preds == 0])
    return TP / (TP + FN)

Это прекрасно работает само по себе.Тем не менее, когда я пытаюсь использовать его при компиляции модели, я получаю сообщение об ошибке «объект« bool »не может быть подписан».

Как обойти это?

Код для компиляции и полное сообщение об ошибке включены ниже.Спасибо!РЕДАКТИРОВАТЬ: Следуя ответу ниже и некоторым исследованиям, я смог исправить код, который я вставил внизу поста.При компиляции моделей в Keras он оценивается либо Theano, либо TensorFlow, и поэтому вы не можете использовать команды Numpy для создания собственных метрик.

from keras.datasets import mnist
from keras.applications.vgg16 import VGG16

(x_train, y_train), (x_test, y_test) = mnist.load_data()

model = VGG16(
    include_top=False,
    weights='imagenet',
    input_tensor=None,
    input_shape=None,
    pooling=None,
    classes=10)

model.compile(optimizer='rmsprop',
    loss='categorical_crossentropy',
    metrics=['accuracy', sensitivity])

TypeError                                 Traceback (most recent call last)
<ipython-input-20-46c5d210c7ea> in <module>()
     9 model.compile(optimizer='rmsprop',
     10               loss='categorical_crossentropy',
---> 11               metrics=['accuracy', sensitivity])

/home/USER/Documents/deep_learning/custom_metrics/venv/lib/python3.6/site-packages/keras/engine/training.py in compile(self, optimizer, loss, metrics, 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 

/home/USER/Documents/deep_learning/custom_metrics/venv/lib/python3.6/site-packages/keras/engine/training.py in handle_metrics(metrics, weights)
    418  metric_result = weighted_metric_fn(y_true, y_pred,
    419  weights=weights,
--> 420  mask=masks[i])
    421 
    422  # Append to self.metrics_names, self.metric_tensors,

/home/USER/Documents/deep_learning/custom_metrics/venv/lib/python3.6/site-packages/keras/engine/training_utils.py in weighted(y_true, y_pred, weights, mask)
    402  """
    403  # score_array has ndim >= 2
--> 404  score_array = fn(y_true, y_pred)
    405  if mask is not None:
    406       # Cast the mask to floatX to avoid float64 upcasting in Theano

<ipython-input-18-caa661fb93ac> in sensitivity(y, y_pred)
     11  preds = (y_pred == i)
     12  print(preds)
---> 13  TP += K.sum(preds[true == 1])
     14  FP += K.sum(true[np.invert(preds) == 1])
     15  TN += K.sum(np.invert(preds)[true == 1])

TypeError: 'bool' object is not subscriptable

def sensitivity(y, y_pred):
    TP = 0
    FP = 0
    TN = 0
    FN = 0
    for i in range(5):
        true = K.equal(y, i)
        preds = K.equal(y_pred, i)
        TP += K.sum(K.cast(tf.boolean_mask(preds, tf.math.equal(true, True)), 'int32'))
        FP += K.sum(K.cast(tf.boolean_mask(true, tf.math.equal(~preds, True)), 'int32'))
        TN += K.sum(K.cast(tf.boolean_mask(~preds, tf.math.equal(true, True)), 'int32'))
        FN += K.sum(K.cast(tf.boolean_mask(true, tf.math.equal(preds, False)), 'int32'))
    return TP / (TP + FN)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...