2017-10-11 71 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的梯度流动的方法创建一个小的要旨。