如何在Theano示例中添加混淆矩阵?

时间:2015-08-03 21:17:32

标签: theano deep-learning confusion-matrix

我想利用Theano的逻辑回归分类器,但我想与之前的研究进行比较,以了解深度学习的深度。我认识到如果我对Theano更加精通,这可能是一项相当简单的任务,但这是我迄今为止所做的。从网站上的教程中,我有以下代码:

def errors(self, y):
    # check if y has same dimension of y_pred
    if y.ndim != self.y_pred.ndim:
        raise TypeError(
            'y should have the same shape as self.y_pred',
            ('y', y.type, 'y_pred', self.y_pred.type)
        )
    # check if y is of the correct datatype
    if y.dtype.startswith('int'):
        # the T.neq operator returns a vector of 0s and 1s, where 1
        # represents a mistake in prediction
        return T.mean(T.neq(self.y_pred, y))

我很确定这是我需要添加功能的地方,但我不确定如何去做。我需要的是每次运行访问y_pred和y(更新我在python中的混淆矩阵)或让C ++代码处理混淆矩阵并在此过程中的某个时刻返回它。我不认为我可以做前者,我不确定如何做后者。我已经完成了一些更新功能,包括:

def confuMat(self, y):
    x=T.vector('x')
    classes = T.scalar('n_classes')
    onehot = T.eq(x.dimshuffle(0,'x'),T.arange(classes).dimshuffle('x',0))
    oneHot = theano.function([x,classes],onehot)
    yMat = T.matrix('y')
    yPredMat = T.matrix('y_pred')
    confMat = T.dot(yMat.T,yPredMat)
    confusionMatrix = theano.function(inputs=[yMat,yPredMat],outputs=confMat)

    def confusion_matrix(x,y,n_class):
        return confusionMatrix(oneHot(x,n_class),oneHot(y,n_class))

    t = np.asarray(confusion_matrix(y,self.y_pred,self.n_out))
    print (t)

但是我并不完全清楚如何使这个与有问题的功能接口,并给我一个我可以使用的numpy数组。 我对Theano很新,所以希望这对你们其中一个人来说很容易。我想在许多配置中使用这个classifer作为我的输出层,所以我可以将混淆矩阵与其他架构一起使用。

1 个答案:

答案 0 :(得分:1)

我建议使用蛮力的方式。首先需要输出用于预测。为它创建一个函数。

 prediction = theano.function(
        inputs = [index],
        outputs = MLPlayers.predicts,
        givens={
                x: test_set_x[index * batch_size: (index + 1) * batch_size]})

在测试循环中,收集预测...

labels = labels + test_set_y.eval().tolist() 
for mini_batch in xrange(n_test_batches):
    wrong = wrong + int(test_model(mini_batch))   
    predictions = predictions + prediction(mini_batch).tolist()

现在以这种方式创建混淆矩阵:

    correct = 0
    confusion = numpy.zeros((outs,outs), dtype = int)
    for index in xrange(len(predictions)):
        if labels[index] is predictions[index]:
            correct = correct + 1
        confusion[int(predictions[index]),int(labels[index])] = confusion[int(predictions[index]),int(labels[index])] + 1

您可以找到此类实施in this repository