Python 作为度量函数的平衡错误率

Python 作为度量函数的平衡错误率,python,python-2.7,theano,keras,Python,Python 2.7,Theano,Keras,我试图用Keras的序列模型解决一个二元分类问题 必须满足特定的需求 所以我认为使用误码率而不是准确度作为衡量标准是个好主意 我的BER自定义度量实现如下所示: def平衡错误率(y_true,y_pred): labels=theano.shared(np.asmatrix([[0,1]],dtype='int8')) 标签矩阵=K.重复元素(标签,K.形状(y\u真)[0],轴=1) 真矩阵=K.重复元素(y\u真,K.形状(标签)[0],轴=1) pred_矩阵=K.重复元素(K.圆形(y

我试图用Keras的序列模型解决一个二元分类问题
必须满足特定的需求

所以我认为使用误码率而不是准确度作为衡量标准是个好主意

我的BER自定义度量实现如下所示:

def平衡错误率(y_true,y_pred):
labels=theano.shared(np.asmatrix([[0,1]],dtype='int8'))
标签矩阵=K.重复元素(标签,K.形状(y\u真)[0],轴=1)
真矩阵=K.重复元素(y\u真,K.形状(标签)[0],轴=1)
pred_矩阵=K.重复元素(K.圆形(y_pred),K.形状(标签)[0],轴=1)
类镜头=K.和(K.相等(标签矩阵,真矩阵),轴=1)
返回K.sum(K.sum(class_lens-K.sum)(K.equal(label_矩阵,K.not_equal(true_矩阵,pred_矩阵)),轴=1,轴=0)/class_lens,轴=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'>
>K.shape(y_真)
形状.0
>类型信息:
>类型(y_真)
>类型(K形(y_真))
…我不知道为什么


我现在正在寻找:

获取数组维度的方法/解释为什么
shape
会这样做/为什么
y\u true
似乎具有
0
维度

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

使用张量函数计算误码率的智能解决方案

获取数组维度的一种方法/解释为什么shape会这样做/为什么
y\u true
似乎有0个维度

处理
print
和像Theano这样的抽象库的方法是,通常不会得到值,而是得到值的表示。所以如果你这样做了

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

打印值的另一种方法是使用编号打印。使用值时打印,例如:

shape = theano.printing.Print('shape of foo')(foo.shape)
# use shape (not foo.shape!)
一种通过重复给定的行/列向量来创建具有给定with/height的张量矩阵的方法

看看吧。numpy中的示例(用法非常类似):


它是否返回
int
类型的
0
?你能打印类型信息(例如,
type(x)
)的结果)吗?我更新了问题。谢谢你为我指明了正确的方向。因为函数返回的值大于1,所以在某些地方仍然存在逻辑错误,但我认为我可以自己解决这个问题——或者如果我不能解决这个问题,就创建一个新问题。(我猜我把等号和按位_混在一起了)你总是可以在这里创建一个新的问题。好吧,我让它工作了……但是。。。我意识到我计算的每个批次的类元素数量。。。而且完全没有用:-/
>>> x
array([[1, 2, 3]])
>>> x.repeat(3, axis=0)
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])