2016-09-19 12 views
1

Я пытаюсь обучить nn с keras train_on_batch функция. У меня есть 39 функций и вы хотите, чтобы пакет содержал 32 образца. Таким образом, у меня есть список из 32 массивов numpy для каждой итерации обучения.Keras форма функций для обучения

Так вот мой код (здесь каждый batch_x список из 32 Numpy массива каждая из которых содержит 39 функций):

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) 

Но вдруг я получил ошибку:

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: 

Я не совсем уверен, что случилось.

P.S. Я также пробовал разные input_shape, такие как (32, 39), (39, 32) и т. Д.

ответ

4

Вы не хотите 32 массива размера 39, вам нужен один массив размером (32, 39).

Таким образом, вы должны изменить input_shape на (None, 39), None, позволяющий динамически изменять ваш batch_size и изменять batch_x как многомерный массив формы (32, 39).

1

В Keras, выход не ввод измерение - первый аргумент. Keras docs на первой странице пример довольно ясно:

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

Регулировка этот пример соответствует тому, что я предполагаю, что ваши требования:

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

В вашем коде первая позиционная агд в вашем Dense слое 39 который устанавливает выход как 39-D, а не вход, как вы, вероятно, предполагали. Вы сказали, что у вас есть 39 функций ввода. Этот первый уровень (в моей попытке дублировать то, что вы намереваетесь) не выполняет сжатие или извлечение объектов из ваших векторных векторов входных параметров.

Почему бы вам просто не задать размеры ваших входных и выходных массивов для каждого слоя (как в примере) и оставить входной_ форму? Просто измените свои входы (и метки) в соответствии с предположениями по умолчанию? Кроме того, вы можете попробовать запустить базовый метод fit в своем наборе входных данных (или его часть), прежде чем переходить к более сложным схемам, например, вручную тренироваться партиями, как вы это делали.

Вот пример проблемы игрушек с вашей особенностью измерения:

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) 

Что дает:

Epoch 1/10 
1000/1000 [==============================] - 0s - loss: 4.6266  
...  
Epoch 10/10 
1000/1000 [==============================] - 0s - loss: 1.4048e-04 
Смежные вопросы