2016-12-17 14 views
7

Bir diziyi sınıflandırmak için CNTK (Python kullanarak) içinde bir LSTM uygulamaya çalışıyorum.CNTK LSTM'de Dinamik Eksen hakkında şikayet

giriş: Etiketler bir sıcak değerleri vektörlerdir

  • sayı

    • Özellikler sabit uzunlukta sekanslar (bir zaman serisi)

    Ağı:

    input = input_variable(input_dim) 
    label = input_variable(num_output_classes) 
    h = Recurrence(LSTM(lstm_dim)) (input) 
    final_output = C.sequence.last(h) 
    z = Dense(num_output_classes) (final_output) 
    loss = C.cross_entropy_with_softmax(z, label) 
    

    Çıktı: dizisi bir etiket eşleştiğini bir olasılık

    Tüm boyutları sabittir

    , bu yüzden ben herhangi bir dinamik eksenini ihtiyaç ve herhangi belirtilmemiş sanmıyorum.

    Ancak CNTK mutlu değildir ve ben alıyorum:

    return cross_entropy_with_softmax(output_vector, target_vector, axis, name) 
    RuntimeError: Currently if an operand of a elementwise operation has any dynamic axes, those must match the dynamic axes of the other operands 
    

    ise (örneklerden bazıları uyarınca) Ben

    label = input_variable(num_output_classes, dynamic_axes=[C.Axis.default_batch_axis()]) 
    

    Artık bu şikayet dinamik bir ekseni ile etiket tanımlamak ve daha da alır:

    tf = np.split(training_features,num_minibatches) 
    tl = np.split(training_labels, num_minibatches) 
    
    for i in range(num_minibatches*num_passes): # multiply by the 
        features = np.ascontiguousarray(tf[i%num_minibatches]) 
        labels = np.ascontiguousarray(tl[i%num_minibatches]) 
    
        # Specify the mapping of input variables in the model to actual minibatch data to be trained with 
        trainer.train_minibatch({input : features, label : labels}) 
    

    Ama bu hata ile ölür:

    File "C:\Users\Dev\Anaconda3\envs\cntk-py34\lib\site-packages\cntk\cntk_py.py", line 1745, in train_minibatch 
        return _cntk_py.Trainer_train_minibatch(self, *args) 
    RuntimeError: Node '__v2libuid__Plus561__v2libname__Plus552' (Plus operation): DataFor: FrameRange's dynamic axis is inconsistent with matrix: {numTimeSteps:1, numParallelSequences:100, sequences:[{seqId:0, s:0, begin:0, end:1}, {seqId:1, s:1, begin:0, end:1}, {seqId:2, s:2, begin:0, end:1}, {seqId:3, s:3, begin:0, end:1}, {seq... 
    

    Bunu düzeltmek için ne yapmam gerekiyor?

  • cevap

    8

    Bunu doğru anlıyorsam, tek boyutlu girdiler dizileriniz var. Eğer öyleyse, o dertlerin input_dim boyutlu bir dizi vektör beyan bu hat

    input = input_variable(input_dim) 
    

    kaynaklanıyor. Bunu, ilk denemenizin çalışması gerektiğine inanıyorum,

    .

    Güncelleştirmesi: Yukarıdaki, kendi başına yeterli değildir çünkü bir dizinin son öğesini alma işlemi, dinamik eksenleri etiketin oluşturulduğu varsayılan dinamik eksenlerden farklı olan bir çıktı oluşturur. Kolay bir düzeltme Eğer Bu benim için herhangi bir şikayet olmaksızın çalışan bu

    label = input_variable(num_output_classes, dynamic_axes=z.dynamic_axes) 
    

    gibi çıktı z tanımladıktan sonra etiketi tanımlamaktır. Daha sonra

    x = np.arange(20.0, dtype=np.float32).reshape(4,5,1) 
    y = np.array([1,0,0,0,1,0,0,0,1,0,0,1], dtype=np.float32).reshape(4,1,3) 
    loss.eval({input: x, label:y }) 
    

    (4 bir minibatch 5 ve 3 sınıfların bir dizi uzunluğu varsayılarak) aşağıdaki gibi bir yapay veriler beslenir ve beklendiği gibi çalışmıştır.

    +0

    Denedim, hala yaklaşık – Tiny

    +0

    RuntimeError hakkında şikayet: Şu anda, bir elementel işlemin bir işleneni herhangi bir dinamik eksenine sahipse, bunlar diğer işlenenlerin dinamik eksenleriyle eşleşmelidir – Tiny

    +0

    Yanıtı gerçekten denedikten sonra güncelledim. –

    İlgili konular