9

Je suis plutôt nouveau à Neural Networks et la bibliothèque Keras et je me demande comment je peux utiliser la couche d'incorporation comme décrit here pour masquer mes données d'entrée d'un tenseur 2D à un tenseur 3D pour un RNN.Comment utiliser la couche d'intégration pour le réseau neuronal récurrent (RNN) dans Keras

Dites mes timeseries données à la recherche comme suit (avec une augmentation du temps):

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 

Maintenant, dis que je voudrais donner le RNN les 2 derniers vecteurs de caractéristiques afin de prédire la fonction vecteur pour le temps t +1

Actuellement (sans le calque d'intégration), je crée moi-même le tenseur 3D requis avec la forme (nb_samples, timesteps, input_dim) (comme dans cet exemple here).

liés à mon exemple, la finale Tensor 3D serait alors se présenter comme suit:

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... 
] 

et Y_train:

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

Mon modèle se présente comme suit (adapté à l'exemple simplifié ci-dessus):

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) 

Enfin, ma question serait, comment puis-je éviter de faire ces tenseurs 2D à Tenseur 3D me remodeler et utiliser le calque d'incorporation à la place? Je suppose que, après modèle = séquentiel() Je dois ajouter quelque chose comme:

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

Probablement la réponse est assez simple, je suis tout simplement confus par la documentation de la couche d'enrobage.

Répondre

7

Vous pouvez vous comme suit:

Note:

  1. Je produit quelques x et y 0s juste pour vous donner une idée de la structure d'entrée.

  2. Si vous avez une classe y_train multi, vous devrez effectuer une binarisation.

  3. Vous devrez peut-être ajouter un remplissage si vous avez des données de différentes longueurs.

  4. Si j'ai bien compris à propos de la prédiction à l'instant t + 1, vous pouvez regarder l'apprentissage Sequence to Sequence.

Essayez quelque chose comme:

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

peut-être que j'aurais dû ajouter un ".0" derrière tous mes numéros. En fait, je n'essaie pas d'effectuer une analyse catégorique. – Kito

0

D'après ce que je sais à ce jour, la couche d'intégration semble être plus ou moins pour la réduction de dimensionnalité comme word embedding. Donc, en ce sens, il ne semble pas applicable en tant qu'outil de remodelage général. Fondamentalement, si vous avez un mappage de mots à des entiers comme {car: 1, mouse: 2 ... zebra: 9999}, votre texte d'entrée serait un vecteur de mots représentés par leur entier, comme [1, 2 , 9999 ...], ce qui signifierait [voiture, souris, zèbre ...].Mais il semble efficace de mapper des mots à des vecteurs de nombres réels avec la longueur du vocabulaire, donc si votre texte a 1000 mots uniques, vous devez mapper chaque mot à un vecteur de nombres réels avec une longueur de 1000. Je ne suis pas sûr mais Je pense que cela représente en grande partie le poids de la signification d'un mot pour tous les autres mots, mais je ne suis pas sûr que ce soit juste et qu'il y ait d'autres façons d'incorporer des mots.