2017-10-24 13 views
0

私のようなLSTMを養成しようとしています、MXNetError:一貫性のない形状、提供=(1,2)、推定された形状=(1,1)

from __future__ import print_function 
import mxnet as mx 
import numpy as np 
from mxnet import nd, autograd, sym 
from mxnet import gluon 

ctx = mx.cpu() 

LIMIT = 20 
data = np.array([(s, 1) for s in spanish_sentences[LIMIT]] + [(s, 0) for s in english_sentences[LIMIT]]) 

layer = mx.gluon.rnn.LSTM(100, 3) 
net = mx.gluon.nn.Dense(2) 
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss() 

layer.initialize(ctx=ctx) 
net.collect_params().initialize(ctx=ctx) 

trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': .1}) 
for epoch in range(10): 
    np.random.shuffle(data) 
    losses = [] 
    for s, l in data: 
     if len(s) == 0: 
      continue 

     x = nd.array([ord(c) for c in s]).reshape(shape=(-1, 1, 1)) 
     y = nd.array([np.eye(2)[int(l)]]) 
     with autograd.record(): 
      output = layer(x)[output.shape[0]-1, :, :] 
      pred = net(output) 
      loss = softmax_cross_entropy(pred, y) 
     losses.append(loss.asscalar()) 
     trainer.step(1, ignore_stale_grad=True) 
    print("Loss:", np.mean(losses), "+-", np.std(losses)) 

しかし、私はエラーを取得しています、

--------------------------------------------------------------------------- 
MXNetError        Traceback (most recent call last) 
<ipython-input-31-12ab8d4ad733> in <module>() 
    30    output = layer(x)[output.shape[0]-1, :, :] 
    31    pred = net(output) 
---> 32    loss = softmax_cross_entropy(pred, y) 
    33   losses.append(loss.asscalar()) 
    34   trainer.step(1, ignore_stale_grad=True) 

... Stack trace ... 

MXNetError: Shape inconsistent, Provided=(1,2), inferred shape=(1,1) 

何が間違っていますか? predyの形状をテストすると、両方とも(1, 2)に等しいことがわかります。私はなぜそれが期待されているのか分からない(1, 1)

答えて

1

かなりシンプルでした。 SoftMaxCrossEntropy()(pred, label)は、形状がpred.shape = (BATCH_SIZE, N_LABELS)およびlabel.shape = (BATCH_SIZE,)と予想されます。

したがってy = nd.array([l])を修正しました。

関連する問題