Я пытаюсь построить последовательность для модели последовательности, которая изучает полезные функции по времени и функциям.
Мои входные данные настроены как Nx250, где N - это число функций, а 250 - это числовременные шаги.В этом сценарии время поддерживается постоянным. Мои выходные данные в идеале будут иметь размер N * N.В этом случае N варьируется, скажем, между 50-200.Я не возражаю, если модель учится через измерение N (учитывая время в Керасе), потому что затемнение функций - это некая «функция компонента времени».
Ввод:
(Нет, N,250) =
(в кератах) (batch_size, timesteps, input_dim) =
(для меня) (batch_size, timefeatures, timewindow)
Вывод:
(Нет, N * N) = (batch_size, outputlen)
В Интернете я нашел несколько тем об этом, но большинство полагает, что у вас одинаковая длина ввода / вывода или что ваш вывод является двоичным(предопределено).В этом случае вход имеет переменную длину, а выход имеет длину, зависящую от размера ввода.Эти два вида идут за понятиями, но без реального примера, подходящего для этого.
- Классификация последовательностей с последовательностями с переменными длинами последовательностей в Керасе
- Длина последовательности варьируется в кератах без заполнения.
Моя первоначальная попытка выглядит примерно так:
timesteps = None
outputsize = None
MAXSTEPS = 200
winsize = 250
hidden_size = 125
#encoder
inputs = Input(batch_shape = (1, MAXSTEPS, winsize))
outputs = Masking(mask_value=0., input_shape=(timesteps, features))(inputs)
outputs = LSTM(units=hidden_size, return_sequences=False)(outputs)
# outputs = LSTM(units=hidden_size//2, return_sequences=False)(outputs)
outputs = Lambda(storeLength)([inputs, outputs])
encoder = Model(inputs,outputs)
#decoder
inputs = Input(batch_shape=(1,hidden_size+1))
outputs = Lambda(expandLength)(inputs)
outputs = LSTM(units=hidden_size, return_sequences=True)(outputs)
outputs = Dense(MAXCHANS**2, activation='softmax')(outputs)
decoder = Model(inputs,outputs)
encoder.summary()
decoder.summary()
Вывод показан здесь:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_37 (InputLayer) (1, 200, 250) 0
__________________________________________________________________________________________________
masking_31 (Masking) (1, 200, 250) 0 input_37[0][0]
__________________________________________________________________________________________________
lstm_57 (LSTM) (1, 125) 188000 masking_31[0][0]
__________________________________________________________________________________________________
lambda_29 (Lambda) (1, 126) 0 input_37[0][0]
lstm_57[0][0]
==================================================================================================
Total params: 188,000
Trainable params: 188,000
Non-trainable params: 0
__________________________________________________________________________________________________
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_38 (InputLayer) (1, 126) 0
_________________________________________________________________
lambda_30 (Lambda) (1, None, 125) 0
_________________________________________________________________
lstm_58 (LSTM) (1, None, 125) 125500
_________________________________________________________________
dense_7 (Dense) (1, None, 40000) 5040000
=================================================================
Total params: 5,165,500
Trainable params: 5,165,500
Non-trainable params: 0
Где я делю его на две установки: шаг «декодирования» и «кодирования», но на самом деле это просто некоторая модель последовательности переменной длины, изучающая некоторые особенности, которые выводят конечный вектор в форме N * N.
Мои вопросы:
- Кажется, что использование MAXSTEPS = 200 означает, что мне нужно соответствующим образом дополнить свои данные перед началом обучения / тестирования, правильно?Если так, то почему я не могу просто определить его как «Нет», чтобы входная форма была «переменной».Я попробовал это, и это не сработало, поэтому я исследую, нужно ли мне просто жестко закодировать переменную MAXSTEPS.
- Если я делаю жесткий код этого MAXSTEPS, то мой вывод всегда 200 * 200.Как применить маскирование в сети, чтобы я мог получить соответствующий вывод?Например, если я кормлю в последовательности 50x250, я бы хотел получить только 50 * 50, а не 200 * 200.
- Нужен ли мне плотный слой в конце?Целесообразно ли использовать это против конечной модели LSTM?Я нашел разные ответы в Интернете, без особых объяснений.
Я не против, если что-то объясняется в тензорном потоке, или в pytorch, если нужно что-то сделать более активным.Я привел пример Keras в качестве отправной точки для удобства чтения.