Как мне построить многомерный-многоканальный кодер-декодер sequence2sequence в Keras - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь построить многовариантный (100, 20, 23), многоканальный [(100, 20, 1), (100, 20, 1), (100, 20, 1)] sequence2sequence кодировщик-декодер. В интернете не так много примеров. Тем не менее, я нашел этот учебник о модели LSTM кодера-декодера с многовариантными входными последовательностями и одиночными выходными последовательностями, и я хотел бы обобщить это для множественного выхода. Я попытался код ниже, но я получаю ошибку значения w.r.t. к разным распределенным по времени слоям. Смотрите трассировку ниже. Когда я объединяю выходные данные (100, 20, 3), модель компилируется и подходит соответственно

Есть идеи, как это исправить для полученных результатов, в которые данные можно подавать отдельно?

from keras.layers import *
from keras import Model

n_features = 23
hl2 = 150
window_len = 20
epochs = 5
batch_size = 128

features = np.random.rand(100, 20, 23)
targ1 = np.random.rand(100, 20, 1)
targ2 = np.random.rand(100, 20, 1)
targ3 = np.random.rand(100, 20, 1)

input_ = Input(shape=(window_len, n_features))

encoder_LSTM = LSTM(hl2, kernel_initializer='glorot_normal')(input_)
rep_vec = RepeatVector(window_len)(encoder_LSTM)
decoder_LSTM = LSTM(hl2, return_sequences=True)(rep_vec)
time_wrapper = TimeDistributed(Dense(int(hl2/2), activation='relu'))(decoder_LSTM)


out1 = TimeDistributed(
    Dense(3, activation='linear', name='out1', 
kernel_initializer='glorot_normal'))(time_wrapper)

out2 = TimeDistributed(
    Dense(1, activation='linear', name='out2', 
kernel_initializer='glorot_normal')
)(time_wrapper)

out3 = TimeDistributed(
    Dense(1, activation='linear', name='out3', 
kernel_initializer='glorot_normal')
)(time_wrapper)

model = Model(inputs=input_, outputs=[out1, out2, out3])

model.compile(loss='mean_squared_error', optimizer='adam')

model.fit(

        features,
        {
            'out1': out3,
            'out2': out3,
            'out3': out3,
        },
        epochs=epochs,
        batch_size=batch_size,
        verbose=0,
        shuffle='batch'
)

См. Трекбек ниже

Traceback (most recent call last):
  File "C:/Users/Master Tk/PycharmProjects/FPL/encoder.py", line 49, in <module>
    shuffle='batch'
  File "C:\Miniconda3\lib\site-packages\keras\engine\training.py", line 952, in fit
    batch_size=batch_size)
  File "C:\Miniconda3\lib\site-packages\keras\engine\training.py", line 789, in _standardize_user_data
    exception_prefix='target')
  File "C:\Miniconda3\lib\site-packages\keras\engine\training_utils.py", line 78, in standardize_input_data
    'for each key in: ' + str(names))
ValueError: No data provided for "time_distributed_2". Need data for each key in: ['time_distributed_2', 'time_distributed_3', 'time_distributed_4']
...