2016-09-19 1 views
1

J'essaie de former nn avec keras train_on_batch fonction. J'ai 39 fonctions et je veux qu'un lot contienne 32 échantillons. J'ai donc une liste de 32 tableaux numpy pour chaque itération d'entraînement.Keras forme de fonctionnalités pour la formation

Alors, voici mon code (ici chaque batch_x est une liste de 32 tableau numpy contenant chacun 39 caractéristiques):

input_shape = (39,) 

model = Sequential() 
model.add(Dense(39, input_shape=input_shape)) # show you is only first layer 
... 

for batch_x, batch_y in train_gen: 
    model.train_on_batch(batch_x, batch_y) 

Mais tout à coup je me suis une erreur:

Exception: Error when checking model input: the list of Numpy arrays 
that you are passing to your model is not the size the model expected. 
Expected to see 1 arrays but instead got the following list of 32 arrays: 

Je suis pas vraiment sûr de ce qui ne va pas.

P.S. J'ai également essayé différents input_shape tels que (32, 39), (39, 32) etc.

Répondre

4

Vous ne voulez pas 32 tableaux de taille 39, vous voulez un tableau de taille (32, 39).

Vous devez donc modifier input_shape en (None, 39), None vous permettant de modifier dynamiquement votre taille de lot, et changer batch_x en un tableau de forme (32, 39).

1

Dans Keras, la sortie pas la dimension entrée est le premier argument. Le Keras docs exemple en première page est assez clair:

model.add(Dense(output_dim=64, input_dim=100)) 

Réglage de cet exemple pour correspondre à ce que je suppose que sont vos besoins:

model.add(Dense(output_dim=39, input_dim=39)) 

Dans votre code, la première arg position dans votre couche Dense est 39 qui définit la sortie comme étant 39-D, pas l'entrée, comme vous l'avez probablement supposé. Vous avez dit que vous aviez 39 fonctions d'entrée. Cette première couche (dans ma tentative de dupliquer ce que vous aviez l'intention de faire) n'effectue aucune extraction de compression ou de fonctionnalité à partir de vos vecteurs d'entités en entrée de 39 dimensions. Pourquoi ne pas simplement définir les dimensions de vos tableaux d'entrée et de sortie pour chaque couche (comme dans l'exemple) et laisser l'entrée seule forme ? Juste remodeler vos entrées (et étiquettes) pour correspondre aux hypothèses par défaut? En outre, vous pouvez essayer d'exécuter la méthode de base fit sur votre jeu de données d'entrée (ou une partie de celui-ci) avant de passer à des arrangements plus complexes, comme l'entraînement manuel par lots comme vous l'avez fait.

Voici un exemple pour un problème de jouet avec votre dimension caractéristique:

from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.regularizers import l1l2 

X = np.random.randn(1000, 39) 
y = np.array([X[i,7:13].sum() for i in range(X.shape[0])]) 

nn = Sequential() 
nn.add(Dense(output_dim=1, input_dim=39)) 
nn.compile('sgd', 'mse') 
nn.fit(X, y, nb_epoch=10) 

Ce qui donne:

Epoch 1/10 
1000/1000 [==============================] - 0s - loss: 4.6266  
...  
Epoch 10/10 
1000/1000 [==============================] - 0s - loss: 1.4048e-04