让Keras repeat_elements在自定义丢失函数

时间:2017-10-23 13:55:28

标签: tensorflow neural-network keras tensor

我正在尝试创建一个Keras自定义丢失函数(RankOpt,来自http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.2.3727&rep=rep1&type=pdf

这是一个二元分类丢失函数,用于错误观察严重超重的情况; y_true中会有几个和一堆零。长话短说,我想将y_true为1的preds提取到一个向量中,然后重复该向量,直到结果与y_true为零的preds一样长。

这将给出2个相等长度的向量(ok,1d张量),长度等于y_true中的零个数,然后我成对处理。左手向量/张量由预测组成,这些预测实际上是真的,重复到足以达到实际为假的那些长度。

整个事情是可区分的AFAICS所以理论上应该没问题,但我很难强迫Keras喜欢它。

我设法做到这一点:

def AUC_proxy(y_true, y_pred):
    mask1 = y_true >= 1
    mask0 = y_true <= 0
    pred1 = tf.boolean_mask(y_pred, mask1)
    pred0 = tf.boolean_mask(y_pred, mask0)
    len1 = K.shape(pred1)[0]
    len0 = K.shape(pred0)[0]
    ratio = len0 // len1
    rem = len0 % len1

    pred1reps = K.repeat_elements(pred1, ratio, 0)
    if (rem != 0) :
        K.concatenate(pred1reps, pred1[0:rem])

    return K.sum(K.sigmoid(pred1reps - pred0)) / (len1 + len0)

但是,Keras抱怨说,repeat_elements的第一个参数必须具有前面已知的形状AFAICS:

ValueError: Axis 0 of input tensor should have a defined dimension, but is None. Full tensor shape: (None,). Typically you need to pass a fully-defined {input_shape {1}}

有没有办法解决这个问题?看起来我可以得到真假的预测,这是真的重复与False排列,这是棘手的部分。

我也尝试过使用tensorflow while_loop,但没有成功。

0 个答案:

没有答案