Udostępnij przez


Zbieranie i rozpraszanie

Gather(), Scatter()

Skracanie lub wydłużanie sekwencji danych na podstawie maski.

BS.Sequences.Gather  (maskSequence, dataSequence)
BS.Sequences.Scatter (maskSequence, dataSequence)

Parametry

  • maskSequence: sekwencja 0 lub 1 (wymiar [1]statyczny tensor), gdzie 1 wskazuje próbki do zachowania. (Każda inna wartość powoduje niezdefiniowane zachowanie i może ulec zmianie w przyszłości).
  • dataSequence: sekwencja danych do przetworzenia. W przypadku Gather()parametru maskSequencejego długość musi być taka sama jak w przypadku elementu , natomiast w przypadku Scatter()parametru musi być równa liczbie tych w elemecie maskSequence.

Wartość zwracana

W przypadku Gather()programu sekwencja zawierająca podzbiór dataSequenceelementów , z porzuconymi próbkami. Długość sekwencji wyników będzie równa liczbie jedynek w elemecie maskSequence.

W przypadku Scatter()programu sekwencja zawierająca próbki dataSequence zer i wstawionych zer. Sekwencja wyników będzie mieć taką samą długość jak maskSequence.

Opis

Gather() i Scatter() umożliwiają skrócenie lub wydłużenie sekwencji danych wejściowych, takich jak sekwencja słów, na podstawie sekwencji maski.

Gather() Zwraca podsekwencję tych próbek dataSequence[n] , dla których maskSequence[n] wartość to 1, a te, dla których maska ma wartość 0, zostanie porzucona.

Scatter() pobiera elementy sekwencji podrzędnej i umieszcza je w dłuższej sekwencji, wstawiając zera.

Przykład:

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() jest często używany pośrednio za pośrednictwem Slice(..., axis=-1), BS.Sequences.First()i BS.Sequences.Last().

Przykłady

Cykliczny model językowy

Biorąc pod uwagę sekwencję wyrazów formularza <s> A B C ... </s>, model językowy przyjmuje input formularz <s> A B C ... do przewidywania labels formularza A B C ... </s>. Gather() umożliwia odczytanie pojedynczej sekwencji wyrazów z pliku, a następnie utworzenie input elementu i labels przez usunięcie odpowiednio końcowego </s> i wiodącego <s>ciągu :

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)

Uwaga: Gather() Operacja może być wygodniej napisana w następujący sposób, co pod maską wywołuje metodę Gather():

input  =                       Slice (0, -1, words, axis=-1)          # strip trailing </s>
labels = ReconcileDynamicAxis (Slice (1,  0, words, axis=-1), input)  # strip leading <s>

Wektor myśli

Poniżej przedstawiono ostatnią próbkę sekwencji ukrytego stanu:

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

Utwórz maskę do użycia z Gather() , aby wybrać odpowiednio pierwszą i ostatnią próbkę sekwencji.

BS.Sequences.IsFirst (dataSequence)
BS.Sequences.IsLast  (dataSequence)

Parametry

  • dataSequence: dowolna sekwencja, np. sekwencja wyrazów

Wartość zwracana

Maska do użycia z Gather() tym wybierze odpowiednio pierwszy lub ostatni element, jednocześnie upuszczając wszystkie inne próbki.

Opis

IsFirst() i IsLast() utwórz maskę do użycia z Gather() , aby wybrać odpowiednio pierwszą i ostatnią próbkę sekwencji, która jest zwykle potrzebna w modelach sekwencjonowania w celu wyodrębnienia "wektor myśli" (ostatni ukryty stan cyklu).

Przykłady

Zobacz tutaj.