#python #deep-learning #lstm
#python #глубокое обучение #lstm
Вопрос:
Я выполнял прогнозирование временных рядов seq2seq с использованием архитектуры LSTM кодировщика-декодера. Входные данные в модель имеют 2 объекта, которые по сути представляют собой два массива: один является зависимой переменной (y-значения), а другой — независимой переменной (x-значения). Форма массива равна:
input_shape: (57, 20, 2)
Где, например, значения x и y одного временного ряда имеют форму (1, 20, 2), а их позиции в 3D-массиве являются:
x = input_shape[:][:, 0]
y = input_shape[:][:, 1]
Теперь я столкнулся с проблемой подачи точки (так сказать, временного шага xy) в качестве дополнительной функции. Есть ли какой-либо способ сделать это?
РЕДАКТИРОВАТЬ: я добавил модель, которую я использую, на основе запросов в комментариях. Можно отметить, что размер ввода, о котором я упоминал, здесь невелик по соображениям простоты. Фактический ввод, который я использую, довольно большой.
model = Sequential()
model.add(Masking(mask_value=0, input_shape = (input_shape.shape[1], 2)))
model.add(Bidirectional(LSTM(128, dropout=0, return_sequences=True, activation='tanh')))
model.add(Bidirectional(LSTM(128, dropout=0, return_sequences=False)))
model.add((RepeatVector(targets.shape[1])))
model.add(Bidirectional(LSTM(128, dropout=0, return_sequences=True, activation='tanh')))
model.add(Bidirectional(LSTM(128, dropout=0, return_sequences=True)))
model.add(TimeDistributed(Dense(64, activation='relu')))
model.add(TimeDistributed(Dense(1, activation='linear')))
model.build()
model.compile(optimizer=optimizers.Adam(0.00001), loss = 'MAE')
Комментарии:
1. Ваша точка — это другая функция или значение y с задержкой во времени? Вы пытаетесь передать ее в свой кодировщик или в свой декодер в качестве другого набора входных данных вместе с состояниями вашего уровня кодировщика?
2. Предполагается, что точка является особой точкой среди значений y, индекс которой будет соответствующим значением x. Эта точка является входом (точно так же, как и другие 2 объекта) для кодировщика, а выходные данные кодировщика передаются в декодер.
3. Возможно, я ошибаюсь, но похоже, что вы хотите реализовать что-то похожее на механизм внимания, где в вашем вводе есть специальный временной интервал, на котором вы хотите, чтобы ваша сеть сосредоточилась. Возможно, это поможет? stats.stackexchange.com/questions/344508 /… . Если вы непреклонны в своем текущем подходе, lmk, я мог бы помочь
4. Также я немного смущен тем, какова форма вашего желаемого ввода. В настоящее время у вас есть как y, так и x на каждом временном шаге, придающие форму (57,20,2), поэтому не должна ли одна партия быть (1,20,2), а не (1,20,1)? Вы пытаетесь добавить значения y, x специального временного интервала за последние 20 во все ваши другие временные интервалы в пределах этих 20 временных интервалов, чтобы ввести (57,20,4)?
5. Ах, да, извините. Моя ошибка. Да, каждая партия должна иметь форму (1, 20, 2), и я хочу добавить этот специальный временной шаг x-y, чтобы сделать чистый ввод (57, 20, 4). Я внес правку в свой пост :). Кроме того, я использовал механизмы внимания, и это может не решить проблему. По сути, у меня возникают проблемы с представлением точки в качестве дополнительной функции, где другие (уже существующие) функции являются массивами.
Ответ №1:
Я бы дал вашей модели два входных сигнала, где первый входной сигнал — это ваш обычный временной ряд в форме (пакет, 20, 2), а второй ввод — ваш особый момент времени в форме (пакет, 2). Затем определите следующую архитектуру, которая повторяет вашу специальную точку 20 раз, чтобы получить (пакет, 20, 2), которая затем объединяется с вашим обычным вводом. (Обратите внимание, что я определил, target_shape_1
чтобы убедиться, что он компилируется с моей стороны, но вы можете заменить его на target.shape[1]
)
input_shape_1 = 20
target_shape_1 = 3
normal_input = Input(shape=(20, 2), name='normal_inputs') #your normal time series (None,20,2) (Batch,time,feats)
key_time_point = Input(shape=(2),name='key_time_point') #your single special point (None,2) (Batch,feats)
key_time_repeater = RepeatVector(20,name='key_time_repeater') #repeat your special point 20 times
key_time_repeater_out = key_time_repeater(key_time_point) #turning your (None,2) into (None,20,2)
initial_mask = Masking(mask_value=0, input_shape = (20, 4))
masked_out = initial_mask(
#concat your normal input (None,20,2) and repeated input (None,20,2)
#into (None, 20,4) and feed to nn
tf.concat([normal_input,key_time_repeater_out],len(normal_input.shape)-1)
)
encoder_1 = Bidirectional(LSTM(128, dropout=0, return_sequences=True, activation='tanh'))
encoder_2 = Bidirectional(LSTM(128, dropout=0, return_sequences=False))
encoder_repeat = RepeatVector(target_shape_1)
encoder_out = encoder_repeat(encoder_2(encoder_1(masked_out)))
decoder_1 = Bidirectional(LSTM(128, dropout=0, return_sequences=True, activation='tanh'))
decoder_2 = Bidirectional(LSTM(128, dropout=0, return_sequences=True))
decoder_dense = TimeDistributed(Dense(64, activation='relu'))
decoder_out = decoder_dense(decoder_2(decoder_1(encoder_out)))
final_output = TimeDistributed(Dense(1, activation='linear'))(decoder_out)
model = tf.keras.models.Model(inputs=[normal_input, key_time_point], outputs=final_output)
model.compile(optimizer=tf.keras.optimizers.Adam(0.00001), loss = 'MAE')
summary()
Часть модели выглядит следующим образом:
Model: "model_1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
key_time_point (InputLayer) [(None, 2)] 0
__________________________________________________________________________________________________
normal_inputs (InputLayer) [(None, 20, 2)] 0
__________________________________________________________________________________________________
key_time_repeater (RepeatVector (None, 20, 2) 0 key_time_point[0][0]
__________________________________________________________________________________________________
tf_op_layer_concat_3 (TensorFlo [(None, 20, 4)] 0 normal_inputs[0][0]
key_time_repeater[0][0]
__________________________________________________________________________________________________
masking_4 (Masking) (None, 20, 4) 0 tf_op_layer_concat_3[0][0]
__________________________________________________________________________________________________
bidirectional_12 (Bidirectional (None, 20, 256) 136192 masking_4[0][0]
__________________________________________________________________________________________________
bidirectional_13 (Bidirectional (None, 256) 394240 bidirectional_12[0][0]
__________________________________________________________________________________________________
repeat_vector_11 (RepeatVector) (None, 3, 256) 0 bidirectional_13[0][0]
__________________________________________________________________________________________________
bidirectional_14 (Bidirectional (None, 3, 256) 394240 repeat_vector_11[0][0]
__________________________________________________________________________________________________
bidirectional_15 (Bidirectional (None, 3, 256) 394240 bidirectional_14[0][0]
__________________________________________________________________________________________________
time_distributed_7 (TimeDistrib (None, 3, 64) 16448 bidirectional_15[0][0]
__________________________________________________________________________________________________
time_distributed_8 (TimeDistrib (None, 3, 1) 65 time_distributed_7[0][0]
==================================================================================================
Total params: 1,335,425
Trainable params: 1,335,425
Non-trainable params: 0
__________________________________________________________________________________________________
Комментарии:
1. У меня не было никаких данных, чтобы передать их для полного тестирования, но я думаю, что это подойдет. lmk, если у вас возникли проблемы
2. Это похоже на способ! Я попробую это и обновлю результаты здесь!
3. Моя симуляция запущена atm. Независимо от того, правильно это предсказывает или нет, вы помогли с конкретным запросом представления данных, и, по меньшей мере, очень щедро. Большое спасибо, @Jeff 🙂
4. @HarryS всегда рад помочь :]