2017-02-05 6 views
1

Я создаю пользовательскую целевую функцию для моей модели tflearn. Целевая функция сложна и требует от меня повторения прогнозируемых и правильных выходов и добавления определенных частей, не основанных на индексе. Я не могу найти способ заставить его работать с тензорным типом данных.Tflearn Custom Objective function

Я закодировал версию, используя стандартные списки ниже.

errorBuild = 0 
errorCheck = 0 
def CustomLoss(y_pred, y_true): 
    for value, index in enumerate(y_true): 
     if y_true[index] == 0: 
      errorBuild += y_pred[index] 
     else: 
      errorBuild += y_pred[index] - y_true[index] 
      errorCheck += math.abs(errorBuild) 

    return errorCheck 

Кажется, что нет возможности пробивать отдельные значения тензора. Должен ли я создавать новый сеанс в целевой функции и оценивать тензор?

Спасибо за помощь заранее

+0

В идеале вы бы векторизации потери (возможно, с участием [cumsum] (https://www.tensorflow.org/api_docs/python/math_ops/scan# cumsum) и tf.abs (y_pred [1:] - y_true)). Если это невозможно, я бы посмотрел на конструкции [TensorFlow looping] (https://www.tensorflow.org/api_docs/python/functional_ops/higher_order_operators). –

ответ

0

Вы можете добавить любую новую функцию потерь для tflearn/objectives.py файла (https://github.com/tflearn/tflearn/blob/master/tflearn/objectives.py). Чтобы использовать его, вам просто нужно вызвать его имя в слое регрессии.

def my_own_Loss(y_pred, y_true): 
    for value, index in enumerate(y_true): 
     if y_true[index] == 0: 
      errorBuild += y_pred[index] 
     else: 
      errorBuild += y_pred[index] - y_true[index] 
      errorCheck += math.abs(errorBuild) 

    return errorCheck 

, а затем вызвать его:

net = tflearn.regression(net, optimizer='momentum', 
         loss='my_own_Loss', 
         learning_rate=0.1)