10

シーケンスを分類するために (Python を使用して) CNTK に LSTM を実装しようとしています。

入力:

  • 特徴は固定長の数列 (時系列) です

  • ラベルはワンホット値のベクトルです

通信網:

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

これを修正するにはどうすればよいですか?

4

1 に答える 1

10

これを正しく理解していれば、一連の 1 次元入力があります。もしそうなら、あなたの問題はこの行から生じます

input =  input_variable(input_dim)

これは、input_dim 次元ベクトルのシーケンスを宣言します。に変更すると

input = input_variable(1)

その後、最初の試みがうまくいくはずです。

更新: シーケンスの最後の要素を取得する操作により、ラベルが作成されるデフォルトの動的軸とは異なる動的軸を持つ出力が作成されるため、上記だけでは不十分です。z簡単な修正は、このように出力を定義した後にラベルを定義することです

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

これは私にとって何の不満もなく動作します。次に、このようなダミーデータを入力しました (4 のミニバッチ、5 のシーケンス長、および 3 クラスを想定)

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

期待どおりに機能しました。

于 2016-12-18T19:52:56.733 に答える