2016-06-13 29 views
1

我試圖解決二元分類問題,從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。

+1

它返回'int'類型的'0'嗎?你能打印類型信息(例如'type(x)')的結果嗎? – nemo

+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!) 

創建具有與/通過重複一個給定的行/列高度的給定的張量矩陣的方法向量。

查看theano.tensor.repeat。numpy中的示例(用法十分類似):

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

謝謝,指出我在正確的方向。在某個地方仍然存在邏輯錯誤,因爲該函數返回大於1的值,但我認爲我可以自己解決這個問題 - 或者如果我不能,則創建一個新問題。 (我懷疑我混淆了平等和bitwise_and) –

+0

您可以隨時在SO上創建一個新問題。 – nemo

+0

嗯,我得到它的工作....但是...我意識到,我計算的classelements數量是每批......並且完全無用: - / –