Python / Keras / Neural Networks – основы для ее запуска

Я начинаю работать с Keras, чтобы делать прогнозы. Я понимаю концепцию и всю теорию, лежащую в ее основе. Но мне тяжело это сделать. На этом этапе я не беспокоюсь об эффективности этого, я просто хочу запустить его и посмотреть результат, чтобы потом я мог развиваться.

У меня есть этот фиктивный Pandas DataFrame, который я использую как predor_train (X):

Value 1lag 2lag 3lag 4lag... Date 2005-04-01 231.721933 165.195418 170.418903 225.892387 206.282539 2005-05-01 163.259812 231.721933 165.195418 170.418903 225.892387 2005-06-01 211.649963 163.259812 231.721933 165.195418 170.418903 2005-07-01 249.054951 211.649963 163.259812 231.721933 165.195418 2005-08-01 168.657539 249.054951 211.649963 163.259812 231.721933 2005-09-01 179.623448 168.657539 249.054951 211.649963 163.259812 2005-10-01 228.437842 179.623448 168.657539 249.054951 211.649963 2005-11-01 165.805266 228.437842 179.623448 168.657539 249.054951 ... [129 rows x 96 columns] 

У меня есть другой DataFrame, который я использую как target_train (Y):

 Date 2005-04-01 -0.01136 2005-05-01 0.04713 2005-06-01 0.00329 2005-07-01 -0.00985 2005-08-01 0.05635 2005-09-01 -0.03766 2005-10-01 0.01848 2005-11-01 -0.01387 [129 rows x 1 column] 

Я использую следующий код:

 from keras.models import Sequential from keras.layers.core import Dense, Activation model=Sequential() model.add(Dense(output_dim=64, input_dim=100, init="glorot_uniform")) model.add(Activation("tanh")) model.add(Dense(output_dim=10, init="glorot_uniform")) model.add(Activation("linear")) model.compile(loss="mean_squared_error", optimizer="rmsprop") model.fit(predictor_train, target_train, nb_epoch=5, batch_size=32,show_accuracy=True) prediction=model.predict(predictor_train) print prediction 

И я получаю следующую ошибку:

 File "/Users/file.py", line 1271, in var_neural_reg1 model.fit(predictor_train, target_train, nb_epoch=5, batch_size=32,show_accuracy=True) File "/Library/Python/2.7/site-packages/keras/models.py", line 581, in fit shuffle=shuffle, metrics=metrics) File "/Library/Python/2.7/site-packages/keras/models.py", line 230, in _fit ins_batch = slice_X(ins, batch_ids) File "/Library/Python/2.7/site-packages/keras/models.py", line 65, in slice_X return [x[start] for x in X] File "/Library/Python/2.7/site-packages/pandas/core/frame.py", line 1908, in __getitem__ return self._getitem_array(key) File "/Library/Python/2.7/site-packages/pandas/core/frame.py", line 1953, in _getitem_array return self.take(indexer, axis=1, convert=True) File "/Library/Python/2.7/site-packages/pandas/core/generic.py", line 1370, in take convert=True, verify=True) File "/Library/Python/2.7/site-packages/pandas/core/internals.py", line 3508, in take indexer = maybe_convert_indices(indexer, n) File "/Library/Python/2.7/site-packages/pandas/core/indexing.py", line 1721, in maybe_convert_indices raise IndexError("indices are out-of-bounds") IndexError: indices are out-of-bounds 

Какие-нибудь идеи о том, как сделать этот мамонт?

Таким образом, вы не хотите, чтобы ваш input_dim был input_dim 129. Это всего лишь количество образцов. Keras действительно не волнует, если ваши данные имеют 1 строку или 1 миллион строк; это не размерность ваших данных. Если ваши данные были массивом numpy, форма ввода была бы (1, 2, 3) = (2, 3). Количество строк (1) не имеет значения.

Но это не проблема. Ошибка, которую вы получаете, не связана с вашей указанной размерностью. Если это так, то вы получите другую ошибку ( ValueError а не IndexError ), которая будет отслеживаться на вашем бэкэнд (Theano или Tensorflow), если на самом деле было несоответствие формы между вашими данными и то, что вы указали в модели , Например:

 ValueError: ('shapes (x,x) and (x,x) not aligned: x (dim 1) != x (dim 0)', (x, x), (x, x)) 

