Контекст:
В настоящее время я работаю над прогнозированием временных рядов с использованием Keras с бэкэндом Tensorflow и, следовательно, изучал приведенный здесь учебник.
После этого урока я пришел к тому, что fit_generator()
генератор для fit_generator()
. Выходные данные, которые генерирует этот генератор, следующие (левая выборка, правая цель):
[[[10. 15.]
[20. 25.]]] => [[30. 35.]] -> Batch no. 1: 2 Samples | 1 Target
---------------------------------------------
[[[20. 25.]
[30. 35.]]] => [[40. 45.]] -> Batch no. 2: 2 Samples | 1 Target
---------------------------------------------
[[[30. 35.]
[40. 45.]]] => [[50. 55.]] -> Batch no. 3: 2 Samples | 1 Target
---------------------------------------------
[[[40. 45.]
[50. 55.]]] => [[60. 65.]] -> Batch no. 4: 2 Samples | 1 Target
---------------------------------------------
[[[50. 55.]
[60. 65.]]] => [[70. 75.]] -> Batch no. 5: 2 Samples | 1 Target
---------------------------------------------
[[[60. 65.]
[70. 75.]]] => [[80. 85.]] -> Batch no. 6: 2 Samples | 1 Target
---------------------------------------------
[[[70. 75.]
[80. 85.]]] => [[90. 95.]] -> Batch no. 7: 2 Samples | 1 Target
---------------------------------------------
[[[80. 85.]
[90. 95.]]] => [[100. 105.]] -> Batch no. 8: 2 Samples | 1 Target
В учебном TimeSeriesGenerator
использовался TimeSeriesGenerator
, но для моего вопроса второстепенно, если используется пользовательский генератор или этот класс. Что касается данных, у нас есть 8 steps_per_epoch и образец формы (8, 1, 2, 2). Генератор подается в рекуррентную нейронную сеть, реализованную LSTM.
Мои вопросы
fit_generator()
допускает только одну цель на пакет, как TimeSeriesGenerator
. Когда я впервые прочитал о параметрах пакетов для fit(), я подумал, что у меня может быть несколько выборок и соответствующее количество целей (которые обрабатываются партиями, то есть строка за строкой). Но это не разрешено fit_generator()
и, следовательно, очевидно ложно. Это будет выглядеть, например, как:
[[[10. 15. 20. 25.]]] => [[30. 35.]]
[[[20. 25. 30. 35.]]] => [[40. 45.]]
|-> Batch no. 1: 2 Samples | 2 Targets
---------------------------------------------
[[[30. 35. 40. 45.]]] => [[50. 55.]]
[[[40. 45. 50. 55.]]] => [[60. 65.]]
|-> Batch no. 2: 2 Samples | 2 Targets
---------------------------------------------
...
Во-вторых, я подумал, что, например, [10, 15] и [20, 25] использовались в качестве входных данных для RNN последовательно для цели [30, 35], что означает, что это аналог ввода [10, 15, 20 25]. Поскольку выходной сигнал от RNN отличается при использовании второго подхода (я проверял его), это также должно быть неверным выводом.
Следовательно, мои вопросы:
- Почему разрешена только одна цель на партию (я знаю, что есть некоторые обходные пути, но должна быть причина)?
- Как я могу понять расчет одной партии? Имеется в виду, как обрабатывается некоторый ввод, такой как
[[[40, 45], [50, 55]]] => [[60, 65]]
и почему он не является аналогом[[[40, 45, 50, 55]]] => [[60, 65]]
Редактировать в соответствии с сегодняшним ответом
Так как есть определенное недопонимание относительно моего определения образцов и целей - я следую тому, что, как я понимаю, Керас пытается сказать мне, говоря:
ValueError: Входные массивы должны иметь то же количество выборок, что и целевые массивы. Найдено 1 входных образцов и 2 целевых образца.
Эта ошибка возникает, когда я создаю, например, пакет, который выглядит следующим образом:
#This is just a single batch - Multiple batches would be fed to fit_generator()
(array([[[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]]]),
array([[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]))
Предполагается, что это будет один пакет, содержащий две временные последовательности длиной 5 (5 последовательных точек данных/временных шагов), целью которых также являются две соответствующие последовательности. [ 5, 6, 7, 8, 9]
является целью [0, 1, 2, 3, 4]
а [10, 11, 12, 13, 14]
является соответствующей целью [5, 6, 7, 8, 9]
.
Образец-формы в этом случае будет shape(number_of_batches, number_of_elements_per_batch, sequence_size)
и целевой формой shape(number_of_elements_per_batch, sequence_size)
.
Керас видит 2 целевых образца (в ValueError), потому что у меня есть два, которые предоставляют 3D-образцы в качестве входных данных и 2D-цели в качестве выходных (возможно, я просто не понимаю, как предоставить 3D-цели...).
Так или иначе, согласно ответу/комментариям @todays, это интерпретируется Keras как два временных шага и пять функций. Что касается моего первого вопроса (где я все еще вижу последовательность в качестве цели для моей последовательности, как в этом примере редактирования), я ищу информацию о том, как/если я могу достичь этого и как будет выглядеть такая партия (как я пытался визуализировать в вопрос).