我正在开发一个内部使用numpy.digitize()
的自定义丢失函数。对于作为数字化方法中使用的bins
值的一组参数,损失最小化。为了使用tensorflow
优化工具,我想知道digitize
中是否有tensorflow
的等效实现?如果没有,有一个很好的方法来实施解决方法?
这是一个numpy版本:
def fom_func(b, n):
np.where((b > 0) & (n > 0), np.sqrt(2*(n*np.log(np.divide(n,b)) + b - n)),0)
def loss(param, X, y):
param = np.sort(np.asarray(param))
nbins = param.shape[0]
score = 0
y_pred = np.digitize(X, param)
for c in np.arange(nbins):
b = np.where((y==0) & (y_pred==c), 1, 0).sum()
n = np.where((y_pred==c), 1, 0).sum()
score += fom_func(b,n)**2
return -np.sqrt(score)
答案 0 :(得分:2)
相当于np.digitize
方法在TensorFlow中称为bucketize
,引自this api doc:
Bucketizes'输入'基于'边界'。
摘要
例如,如果输入是边界= [0,10,100] input = [[-5,10000] [150,10] [5,100]]
然后输出将输出= [[0,3] [3,2] [1,3]]
参数:
范围:Scope对象 输入:任何形状的Tensor都包含int或float类型。 边界:浮动的排序列表给出了桶的边界。 返回:
输出:与'输入相同的形状,输入的每个值都用铲斗索引替换 (numpy)相当于np.digitize。
我不知道为什么,但是这个方法隐藏在TensorFlow中(参见hidden_ops.txt file)。因此,即使你可以通过以下方式导入它,我也不会指望它:
from tensorflow.python.ops import math_ops
math_ops._bucketize