我正在研究内部使用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)

最佳答案

np.digitize方法等效的方法在TensorFlow中称为bucketize,引自this api doc


  根据“边界”对“输入”进行存储桶化。
  
  摘要
  
  例如,如果输入是边界= [0,10,100]输入= [[-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

09-07 02:25