Как добавить одну точку в качестве объекта в модели временных рядов кодировщика-декодера?

#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 всегда рад помочь :]