平衡错误率作为度量函数

时间:2016-06-13 19:24:19

标签: python python-2.7 theano keras

我正在尝试使用Keras的顺序模型来解决二元分类问题 并且必须满足给定的Balanced Error Rate (BER)

所以我认为使用BER代替精度作为指标是个好主意。

我对BER的自定义度量标准实现如下:

def balanced_error_rate(y_true, y_pred):
    labels = theano.shared(np.asmatrix([[0, 1]], dtype='int8'))
    label_matrix = K.repeat_elements(labels, K.shape(y_true)[0], axis=1)
    true_matrix = K.repeat_elements(y_true, K.shape(labels)[0], axis=1)
    pred_matrix = K.repeat_elements(K.round(y_pred), K.shape(labels)[0], axis=1)

    class_lens = K.sum(K.equal(label_matrix, true_matrix), axis=1)
    return K.sum(K.sum(class_lens - K.sum(K.equal(label_matrix, K.not_equal(true_matrix,pred_matrix)), axis=1), axis=0)/class_lens, axis=0)/2

我们的想法是从可用标签创建一个矩阵,并将其与输入数据进行比较(然后将其相加)以获得此标签的元素数量....

我的问题是:

> K.shape(y_true) 
Shape.0    


> Typeinfo:

> type(y_true)
<class 'theano.tensor.var.TensorVariable'>

> type(K.shape(y_true))
<class 'theano.tensor.var.TensorVariable'>

......我找不到原因。

我正在寻找:

获取数组维度的方法/解释shape行为的原因/ y_true似乎有0维的原因

通过重复给定的行/列向量来创建具有/ height的给定的张量矩阵的方法。

使用张量函数计算BER的更智能的解决方案。

1 个答案:

答案 0 :(得分:1)

  

一种获取数组维度的方法/解释为什么形状像它一样的行为/ y_true似乎有0维的原因

print和像Theano这样的抽象库的交易是你通常不会得到值而是代表值。所以,如果你这样做

print(foo.shape)

您不会获得实际形状,而是表示在运行时完成的操作。由于这都是在外部设备上计算的,因此计算不会立即运行,而是仅在创建具有适当输入的函数(或调用foo.shape.eval())之后运行。

打印值的另一种方法是在使用值时使用theano.printing.Print,例如:

shape = theano.printing.Print('shape of foo')(foo.shape)
# use shape (not foo.shape!)
  

通过重复给定的行/列向量来创建具有/ height给定的张量矩阵的方法。

请参阅theano.tensor.repeat。 numpy中的示例(用法非常相似):

>>> x
array([[1, 2, 3]])
>>> x.repeat(3, axis=0)
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])