Последовательность для последовательностей Keras, Pytorch или Tensorflow с вводом переменной длины и различной длиной вывода - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь построить последовательность для модели последовательности, которая изучает полезные функции по времени и функциям.

Мои входные данные настроены как 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)

В Интернете я нашел несколько тем об этом, но большинство полагает, что у вас одинаковая длина ввода / вывода или что ваш вывод является двоичным(предопределено).В этом случае вход имеет переменную длину, а выход имеет длину, зависящую от размера ввода.Эти два вида идут за понятиями, но без реального примера, подходящего для этого.

  1. Классификация последовательностей с последовательностями с переменными длинами последовательностей в Керасе
  2. Длина последовательности варьируется в кератах без заполнения.

Моя первоначальная попытка выглядит примерно так:

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.

Мои вопросы:

  1. Кажется, что использование MAXSTEPS = 200 означает, что мне нужно соответствующим образом дополнить свои данные перед началом обучения / тестирования, правильно?Если так, то почему я не могу просто определить его как «Нет», чтобы входная форма была «переменной».Я попробовал это, и это не сработало, поэтому я исследую, нужно ли мне просто жестко закодировать переменную MAXSTEPS.
  2. Если я делаю жесткий код этого MAXSTEPS, то мой вывод всегда 200 * 200.Как применить маскирование в сети, чтобы я мог получить соответствующий вывод?Например, если я кормлю в последовательности 50x250, я бы хотел получить только 50 * 50, а не 200 * 200.
  3. Нужен ли мне плотный слой в конце?Целесообразно ли использовать это против конечной модели LSTM?Я нашел разные ответы в Интернете, без особых объяснений.

Я не против, если что-то объясняется в тензорном потоке, или в pytorch, если нужно что-то сделать более активным.Я привел пример Keras в качестве отправной точки для удобства чтения.

...