0

シーケンスの最後の単語のラベルを取得して、シーケンスにラベルを付けるモデルをトレーニングしました。

Sequential([
            Embedding(emb_dim),
            cntk.ops.sequence.last(Recurrence(LSTM(hidden_dim), go_backwards=False)), 
            Dense(num_labels)
        ])

ここで、num_labels = 8

ここから GPU ライブラリを使用していますhttps://github.com/Microsoft/CNTK/wiki/NuGet-Package C# (CNTK v2.0.beta8.0) からモデルを使用します。

Variable outputVar = modelFunc.Outputs.Single(); 
var outputDataMap = new Dictionary<Variable, Value>();
outputDataMap.Add(outputVar, null);
modelFunc.Evaluate(inputDataMap, outputDataMap, device);
Value outputVal = outputDataMap[outputVar];

そして outputVal は: 次元: カウント = 3 ランク: 3 合計サイズ: 8

ディメンション: カウント = 1 ランク: 1 合計サイズ: 8

上記は正しいですか?outputVar と outputVal は同じディメンション/ランク/合計サイズになると予想されます。また、返されたクラスを抽出するにはどうすればよいですか? 基本的に、outputData にはどの C# タイプを使用すればよいですか? github の例のように 2 つのネストされたリストを試しましたが、うまくいきませんでした。outputVal.CopyVariableValueTo(outputVar, outputData);

ありがとうございました

4

3 に答える 3

0

はい、正しいです。Variable の形状は基本的にテンソル形状ですが、Value オブジェクトの形状には通常 2 つの追加の次元が含まれます。1 つはシーケンス軸で、もう 1 つはバッチ軸です。これは、Value オブジェクトが複数のシーケンスのバッチを表し、それぞれがシーケンスには可変長のサンプルがあります。各サンプルの形状は、変数の形状と同じである必要があります。あなたの場合、出力にサンプルが1つしかないように見えるため、シーケンスとバッチの長さは1であり(outputVal.Shape.Dimensions 1と[2]を確認できます)、TotalSizeはoutputVar.Shapeと同じです。全体の大きさ。

値からデータを抽出するには、次を使用できます

outputVal.CopyVariableValueTo(outputVar, outputBuffer);

CopyVariableTo() は、Value オブジェクトに格納されているデータを、denst 形式または one-hot ベクター形式の可変長サンプルを含むシーケンスのリストとしてバッファーにコピーします。outputVarは、この Value からoutputBufferにデータをコピーするときの形状と動的軸を示します。outputBufferは、可変長のシーケンスのリストです。シーケンスの外側のリストに含まれるアイテムの数は、Value 内のシーケンスの数です。外側のリストの各要素はシーケンスを表します。List で表される各シーケンスには、可変数のサンプルが含まれます。各サンプルは、型が T の固定数の要素で構成されます。サンプルの要素の数は、sampleVariable の形状によって決まります。APIの詳細を確認できますここ

outputVal.CopyVariableValueTo(outputVar, outputData); を使用する場合、どのような問題がありますか?

ありがとう

于 2017-01-18T09:07:20.133 に答える