2017-01-10 31 views
5

Wykonuję model sekwencji do sekwencji w celu wyrównania fonemów. Konkretnie moje dane kolejowe wyglądać sparowanych sekwencji (fonem - długość), gdzie fonem jest jeden gorący wektor i długości jest pływak. Więc chcę karmić model sekwencją fonem i uzyskać odpowiednią długość długości.CNTK: Funkcja utraty sekwencji do przetwarzania sekwencyjnego

Moja sieć jest na ogół zbudowane, takie jak:

model = Sequential(
    EmbeddingLayer{embeddingSize} : 
    RecurrentLSTMLayerStack {lstmDims} : 
    LinearLayer{1} 
) 

LinearLayer{1} należy zrobić konwersję z lstmDims 1 jeśli ja dostać rzeczy prawo. Kiedy więc karmię model sekwencją o długości N, powinienem otrzymać również wynikową długość N.

Teraz chcę ustawić odpowiednią funkcję straty, która moim zdaniem powinna być średnią różnicą między elementami znanej sekwencji wyników i wyjściowego modelu Uśrednianie powinno odbywać się za pomocą osi czasu, aby można było zarządzać sekwencjami o różnych długościach.

miałem zamiar zrobić coś takiego

objectives = Input(1) #actually a sequence here as stated in the reader 
result = model(features) 
errs = Abs(objectives - result) 
loss_function = ReduceMean(errs) 
criterionNodes = (loss_function) 

ale w Reduction Operations to wyraźnie stwierdził, że

Operacje te nie obsługują redukcję nad sekwencjami. Zamiast tego możesz to osiągnąć z powtarzaniem.

Nie jestem pewien, jak korzystać z powtarzalności dla mojego zadania. I nie jestem też pewien, czy cała koncepcja jest w porządku.

Odpowiedz

1

Potrzebne są dwa nawroty, które nie są zbyt skomplikowane (na drugim używamy „wbudowane” działania, którego realizacja jest w pliku cntk.core.bs):

sum = errs + PastValue (0, sum, defaultHiddenActivation=0) 
count = BS.Loop.Count(errs) 
loss_function = sum/count 
+0

Dzięki! Wygląda na to, czego szukałem! Myślałem również o użyciu 'SumElements' zamiast używania powtarzania dla' sum' part, ale nie jest jasne, czy to jest w porządku (SumElements nie ma dostępnej dokumentacji). – Mikhail

0

W GitHub dostępny jest samouczek Sekwencja do sekwencji, który przeprowadza użytkownika przez dane podobne do twojego. Możesz sprawdzić, jak definiuje się sieć.

https://github.com/Microsoft/CNTK/blob/master/Tutorials/CNTK_204_Sequence_To_Sequence.ipynb

+0

Z tego co widzę w samouczek używa funkcji 'cross_entropy_with_softmax' i' classification_error' do klasyfikacji. W moim przypadku nie ma klasyfikacji. Czekam na uzyskanie sekwencji płynów, która jest jak najbliżej sekwencji treningowej. – Mikhail

+0

, jeśli nie masz błędu klasyfikacji; możesz zdefiniować swoją funkcję utraty, powiedzmy myLoss. Następnie podaj pseudonim trenera myLoss ot CNTK.ops.alias (myLoss). Obecnie przyglądamy się temu API bliżej. –

+0

Tak, rozumiem, że potrzebuję innej funkcji, ale nie rozumiem, jak ją napisać, aby działała nad osią dynamiczną (sekwencją). Na tym właśnie polega moje pytanie. Proszę zobaczyć część mojego pytania zaczynając od "Planowałem zrobić coś podobnego". Myślę, że byłoby mi dobrze z ReduceMean, ale nie działa na osi sekwencji. – Mikhail