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