我正在尝试使用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维的原因

要么

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

要么

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

最佳答案

获取数组尺寸的一种方法/解释形状为何如此的行为/ 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!)



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


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

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

08-04 23:42