Рассматривая сообщение об ошибке, это проблема с тем, как вы предварительно обрабатываете свои данные; т.е. проблема связана с пандами, а не с Keras. Вы используете функцию slice_X для сегментации ваших данных, но когда Keras говорит с pandas и сообщает, что вы хотите получить данные из dataframe[x:y] , pandas отвечает, что указанные вами индексы не являются действительный с учетом вашего фрейма данных.

Однако после сортировки вы можете столкнуться с разными ошибками, когда ваша программа попадет на функции model.fit которые вы вызываете в model.fit . В частности, вы, вероятно, увидите несоответствие формы между вашими данными и ожидаемой моделью. Как кодируются ваши столбцы перед тем, как их подавать в вашу модель Keras? Keras ожидает массив numpy для X и y в model.fit . Кроме того, какой выход вы ожидаете, так что output_dim = 10 ?

Я рекомендую этот пример Keras, который показывает последовательность для прогнозирования последовательности с помощью модели LSTM, в этом случае дополнение для обучения, поскольку оно делает именно то, что вы хотите; т.е. это конкретный пример, показывающий, что модель работает и развивается в каждую эпоху.

 -------------------------------------------------- Iteration 1 Train on 45000 samples, validate on 5000 samples Epoch 1/1 45000/45000 [==============================] - 30s - loss: 1.6745 - acc:0.3927- val_loss: 1.5373 - val_acc: 0.4320 Q 58333+69862 T 128195 ☒ 13335 --- . . . --- Q 83911+65 T 83976 ☒ 11115 --- 

Модель начинает изучать, что происходит вокруг эпохи 7:

 Iteration 7 Train on 45000 samples, validate on 5000 samples Epoch 1/1 45000/45000 [==============================] - 31s - loss: 0.9129 - acc: 0.6549 - val_loss: 0.9117 - val_acc: 0.6510 Q 80+3375 T 3455 ☒ 3420 --- . . . --- Q 6+50853 T 50859 ☑ 50859 <-------------------------- --- 

Вы можете добавить следующую строку печати к функции decode в классе CharacterTable следующим образом, чтобы увидеть, что происходит. В этом случае вопросы с добавлением источника вводятся в обратном порядке, что повышает производительность в этом типе модели за счет введения краткосрочных зависимостей между входами и целями ( Sutskever, Vinyals и Le 2014 )

  def decode(self, X, calc_argmax=True): if calc_argmax: X = X.argmax(axis=-1) print('{0} --> {1}'.format(X, [self.indices_char[x] for x in X])) return ''.join(self.indices_char[x] for x in X) 

Например:

 Iteration 3 Train on 45000 samples, validate on 5000 samples Epoch 1/1 45000/45000 [==============================] - 21s - loss: 1.4865 - acc: 0.4491 - val_loss: 1.4132 - val_acc: 0.4676 [ 0 11 12 2 4 11 12] --> [' ', '7', '8', '+', '0', '7', '8'] [13 9 11 0] --> ['9', '5', '7', ' '] [12 4 11 0] --> ['8', '0', '7', ' '] Q 870+87 T 957 ☒ 807 --- [ 0 8 10 3 8 4 10] --> [' ', '4', '6', '-', '4', '0', '6'] [9 8 4 0] --> ['5', '4', '0', ' '] [10 4 13 0] --> ['6', '0', '9', ' '] Q 604-64 T 540 ☒ 609 --- 

Эта модель кодировщика / декодера может быть легко изменена, чтобы адаптироваться к другим типам последовательности для проблем прогнозирования последовательности.

Вероятно, вы захотите пересмотреть код в соответствии с вашими данными. Но в вашем случае, если вы собираетесь подавать вышеуказанные данные в модель как есть, я считаю, что ваш input_dim будет len('0123456789.- ') , поскольку это размерность ваших данных; т.е. набор всех символов ваших входов и целей. В этом связанном примере последовательности преобразуются в однострочные кодировки отдельных символов.

Итак, вы должны указать форму ввода в первом слое модели:

 model.add(LSTM(HIDDEN_DIMENSIONS, input_shape=(MAX_LENGTH, INPUT_DIMENSIONALITY)))