#python #keras #deep-learning #conv-neural-network #recurrent-neural-network
#python #keras #глубокое обучение #conv-нейронная сеть #рекуррентная нейронная сеть
Вопрос:
Предположим, у меня есть следующая модель в keras:
model = keras.models.Sequential([
keras.layers.Conv1D(filters=20, kernel_size=4, strides=2, padding="valid",
input_shape=[None, 1]),
keras.layers.GRU(20, return_sequences=True),
keras.layers.GRU(20, return_sequences=True),
keras.layers.TimeDistributed(keras.layers.Dense(1))
])
Ему будут предоставлены одномерные данные временного ряда, и он будет предсказывать следующее значение в данных временного ряда.
У нее есть сверточный слой, предназначенный для уменьшения выборки входных данных, за которым следуют 2 модуля GRU, которые будут обрабатывать каждый временной шаг. Предположим, что именно так выглядят входные X
и выходные Y
данные с точки зрения индексов. В этом наборе данных 51 образец. Для каждого индекса X
прогноз Y
выполняется на один шаг вперед в наборе данных.
X: 0 1 2 3 4 5 6 7 8 9 10 11 12 ... 42 43 44 45 46 47 48 49
Y: 1 2 3 4 5 6 7 8 9 10 11 12 13 ... 43 44 45 46 47 48 49 50
После того, как я применю сверточный слой, входные данные X
изменятся, и это означает, что нам также придется изменить выходные данные Y
. Сверточный слой возьмет 4 выборки из набора данных и преобразует его в 1 скаляр, который будет представлять 4 выборки. Поскольку у нас есть 20 фильтров, это будет сделано 20 раз для каждой комбинации из 4 выборок в наборе данных с шагом 2. Итак, вот как сверточный слой будет применен к входному набору данных:
|-----2-----| |-----5---...------| |-----23----|
|-----1-----| |-----4-----| ... |-----22----|
|-----0----| |-----3-----| |---...|-----21----|
X: 0 1 2 3 4 5 6 7 8 9 10 11 12 ... 42 43 44 45 46 47 48 49
Y: 1 2 3 4 5 6 7 8 9 10 11 12 13 ... 43 44 45 46 47 48 49 50
После применения сверточного слоя входные данные X
и измененные выходные данные Y
будут выглядеть следующим образом:
X: 0/3 2/5 4/7 6/9 8/11 10/13 ... 42/45 44/47 46/49
Y: 4 6 8 10 12 14 46 48 50
Где, например, 0/3
in X
означает представление первых 4 выборок в исходных данных, и каждый экземпляр в новых X
фактически является 20-мерным вектором, поскольку мы использовали 20 фильтров в сверточном слое. Нам также пришлось изменить выходные данные, чтобы алгоритм не мог заглядывать в будущее. Он по-прежнему будет предсказывать значение временного ряда на шаг вперед, но нам пришлось изменить его Y
таким образом, чтобы теперь каждая выборка была на шаг впереди новой X
.
Предположим, я скомпилирую и обучу эту модель. Вот что меня смущает: предположим, я хочу использовать это в реальном мире. Я получаю 1 образец из реального мира. Как этот образец будет обработан с помощью модели? Разве мне не нужно 4 образца для правильного нанесения сверточного слоя? Если у меня теперь есть только этот один новый экземпляр, а не 4, как модель может предсказать следующее значение? Что произойдет? Я действительно не понимаю, как это будет работать…
Комментарии:
1. Если вы вводите слой свертки, вам не кажется, что вы вводите дополнительный обучаемый параметр?
2. Правильно ли я понимаю, что в вашем исходном наборе данных есть только 1 последовательность с 51 временным шагом? Действительно ли вышеупомянутая модель работает с вашими данными?
3. @Akash_Kumar Да, я ввожу дополнительные обучаемые параметры. Я знаю. Что насчет этого?
4. @runDOSrun Необязательно только 1 последовательность, может быть больше последовательностей. Это слегка измененный пример из «Практического машинного обучения» Аурелиона Герона. В книге алгоритм предсказывал не только на 1 шаг вперед, но фактически на 10 шагов вперед. Итак, если мы находимся в момент времени t, алгоритм из книги будет предсказывать значения в моменты времени t 1, t 2, …, t 10. Автор использовал 10000 последовательностей длиной 51, так что это не просто одна последовательность. Тем не менее, вопрос остается в силе. Если я получу 1 образец из реального мира, как алгоритм сделает прогноз? Как этот 1 образец проходит через сверточный слой?
5. Проблема в том, что вы используете «образцы» неоднозначно: я думаю, что под «1 образцом» вы имеете в виду не «1 последовательность длиной 51», а «1 последовательность длиной 1», верно? В этом проблема. 2D CNN на самом деле не обучен этому. Она обучена для последовательностей из 51 элемента. Вы, конечно, можете это сделать, но для этого вам придется либо а) избавиться от CNN и запустить свой RNN в
stateful
режиме, либо б) обучать последовательности длиной 4 (не 51).