2017-09-29 3 views
0

私はこのチュートリアルでLSTM-オートエンコーダの読み取り:https://blog.keras.io/building-autoencoders-in-keras.html、及び以下対応keras実装貼り付け:この実装でLSTM-autoencoderを可変長時系列データに適用するにはどうすればよいですか?

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) 

を、それらがの長さを意味し、形状の(タイムステップ、input_dim)される入力を修正しました時系列データはtimestepsに固定されている。私が正しく覚えていれば、RNN/LSTMは可変長の時系列データを扱うことができ、何らかの方法で長さのデータを受け入れるようにコードを修正することが可能かどうか疑問に思っていますか?

ありがとうございます!

答えて

2

あなたはshape=(None, input_dim)

を使用することができます。しかしRepeatVectorは、入力テンソルから直接寸法を取って、いくつかのハッキングが必要になります。 (コードはテンソルフローで動作し、テアノについてはわかりません)

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) 
+0

ありがとうございました!バリアント長のデータを自動エンコーダーに渡す方法はありますか? var-length配列のリストを配列に変換しようとしましたが失敗しました。私はvar-length配列のリストを直接渡そうとしましたが、モデル入力をチェックする際にエラーが発生しました。モデルに渡すNumpy配列のリストは、モデルが期待するサイズではありません。 1つの配列を表示すると予想されていましたが、代わりに3773の配列の次のリストがあります:[配列([[0.300544、0.251966]、 '。 – username123

+0

https://stackoverflow.com/questions/46144191/keras-misinterprets-training-data-shape/ 46146146#46146146 –

+1

配列をダミーの値で埋めて、同じサイズになり、 'masking'を使うようにすることもできます(私は使ったことはありませんが、kerasのマスキングの使い方はgoogleでできます)。 –

関連する問題