2016-06-26 10 views
0

私はgithub hereのコードを、より単純な2次元データを読むおもちゃの例に少し変更しようとしています。私のおもちゃのデータセットは、いくつかの例のデータポイントがLasagne/Theano mnistの例題

1,1 
3,1 
4,1 
4,2 
6,2 
1,3 

ある

x-coordinate, y-coordinate, class 

次のような構造を持っており、それに対応するクラス

私はデータを読み、私のカスタムを作成することができるよ
0 
1 
1 
1 
1 
0 

mlp。私はトレーニングの一部を実行しようとするしかし、私は、これは明らかに私が渡している配列の形状とは何かを持っている次のエラー

(5, 2) 
(5,) 
Traceback (most recent call last): 
    File "./t.py", line 78, in <module> 
    train_err += train_fn(inputs, targets) 
    File "/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.py", line 786, in __call__ 
allow_downcast=s.allow_downcast) 
    File "/usr/local/lib/python2.7/dist-packages/theano/tensor/type.py", line 177, in filter 
data.shape)) 
TypeError: ('Bad input argument to theano function with name "./t.py:67" at index 0(0-based)', 'Wrong number of dimensions: expected 4, got 2 with shape (5, 2).') 

を取得します。しかし、私が理解できないように見えるのは、私のケースが、画像の二次元配列でもあるニーストのデータセットと異なるからです。

私のコード全体は次のとおりです。

def build_mlp(input_var=None): 
    l_in = lasagne.layers.InputLayer(shape=(None,1,1,2),input_var = input_var) 
    l_h1 = lasagne.layers.DropoutLayer(l_in,p = 0.2) 
    l_hid1 = lasagne.layers.DenseLayer(
     l_h1,num_units = 10, 
     nonlinearity = lasagne.nonlinearities.rectify, 
     W = lasagne.init.GlorotUniform()) 
    l_h2 = lasagne.layers.DropoutLayer(l_hid1,p = 0.2) 
    l_hid2 = lasagne.layers.DenseLayer(
     l_h2,num_units = 10, 
     nonlinearity = lasagne.nonlinearities.rectify, 
     W = lasagne.init.GlorotUniform()) 
    l_out = lasagne.layers.DenseLayer(
     l_hid2,num_units = 5, 
     nonlinearity = lasagne.nonlinearities.softmax, 
     W = lasagne.init.GlorotUniform()) 
    return l_out 

def iterate_minibatches(inputs, targets, batchsize, shuffle=False): 
    assert len(inputs) == len(targets) 
    if shuffle: 
     indices = np.arange(len(inputs)) 
     np.random.shuffle(indices) 
    for start_idx in range(0, len(inputs) - batchsize + 1, batchsize): 
     if shuffle: 
      excerpt = indices[start_idx:start_idx + batchsize] 
     else: 
      excerpt = slice(start_idx, start_idx + batchsize) 
     yield inputs[excerpt], targets[excerpt] 


x_data = np.genfromtxt('a.csv',delimiter=',') 
y_data = np.genfromtxt('b.csv',delimiter=',') 

x_train, x_test, y_train, y_test = train_test_split(x_data,y_data,test_size = 0.33) 

input_var = T.tensor4('inputs') 
target_var = T.ivector('targets') 

network = build_mlp(input_var) 

prediction = lasagne.layers.get_output(network) 
loss = lasagne.objectives.categorical_crossentropy(prediction, target_var) 
loss = loss.mean() 

params = lasagne.layers.get_all_params(network, trainable=True) 
updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.4) 

test_prediction = lasagne.layers.get_output(network, deterministic=True) 
test_loss = lasagne.objectives.categorical_crossentropy(test_prediction, 
                 target_var) 
test_loss = test_loss.mean() 

test_acc = T.mean(T.eq(T.argmax(test_prediction, axis=1), target_var), 
        dtype=theano.config.floatX) 

train_fn = theano.function([input_var, target_var], loss, updates=updates) 
val_fn = theano.function([input_var, target_var], [test_loss, test_acc]) 

num_epochs = 100 
for epoch in range(num_epochs): 
    train_err = 0 
    start_time = time.time() 
    for batch in iterate_minibatches(x_train, y_train, 5, shuffle=True): 
     inputs, targets = batch 
     print inputs.shape 
     print targets.shape 
     train_err += train_fn(inputs, targets) 

    val_err = 0 
    val_acc = 0 
    val_batches = 0 
    for batch in iterate_minibatches(x_train, y_train, 5, shuffle=False): 
     inputs, targets = batch 
     err, acc = val_fn(inputs, targets) 
     val_err += err 
     val_acc += acc 
     val_batches += 1 

    print 'Epoch %d of %d took {:%0.3f}s' % (epoch + 1, num_epochs, time.time() - start_time) 
    print(" training loss:\t\t{:.6f}".format(train_err/train_batches)) 
    print(" validation loss:\t\t{:.6f}".format(val_err/val_batches)) 
    print(" validation accuracy:\t\t{:.2f} %".format(val_acc/val_batches * 100)) 

私がここでやっていることを教えてもらえますか?

答えて

1

input_varを4Dテンソルとして宣言していますが、エラーメッセージには、サイズが(5,2)のデータ行列を入力として渡すことが示唆されています。入力レイヤーの形状に基づいて、これは(5, 1, 1, 2)でなければなりません(5はミニブック内のトレーニングサンプルの数に対応し、2はx座標とy座標に対応しているものとします)。

関連する問題