Condividi tramite


Raccogliere e a dispersione

Gather(), Scatter()

Abbreviare o allungare una sequenza di dati in base a una maschera.

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

Parametri

  • maskSequence: sequenza di 0 o 1 (dimensione [1]tensor statica), dove 1 indica campioni da mantenere. Qualsiasi altro valore dà origine a un comportamento non definito e potrebbe cambiare in futuro.
  • dataSequence: sequenza di dati da elaborare. Per Gather(), la sua lunghezza deve essere uguale a quella di maskSequence, mentre per Scatter(), deve essere uguale al numero di quelli in maskSequence.

Valore restituito

Per Gather(), una sequenza che contiene un subset di dataSequence, con alcuni esempi eliminati. La lunghezza della sequenza di risultati sarà uguale al numero di quelli in maskSequence.

Per Scatter(), una sequenza che contiene campioni di dataSequence e zeri inseriti. La sequenza di risultati avrà la stessa lunghezza di maskSequence.

Descrizione

Gather() e Scatter() consentono di abbreviare o allungare una sequenza di input, ad esempio una sequenza di parole, in base a una sequenza di maschera.

Gather() restituisce la sequenza secondaria di tali campioni dataSequence[n] per cui maskSequence[n] è 1, mentre quelli per cui la maschera è 0 verranno eliminati.

Scatter() accetta gli elementi di una sottosezione e li inserisce in una sequenza più lunga, inserendo zeli.

Ad esempio:

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() viene spesso usato indirettamente tramite Slice(..., axis=-1), BS.Sequences.First()e BS.Sequences.Last().

Esempio

Modello linguistico ricorrente

Data una sequenza di parole del formato <s> A B C ... </s>, un modello linguistico assume la input forma <s> A B C ... per stimare labels il formato A B C ... </s>. Gather() consente di leggere una singola sequenza di parole dal file e quindi di creare input e labels rilasciando rispettivamente l'elemento finale </s> e iniziale <s>:

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)

Nota: l'operazione Gather() può essere scritta più facilmente come segue, che sotto le quinte chiama Gather():

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

Vettore di pensiero

Di seguito viene selezionato l'ultimo esempio di una sequenza di stato nascosto:

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

Creare una maschera da usare con Gather() per selezionare rispettivamente il primo e l'ultimo esempio di una sequenza.

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

Parametri

  • dataSequence: qualsiasi sequenza, ad esempio una sequenza di parole

Valore restituito

Maschera da utilizzare con Gather() che selezionerà rispettivamente il primo o l'ultimo elemento, eliminando tutti gli altri campioni.

Descrizione

IsFirst() e IsLast() creare una maschera da usare con Gather() per selezionare rispettivamente il primo e l'ultimo campione di una sequenza, che in genere è necessario nei modelli da sequenza a sequenza per estrarre il "vettore pensiero" (l'ultimo stato nascosto di una ricorrenza).

Esempio

Vedere qui.