Próbuję zacząć uczyć się o RNN i używam Keras. Rozumiem podstawowe założenie waniliowych warstw RNN i LSTM, ale mam problem ze zrozumieniem pewnej technicznej kwestii szkolenia.
W dokumentacji keras napisano, że wejście do warstwy RNN musi mieć kształt (batch_size, timesteps, input_dim)
. Sugeruje to, że wszystkie przykłady treningu mają ustaloną długość sekwencji, a mianowicie timesteps
.
Ale to nie jest szczególnie typowe, prawda? Może chciałbym, aby RNN działał na zdania o różnej długości. Kiedy będę ćwiczyć na jakimś korpusie, nakarmię go partiami zdań o różnej długości.
Przypuszczam, że oczywistą rzeczą byłoby znalezienie maksymalnej długości dowolnej sekwencji w zestawie treningowym i zerowanie jej. Ale czy to oznacza, że nie mogę przewidywać w czasie testu przy większej długości wejściowej?
To pytanie dotyczy konkretnej implementacji Keras, ale sądzę, że pytam również, co ludzie zazwyczaj robią, gdy napotykają tego rodzaju problemy w ogóle.
Masking
warstwę, aby ignorowaćOdpowiedzi:
Nie jest to do końca poprawne, ponieważ ten wymiar może być
None
, tzn. O zmiennej długości. W ramach jednej partii musisz mieć taką samą liczbę kroków czasowych (zwykle w tym miejscu widać 0-padding i maskowanie). Ale między partiami nie ma takich ograniczeń. Podczas wnioskowania możesz mieć dowolną długość.Przykładowy kod, który tworzy losowe partie danych treningowych.
I to właśnie drukuje. Uwaga: kształty wyjściowe
(None, None, x)
wskazują zmienny rozmiar partii i zmienny rozmiar taktowania.źródło
fit()
możemy przekazaćsequence_lenth
parametr, aby określić długość sekwencji, aby go wykluczyć. Wydaje się, że podejście generatora nie pozwala zignorować 0 sekwencji?(inputs, targets, sample_weights)
i możesz ustawićsample_weights
0-padów na 0. Jednak nie jestem pewien, czy zadziałałoby to idealnie dla dwukierunkowych numerów RNN.model.predict_generator
z zestawem testowym. Kiedy próbuję przewidzieć za pomocą generatora, pojawia się błąd dotyczący konkatenacji (zestaw testowy ma również sekwencje o zmiennej długości). Moim rozwiązaniem byłomodel.predict
hackowanie standardu . Być może byłoby to lepiej dostosowane do nowego pytania?@kbrose wydaje się mieć lepsze rozwiązanie
Zazwyczaj jest to dobre rozwiązanie. Może wypróbuj maksymalną długość sekwencji + 100. Użyj tego, co najlepiej pasuje do twojej aplikacji.
Niekoniecznie. Powodem użycia stałej długości w kamerach jest to, że znacznie poprawia wydajność poprzez tworzenie tensorów o ustalonych kształtach. Ale to tylko na trening. Po treningu nauczysz się odpowiednich ciężarów do swojego zadania.
Załóżmy, że po wielogodzinnych treningach zdajesz sobie sprawę, że maksymalna długość twojego modelu nie była wystarczająco duża / mała i teraz musisz zmienić przedziały czasowe, po prostu wyodrębnij wyuczone ciężary ze starego modelu, zbuduj nowy model z nowymi krokami czasowymi i wstrzykuje do niego wyuczone ciężary.
Prawdopodobnie możesz to zrobić za pomocą:
new_model.set_weights(old_model.get_weights())
Sam tego nie wypróbowałem. Spróbuj i opublikuj swoje wyniki tutaj z korzyścią dla wszystkich. Oto kilka linków: raz dwa
źródło
max length + 100
. Zobacz moją odpowiedź na przykład kod.Bidirectional(LSTM)()
iRepeatVector()
warstwy, a prognozy są całkowicie wykonalne.