提交 eea40da7 authored 作者: RadhikaG's avatar RadhikaG 提交者: Bryn Keller

Minor changes to confusion matrix op and added unit tests.

上级 b1f36dbc
...@@ -2429,7 +2429,7 @@ def confusion_matrix(actual, pred): ...@@ -2429,7 +2429,7 @@ def confusion_matrix(actual, pred):
Actual | Actual |
| |
order : Order of entries in terms of original data order : 1-d array of order of entries in rows and columns
Examples Examples
-------- --------
...@@ -2446,12 +2446,10 @@ def confusion_matrix(actual, pred): ...@@ -2446,12 +2446,10 @@ def confusion_matrix(actual, pred):
[2, 1, 0], [2, 1, 0],
[0, 0, 1]]), array([ 0., 1., 2.])] [0, 0, 1]]), array([ 0., 1., 2.])]
""" """
if actual.type.ndim != 1: if actual.ndim != 1:
raise ValueError('actual must be 1-d tensor variable') raise ValueError('actual must be 1-d tensor variable')
if pred.type.ndim != 1: if pred.ndim != 1:
raise ValueError('pred must be 1-d tensor variable') raise ValueError('pred must be 1-d tensor variable')
if actual.shape[0] != pred.shape[0]:
raise ValueError('actual and pred must have the same length')
order = extra_ops.Unique(False, False, False)(tensor.concatenate([actual, pred])) order = extra_ops.Unique(False, False, False)(tensor.concatenate([actual, pred]))
...@@ -2462,5 +2460,4 @@ def confusion_matrix(actual, pred): ...@@ -2462,5 +2460,4 @@ def confusion_matrix(actual, pred):
oneHotP = tensor.eq(colP, order).astype('int64') oneHotP = tensor.eq(colP, order).astype('int64')
conf_mat = tensor.dot(oneHotA.T, oneHotP) conf_mat = tensor.dot(oneHotA.T, oneHotP)
return [conf_mat, order] return [conf_mat, order]
...@@ -32,7 +32,8 @@ from theano.tensor.nnet import (categorical_crossentropy, ...@@ -32,7 +32,8 @@ from theano.tensor.nnet import (categorical_crossentropy,
relu, relu,
h_softmax, h_softmax,
elu, elu,
binary_crossentropy) binary_crossentropy,
confusion_matrix)
from theano.tensor import matrix, vector, lvector, scalar from theano.tensor import matrix, vector, lvector, scalar
from theano.tensor.nnet.nnet import softsign from theano.tensor.nnet.nnet import softsign
from theano.tensor.tests.test_basic import (makeBroadcastTester, check_floatX, from theano.tensor.tests.test_basic import (makeBroadcastTester, check_floatX,
...@@ -1744,3 +1745,30 @@ SoftsignTester = makeBroadcastTester( ...@@ -1744,3 +1745,30 @@ SoftsignTester = makeBroadcastTester(
good=_good_broadcast_unary_normal_float_no_complex, good=_good_broadcast_unary_normal_float_no_complex,
name='SoftsignTester', name='SoftsignTester',
) )
def test_confusion_matrix():
# Defining numpy implementation of confusion matrix
def numpy_conf_mat(actual, pred):
order = numpy.union1d(actual, pred)
colA = numpy.matrix(actual).T
colP = numpy.matrix(pred).T
oneHotA = colA.__eq__(order).astype('int64')
oneHotP = colP.__eq__(order).astype('int64')
conf_mat = numpy.dot(oneHotA.T, oneHotP)
conf_mat = numpy.asarray(conf_mat)
return [conf_mat, order]
x = tensor.vector()
y = tensor.vector()
f = theano.function([x, y], confusion_matrix(x, y))
list_inputs = [[[0, 1, 2, 1, 0], [0, 0, 2, 1, 2]],
[[2, 0, 2, 2, 0, 1], [0, 0, 2, 2, 0, 2]]]
for case in list_inputs:
a = numpy.asarray(case[0])
b = numpy.asarray(case[1])
out_exp = numpy_conf_mat(a, b)
outs = f(case[0], case[1])
for exp, out in zip(out_exp, outs):
utt.assert_allclose(exp, out)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论