2016-12-17 13 views
7

में गतिशील एक्सिस के बारे में शिकायत करते हुए मैं एक अनुक्रम वर्गीकृत करने के लिए सीएनटीके (पायथन का उपयोग करके) में एक एलएसटीएम लागू करने की कोशिश कर रहा हूं।सीएनटीके एलएसटीएम

इनपुट: संख्याओं की

  • विशेषताएं ठीक लंबाई दृश्यों (एक समय श्रृंखला)

  • लेबल एक गर्म मूल्यों का वैक्टर हैं

नेटवर्क:

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) 

आउटपुट: एक संभावना है कि अनुक्रम एक लेबल से मेल खाता

सभी आकार निर्धारित किया जाता है, तो मुझे नहीं लगता कि मैं किसी भी गतिशील धुरी की जरूरत है और किसी भी निर्दिष्ट नहीं किया है है।

हालांकि, CNTK खुश नहीं है और मैं मिलता है:

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 

हैं (उदाहरण के कुछ के अनुसार) मैं एक गतिशील धुरी

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

यह अब इस बारे में शिकायत के साथ लेबल को परिभाषित , और करने के लिए आगे हो जाता है:

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}) 

लेकिन इस त्रुटि के साथ मर जाता है:

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... 

इसे ठीक करने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

8

यदि मैं इसे सही ढंग से समझ रहा हूं तो आपके पास एक आयामी इनपुट के अनुक्रम हैं। यदि ऐसा है, तो आपकी समस्याएं

input = input_variable(input_dim) 

जो इनपुट_डिम आयामी वैक्टर का अनुक्रम घोषित करती है। यदि आप इसे

input = input_variable(1) 

पर बदलते हैं तो मेरा मानना ​​है कि आपका प्रारंभिक प्रयास कार्य करना चाहिए।

अद्यतन: उपरोक्त अपने आप से पर्याप्त नहीं है क्योंकि अनुक्रम का अंतिम तत्व लेने का संचालन एक आउटपुट बनाता है जिसका गतिशील अक्ष डिफ़ॉल्ट गतिशील धुरी से भिन्न होते हैं जिसके साथ लेबल बनाया जाता है। एक आसान ठीक बाद आप इस

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

यह मेरे लिए कोई शिकायत बिना काम करता है की तरह उत्पादन z परिभाषित किया है लेबल परिभाषित करने के लिए है। मैं तो इस तरह की कुछ डमी डेटा खिलाया

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 के एक minibatch 5 और 3 वर्गों में से एक दृश्य लंबाई कल्पना करते हुए) और यह उम्मीद के रूप में काम किया।

+0

मैंने कोशिश की, इसकी अभी भी – Tiny

+0

रनटाइमर त्रुटि है: वर्तमान में यदि किसी तत्व के संचालन के संचालन में कोई गतिशील अक्ष है, तो उन्हें अन्य ऑपरेटरों की गतिशील अक्ष से मेल खाना चाहिए – Tiny

+0

मैंने वास्तव में इसे आजमाने के बाद उत्तर अपडेट किया है। –

संबंधित मुद्दे