), затем вы повторяете все последовательности.

аю LSTM-autoencoder в этом уроке:https://blog.keras.io/building-autoencoders-in-keras.htmlи вставьте соответствующую реализацию keras ниже:

from keras.layers import Input, LSTM, RepeatVector
from keras.models import Model

inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(latent_dim)(inputs)

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)

sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)

В этой реализации они установили, что вход имеет форму (timesteps, input_dim), что означает, что длина данных временного ряда фиксирована и равнаtimesteps, Если я правильно помню, RNN / LSTM может обрабатывать данные временных рядов переменной длины, и мне интересно, можно ли каким-либо образом изменить приведенный выше код, чтобы принимать данные любой длины?

Спасибо!

Ответы на вопрос(1)

Решение Вопроса

shape=(None, input_dim)

НоRepeatVector понадобится взлом, взяв размеры прямо из входного тензора. (Код работает с tenorflow, не уверен насчет theano)

import keras.backend as K

def repeat(x):

    stepMatrix = K.ones_like(x[0][:,:,:1]) #matrix with ones, shaped as (batch, steps, 1)
    latentMatrix = K.expand_dims(x[1],axis=1) #latent vars, shaped as (batch, 1, latent_dim)

    return K.batch_dot(stepMatrix,latentMatrix)


decoded = Lambda(repeat)([inputs,encoded])
decoded = LSTM(input_dim, return_sequences=True)(decoded)
 username12329 сент. 2017 г., 23:13
Спасибо! Есть ли у вас идеи, как передать данные варианта длины в автоэнкодер? Я попытался преобразовать список массивов переменной длины в массив, но не получилось. Я попытался передать список массивов var-length непосредственно ему, но я получил информацию об ошибке, говорящуюError when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 arrays but instead got the following list of 3773 arrays: [array([[ 0.300544 , 0.251966 ],.
 Daniel Möller30 сент. 2017 г., 00:06
 Daniel Möller30 сент. 2017 г., 00:09
Существует также возможность дополнить массивы фиктивными значениями, чтобы они все получили одинаковый размер, и использоватьmasking, (Я никогда не использовал его, но вы можете Google, как использовать маскировку на керас).
 Daniel Möller30 сент. 2017 г., 03:59
Чтобы смешать их, вы можете использовать padding + masking и shuffle (который автоматическиfit, но вы можете заверить сshuffle=True). Нет ничего необычного в том, чтобы иметь разные потери для разных последовательностей. Это не обязательно из-за длины. Но вы не должны тренировать одну последовательность много раз, а циклические последовательности. Одна эпоха только с каждой последовательностью (я предлагаюtrain_on_batch), затем вы повторяете все последовательности.
 username12330 сент. 2017 г., 02:53
Я заметил еще одну проблему: каждый раз, когда группа данных с новой формой подается в автоэнкодер (в цикле for), ошибка внезапно увеличивается, а затем постепенно уменьшается. Значит ли это, что параметры для данных разной длины должны быть разными? Есть ли лучший способ правильно «смешать» данные с разной длиной, чтобы результаты обучения не сильно зависели от порядка использования данных разной длины?

Ваш ответ на вопрос