Как вернуть значение тензора из функции в TensorFlow? - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над проектом глубокого обучения в Керасе и реализовал функцию чувствительности с помощью бэкэнда TensorFlow, поскольку это необходимо, если я хочу оценить модель, используя ее. Однако я не могу извлечь значение из тензора. Я хочу вернуть его, чтобы я мог использовать значения в других функциях. В идеале возвращаемое значение должно быть int. Всякий раз, когда я оцениваю функцию, я просто получаю сам тензорный объект, а не его реальное значение.

Я пытался создать сеанс и оценить, но безрезультатно. Таким образом, я могу напечатать значение очень хорошо, но я не могу присвоить значение другой переменной.

def calculate_tp(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'))

    """with tf.Session() as sess:
    TP = TP.eval()
    FP = FP.eval()
    FN = FN.eval()
    FP = FP.eval()
    print(TP, FP, TN, FN)
    #sess.run(FP)"""
    return TP / (TP + FN)

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Хорошо, так может быть, потому что в ваших попытках TP всегда 0?

Если я попробую это:

y = np.array([0, 0, 0, 0, 0, 1, 1, 1 ,1 ,1])
y_pred = np.array([0.01, 0.005, 0.5, 0.09, 0.56, 0.999, 0.89, 0.987 ,0.899 ,1])

def calculate_tp(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'))

        TP = TP.eval(session=tf.Session())
        FP = FP.eval(session=tf.Session())
        TN = TN.eval(session=tf.Session())
        FN = FN.eval(session=tf.Session())
        print(TP, FP, TN, FN)

    results = TP / (TP + FN)

    return results

res = calculate_tp(y, y_pred)
print(res) 

#Outputs : 
#0 5 5 5
#1 9 9 9
#1 9 9 9
#1 9 9 9
#1 9 9 9
#0.1

Это даст мне число с плавающей запятой, как вы хотите.

Это помогает?

0 голосов
/ 25 марта 2019

Если я хорошо понимаю вашу проблему, вы можете просто создать новый тензор со значениями obtened.

Например:

tensor = tf.constant([5, 5, 8, 6, 10, 1, 2])
tensor_value = tensor.eval(session=tf.Session())
print(tensor_value) #get [ 5  5  8  6 10  1  2]
new_tensor = tf.constant(tensor_value)
print(new_tensor) #get Tensor("Const_25:0", shape=(7,), dtype=int32)

Надеюсь, я помог!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...