収集と散布
Gather()、Scatter()
マスクに基づいてデータ シーケンスを短縮または延長します。
BS.Sequences.Gather (maskSequence, dataSequence)
BS.Sequences.Scatter (maskSequence, dataSequence)
パラメーター
maskSequence
: 0 または 1 (静的テンソル 次元[1]
) のシーケンス。ここで、1 は保持するサンプルを示します。 (その他の値は未定義の動作を生み出し、将来変更される可能性があります)。dataSequence
: 処理するデータ シーケンス。 の場合Gather()
、その長さは 、Scatter()
の長さと同じであるmaskSequence
必要がありますmaskSequence
。
戻り値
の Gather()
サブセットを含むシーケンスで、一部の dataSequence
サンプルが削除されます。 結果シーケンスの長さは、次の値の maskSequence
数と等しくなります。
の Scatter()
場合、ゼロのサンプルと挿入されたゼロを dataSequence
含むシーケンス。 結果シーケンスの長さは maskSequence
.
説明
Gather()
マスク Scatter()
シーケンスに基づいて、単語のシーケンスなどの入力シーケンスを短縮または延長できます。
Gather()
は1
、マスクが 0 であるサンプルdataSequence[n]
maskSequence[n]
のサブシーケンスを返します。
Scatter()
はサブシーケンスの要素を受け取り、長いシーケンスに配置し、ゼロを挿入します。
次に例を示します。
g = Gather (m, d)
s = Scatter (m, g)
d = A B C D E F G H I J K L M N O P Q R S T U V W X Y Z # data
m = 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 1 # mask
g = A B D G I J M P Q T W X Z
s = A B 0 D 0 0 G 0 I J 0 0 M 0 0 P Q 0 0 T 0 0 W X 0 Z
Gather()
を介してSlice(..., axis=-1)
BS.Sequences.First()
BS.Sequences.Last()
間接的に使用されることがよくあります。
例
リカレント言語モデル
フォーム<s> A B C ... </s>
の単語シーケンスを指定すると、言語モデルはフォームのinput
予測形式<s> A B C ...
labels
をA B C ... </s>
受け取ります。 Gather()
では、1 つの単語シーケンスをファイルから読み取り、末尾とlabels
先頭<s>
をそれぞれ削除</s>
して作成input
します。
words = Input {inputDim}
inputMask = !BS.Sequences.IsFirst (words)
labelsMask = !BS.Sequences.IsLast (words)
input = Gather (inputMask, words) # drop trailing </s>
labels = ReconcileDynamicAxis (Gather (labelsMask, words), input) # drop leading <s>
lstmLM = Sequential
(
EmbeddingLayer {300} :
RecurrentLSTMLayer {512} :
DenseLayer {inputDim, activation=LogSoftmax}
)
logP = lstmLM (input)
ce = -TransposeTimes (labels, logP)
criterionNodes = (ce)
注: 操作はより Gather()
便利に次のように書くことができます。これは、内部呼び出し Gather()
の下で次のようになります。
input = Slice (0, -1, words, axis=-1) # strip trailing </s>
labels = ReconcileDynamicAxis (Slice (1, 0, words, axis=-1), input) # strip leading <s>
思考ベクトル
次に、非表示状態シーケンスの最後のサンプルを選択します。
h = RecurrentLSTMLayer {} (x) # sequence of hidden states
lastMask = BS.Sequences.IsLast (h) # mask to denote the last step
thoughtVector = BS.Sequences.Gather (lastMask, h) # select the last
IsFirst()、IsLast()
シーケンスの最初と最後のサンプルをそれぞれ選択するために使用 Gather()
するマスクを作成します。
BS.Sequences.IsFirst (dataSequence)
BS.Sequences.IsLast (dataSequence)
パラメーター
dataSequence
: 任意のシーケンス (単語シーケンスなど)
戻り値
使用する Gather()
マスクは、他のすべてのサンプルを削除しながら、それぞれ最初または最後の項目を選択します。
説明
IsFirst()
シーケンスの最初と最後のサンプルをそれぞれ選択するために使用Gather()
するマスクを作成しますIsLast()
。これは通常、シーケンス間モデルで "思考ベクトル" (繰り返しの最後の非表示状態) を抽出するために必要です。
例
こちらを参照してください。