如何为Tensorflow优化器创建自定义指标?
问题描述:
我希望最小化/最大化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).
我应该做的使用一些自定义的指标,而不是损失训练我的神经网络功能?也许添加一些渐变定义?如何为上述指标做到这一点?
答
该指标必须与您的参数有差异。张量流法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的梯度流动的方法创建一个小的要旨。