如何在 softmax 分数中添加阈值
Posted
技术标签:
【中文标题】如何在 softmax 分数中添加阈值【英文标题】:How to add a threshold in softmax scores 【发布时间】:2018-11-22 12:45:17 【问题描述】:在进行多分类时,通常我会得到一个 softmax 分数和下面的预测,
softmax_scores = tf.nn.softmax(logits=self.scores, dim=-1)
prediction=tf.argmax(self.scores, 1, name="predictions")
如果我得到的 softmax_socres 是[0.5,0.2,0.3]
。预测是[0]
。
现在我想将阈值0.6
添加到softmax_socres。这意味着这里预期的预测是[4]
,这意味着其他。
我做了如下
threshold=0.6
self.predictions = tf.argmax(self.scores, 1, name="predictions")
x = tf.constant([num_classes], shape=self.predictions.shape, dtype=tf.int64)
self.predictions1 =tf.where(tf.reduce_max(tf.nn.softmax(logits=self.scores, dim=-1),1)>=threshold,self.predictions,x)
得到:
File "E:\ai\wide-and-shallow cnn\text_cnn.py", line 102, in __init__
x = tf.constant([num_classes], shape=self.predictions.shape, dtype=tf.int64)
File "E:\Python\Python36\lib\site-packages\tensorflow\python\framework\constant_op.py", line 214, in constant
value, dtype=dtype, shape=shape, verify_shape=verify_shape))
File "E:\Python\Python36\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 430, in make_tensor_proto
if shape is not None and np.prod(shape, dtype=np.int64) == 0:
File "E:\Python\Python36\lib\site-packages\numpy\core\fromnumeric.py", line 2566, in prod
out=out, **kwargs)
File "E:\Python\Python36\lib\site-packages\numpy\core\_methods.py", line 35, in _prod
return umr_prod(a, axis, dtype, out, keepdims)
TypeError: __int__ returned non-int (type NoneType)
它在这个演示中有效。
import tensorflow as tf
import numpy as np
a=tf.constant(np.arange(6),shape=(3,2))
b=tf.reduce_max(a,1)
#c=tf.to_int32(a>3)
c=tf.argmax(a,1)
d=b>=3
f=tf.constant([5],shape=c.shape,dtype=tf.int64)
e=tf.where(d,c,f)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(a.eval(),b.eval(),c.eval(),d.eval(),f.eval(),e.eval())
【问题讨论】:
github.com/tensorflow/tensorflow/issues/13082 - 看看 ppwwyyxx 的回答是否有帮助。 【参考方案1】:这样怎么样,用tf.where
threshold = 0.6
softmax_scores = tf.nn.softmax(logits=self.scores, dim=-1)
other_class_idx = tf.cast(tf.shape(softmax_scores)[0] + 1, tf.int64)
other_class_idx = tf.tile( \
tf.expand_dims(other_class_idx, 0), \
[tf.shape(softmax_scores)[0]] \
)
is_other = tf.reduce_max(tf.cast(softmax_scores > threshold, tf.int8), axis=1)
predictions = tf.where( \
is_other>0, \
tf.argmax(softmax_scores, 1), \
other_class_idx \
) # 4
【讨论】:
演示有效,但在项目中无效。 ValueError:形状必须为 0 级,但对于输入形状为 [?,13]、[?,13] 的“输出/条件/开关”(操作:“开关”)为 2 级。 我假设softmax_scores
张量的形状是 [?, num_classes] 然后。我编辑了答案以反映这一点。请注意,我们现在使用 tf.where
而不是 tf.cond
谢谢!它仅在 tf.where 中没有 lambda 时有效。以上是关于如何在 softmax 分数中添加阈值的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Tensorflow 中用 Logistic 层替换 Softmax 输出层?
为什么在使用python代码的机器学习中需要输出softmax概率? [关闭]