2016-01-29 16 views
9

Jestem raczej nowy w sieciach neuronowych i bibliotece Keras i zastanawiam się, w jaki sposób mogę użyć opcji Osadzania warstwy zgodnie z opisem here, aby zamaskować dane wejściowe od tensora 2D do tensora 3D dla RNN.Jak korzystać z warstwy osadzającej dla powtarzalnej sieci neuronowej (RNN) w Kouse

Say dane moi timeseries patrząc następująco (z czasem rosnącej):

X_train = [ 
    [1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    ... 
] # with a length of 1000 

Teraz, powiedzmy chciałbym dać RNN ostatnie 2 wektory właściwości w celu przewidywania wektor cech dla czasu t +1.

Obecnie (bez warstwy osadzania) sam tworzę wymagany tensor 3D z kształtem (nb_samples, timesteps, input_dim) (jak w tym przykładzie here).

Podobne do mojego przykładu, końcowy 3D Tensor będzie wtedy wyglądać następująco:

X_train_2 = [ 
    [[1.0,2.0,3.0,4.0], 
    [2.0,5.0,6.0,7.0]], 
    [[2.0,5.0,6.0,7.0], 
    [3.0,8.0,9.0,10.0]], 
    [[3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0]], 
    etc... 
] 

i Y_train:

Y_train = [ 
    [3.0,8.0,9.0,10.0], 
    [4.0,11.0,12.0,13.0], 
    etc... 
] 

Mój model wygląda następująco (dostosowany do uproszczonym przykładzie powyżej):

num_of_vectors = 2 
vect_dimension = 4 

model = Sequential() 
model.add(SimpleRNN(hidden_neurons, return_sequences=False, input_shape=(num_of_vectors, vect_dimension))) 
model.add(Dense(vect_dimension)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, Y_train, batch_size=50, nb_epoch=10, validation_split=0.15) 

I na koniec moje pytanie brzmiałoby: jak można uniknąć wykonywania tych tensorów 2D Tensor 3D przekształca się i używa zamiast tego warstwy Osadzanie? Chyba po Model = sekwencyjnego() to muszę dodać coś takiego:

model.add(Embedding(?????)) 

Prawdopodobnie odpowiedź jest dość prosta, ja po prostu zdezorientowany dokumentacji warstwy osadzania.

Odpowiedz

7

Ty możesz je następująco:

Uwaga:

  1. I generowane niektóre X i Y jako 0s tylko dać pewne wyobrażenie o strukturze wejściowego.

  2. Jeśli masz multi-klasę y_train, musisz binaryzować.

  3. Być może trzeba dodać dopełnienie, jeśli masz dane o różnej długości.

  4. Jeśli dobrze zrozumiałem o przewidywaniu w czasie t + 1, warto przyjrzeć się nauce Sekwencja.

Spróbuj coś takiego:

hidden_neurons = 4 
nb_classes =3 
embedding_size =10 

X = np.zeros((128, hidden_neurons), dtype=np.float32) 
y = np.zeros((128, nb_classes), dtype=np.int8) 


model = Sequential() 
model.add(Embedding(hidden_neurons, embedding_size)) 
model.add(SimpleRNN(hidden_neurons, return_sequences=False)) 
model.add(Dense(nb_classes)) 
model.add(Activation("softmax")) 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', class_mode="categorical") 
model.fit(X, y, batch_size=1, nb_epoch=1) 
+0

Może powinienem dodać ".0" za wszystkimi moimi numerami. Właściwie to nie próbuję przeprowadzić kategorycznej analizy. – Kito

0

z tego co wiem do tej pory, warstwa Osadzanie wydaje się być bardziej lub mniej do redukcji wymiarowości jak word embedding. W tym sensie nie wydaje się to mieć zastosowania jako ogólne narzędzie do przekształcania.

Zasadniczo jeśli masz odwzorowanie słów na liczby całkowite, takie jak {samochód: 1, mysz: 2 ... zebra: 9999}, Twój tekst wejściowy będzie wektorem słów reprezentowanych przez ich liczbę całkowitą, np. [1, 2 , 9999 ...], co oznaczałoby [samochód, mysz, zebra ...].Wydaje się jednak skuteczne odwzorowywanie słów na wektory liczb rzeczywistych o długości słownika, więc jeśli twój tekst ma 1000 unikalnych słów, zamapowałbyś każde słowo na wektor liczb rzeczywistych o długości 1000. Nie jestem pewien, ale ja myślę, że w większości jest to ważność tego, jak podobne jest znaczenie słowa do wszystkich innych słów, ale nie jestem pewien, czy to jest właściwe, i czy istnieją inne sposoby osadzania słów.