2017-10-11 105 views
0

我希望最小化/最大化F1分數,Precision,Recall和我的自定義指標等指標。還有就是我的指標和優化代碼:如何爲Tensorflow優化器創建自定義指標?

def my_metric(logits, labels): 
    predicted = tf.argmax(logits, 1) 
    actual = tf.argmax(labels, 1) 

    NS = tf.count_nonzero(actual) 
    NR = tf.reduce_sum(tf.cast(tf.equal(actual, 0), tf.float32)) 
    TP = tf.reduce_sum(tf.cast(tf.equal(actual+predicted, 0), tf.float32)) 
    FP = tf.reduce_sum(tf.cast(tf.equal(actual*(1-predicted), 1), tf.float32)) 
    TN = tf.reduce_sum(tf.cast(tf.equal(actual+predicted, 2), tf.float32)) 
    FN = tf.reduce_sum(tf.cast(tf.equal(actual+(1-predicted), 0), tf.float32)) 
    ''' 
    Precision = TP/TP + FP 
    Recall = TP/TP + FN 
    b = 0.5 
    denom = (1.0 + b**2) * TP + FN*b**2 + FP 
    Fb = (1.0 + b**2) * TP/denom 
    ''' 
    Metric = (TP/NR) - (FP/NS) 

    return Metric 


def training(metric, learning_rate): 
    optimizer = tf.train.AdamOptimizer(learning_rate) 
    train_op = optimizer.minimize(metric) 
    return train_op 

當我嘗試儘量減少任何指標,我得到這樣的錯誤:

ValueError: No gradients provided for any variable, check your graph for ops that do not support gradients, between variables [...] and loss Tensor("Training/Sub_3:0", shape=(), dtype=float32).

我應該做的使用一些自定義的指標,而不是損失訓練我的神經網絡功能?也許添加一些漸變定義?如何爲上述指標做到這一點?

回答

0

該指標必須與您的參數有差異。張量流法tf.equal不可區分。

如果您不確定某個操作是否可與您的參數區分開來,可以使用tf.gradients方法找出。

import tensorflow as tf 

w = tf.Variable(1, name="w", dtype=tf.float32) # parameter to optimize for 
x = tf.placeholder(shape=(), dtype=tf.float32, name="x") # input 
op = tf.multiply(w,x) 

grads_op_wrt_w = tf.gradients(op, w) 
print(grads_op_wrt_w) 

我有其檢查操作here的梯度流動的方法創建一個小的要旨。