使用Theano错误的简单二进制分类

时间:2016-03-27 07:37:09

标签: python neural-network theano logistic-regression

尝试使用Theano为XOR案例创建简单的二进制分类时出错。它说维度不匹配,但我无法找出导致它的变量。

和奇怪的部分,我的程序在我改变最后一层神经元的数量时起作用。当我更改为在最后一层使用2个神经元,并将该图层更改为softmax图层,并使用负对数似然(多类分类样式)时,此程序运行正常。

这是我的完整代码:

import numpy as np
import theano
import theano.tensor as T 

class HiddenLayer(object):
    def __init__(self, input, nIn, nOut, is_last, W=None):
        self.input = input

        W_val = np.random.randn(nIn,nOut)*0.001
        b_val = np.zeros((nOut,))

        self.W = theano.shared(np.asarray(W_val,dtype=theano.config.floatX),
                               name='W',borrow=True)
        self.b = theano.shared(np.asarray(b_val,dtype=theano.config.floatX),
                               name='b',borrow=True)

        self.z = T.dot(input,self.W) + self.b

        if(is_last==0):            
            self.output = T.switch(self.z < 0 , 0 ,self.z)
        else:
            self.output = T.nnet.sigmoid(self.z)
            self.y_pred = self.output > 0.5

        self.params = [self.W, self.b]

    def cost_function(self,y):
        return -T.mean(y*T.log(self.output)+(1-y)*T.log(1-self.output))

    def errors(self,y):
        return T.mean(T.neq(self.y_pred,y))

alfa = 1
epoch = 1000
neu = 5        

inpx = np.array([[1,0],[1,1],[0,0],[0,1]])
inpy = np.array([1,0,0,1])

x = T.fmatrix('x')
y = T.ivector('y')

layer0 = HiddenLayer(
    input = x,
    nIn = 2,
    nOut = neu,
    is_last=0
)

layer1 = HiddenLayer(
    input = layer0.output,
    nIn = neu,
    nOut = 1,
    is_last=1
)

params = layer0.params + layer1.params
cost = layer1.cost_function(y) 
grads = T.grad(cost, params)
updates = [(param_i, param_i - alfa * grad_i) for param_i, grad_i in zip(params, grads)]
eror = layer1.errors(y)

train_model = theano.function([x,y], [eror,cost],updates=updates,allow_input_downcast=True)

test_model = theano.function([x,y],[eror,layer1.y_pred],allow_input_downcast=True)

for i in xrange(epoch):
    etr,ctr = train_model(inpx, inpy)
    if i%(epoch/10)==0:
        print etr,ctr

et,pt = test_model(inpx,inpy)
print pt

和错误:

ValueError: Input dimension mis-match. (input[0].shape[1] = 1, input[1].shape[1] = 4)
Apply node that caused the error: Elemwise{neq,no_inplace}(sigmoid.0, DimShuffle{x,0}.0)
Toposort index: 41
Inputs types: [TensorType(float32, matrix), TensorType(int32, row)]
Inputs shapes: [(4L, 1L), (1L, 4L)]
Inputs strides: [(4L, 4L), (16L, 4L)]
Inputs values: [array([[ 0.94264328],
       [ 0.99725735],
       [ 0.5       ],
       [ 0.95675617]], dtype=float32), array([[1, 0, 0, 1]])]
Outputs clients: [[Shape(Elemwise{neq,no_inplace}.0), Sum{acc_dtype=int64}(Elemwise{neq,no_inplace}.0)]]

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的y和inpy变量存在问题:您要做的是让y成为网络的预期输出。您的网络被赋予一个包含4个元素的数据集,每个元素具有2个特征,因此您的输入矩阵中有4行,以及2列。因此,您预计在预测输出中有4个元素,即y或inpy矩阵中的4行,但是您使用的是向量,在theano中是行向量,因此只有一行。您需要在计算成本时转置y向量,或者将y变量定义为矩阵,从而将inpy作为(4,1)矩阵而不是(4,)向量(再次,向量是在theano中的行向量。

希望这有帮助,

最佳