2016-03-27 10 views
0

Theanoを使用したXORの単純なバイナリ分類を作成しようとすると、エラーが発生します。それは次元の不一致ですが、私はどのような変数が原因であるかを知ることができません。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変数にあります。あなたがしようとしているのは、yをネットワークの予想される出力にすることです。ネットワークには、2つのフィーチャを持つ4つの要素のデータセットが与えられているため、入力行列には4行、2列になります。したがって、予測される出力に4つの要素、つまりyまたはinpyの行列の4つの要素があると予想されますが、theanoでは行ベクトルであり1つの行しか持たないベクトルを使用しています。コストを計算するときにyベクトルを転置するか、y変数を行列として定義する必要があり、したがって、(4,1)行列の代わりに(4,1)行列としてのinpyを持つ必要がありますtheanoの行ベクトル)。 `返すT.mean(T:これは役立ちます

希望、

ベスト

+0

ヤップ、あなたの答えのためのおかげで、何度か試した後、私はこのようなものに変更することでエラーとコストのコードを、それを解決しました。 neq(T.reshape(self.y_pred、(4、))、y)) ' – malioboro