2016-03-27 2 views
0

У меня возникла ошибка при попытке создать простую двоичную классификацию для случая XOR с использованием Theano. Он сказал, что несоответствие измерения, но я не могу выяснить, какая переменная вызывает это.Простая двоичная классификация с использованием ошибки Theano

и странная часть, моя программа работает, когда я изменяю количество нейронов в последнем слое. Когда я перехожу на использование 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)]] 

Заранее спасибо за любую помощь.

ответ

0

Ваша проблема с вашими переменными y и inpy: то, что вы пытаетесь сделать, - это быть ожидаемым выходом сети. В вашей сети предоставляется набор данных с 4 элементами, каждый из которых имеет 2 функции, поэтому у вас есть 4 строки в вашей входной матрице и 2 столбца. Таким образом, вы ожидаете иметь 4 элемента в вашем прогнозируемом выходе, то есть 4 строки в вашей y или матрице inpy, но вы используете вектор, который в anano является вектором строки и, следовательно, имеет только одну строку. Вам нужно либо транспонировать вектор y при вычислении стоимости, либо определить вашу переменную y в качестве матрицы, и, следовательно, иметь inpy в качестве матрицы (4,1) вместо вектора (4) (еще раз векторы ряд векторов в анано).

Надеется, что это помогает,

Лучшие

+0

трепло, спасибо за Ваш ответ, после попытки несколько раз я решил ее изменениями ошибки и код затрат на что-то вроде этого: 'вернуть T.mean (T. NEQ (T.reshape (self.y_pred, (4)), у)) ' – malioboro

Смежные вопросы