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. PerGather()
, la sua lunghezza deve essere uguale a quella dimaskSequence
, mentre perScatter()
, deve essere uguale al numero di quelli inmaskSequence
.
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.