4

時系列のグループを予測するために keras で LSTM ニューラル ネットワークを使用したいのですが、モデルを必要なものに一致させるのに問題があります。私のデータの次元は次のとおりです。

入力テンソル:(data length, number of series to train, time steps to look back)

出力テンソル:(data length, number of series to forecast, time steps to look ahead)

注:寸法をそのままにしておきたいのですが、転置はしません。

問題を再現するダミー データ コードは次のとおりです。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, TimeDistributed, LSTM

epoch_number = 100
batch_size = 20
input_dim = 4
output_dim = 3
look_back = 24
look_ahead = 24
n = 100

trainX = np.random.rand(n, input_dim, look_back)
trainY = np.random.rand(n, output_dim, look_ahead)
print('test X:', trainX.shape)
print('test Y:', trainY.shape)

model = Sequential()

# Add the first LSTM layer (The intermediate layers need to pass the sequences to the next layer)
model.add(LSTM(10, batch_input_shape=(None, input_dim, look_back), return_sequences=True))

# add the first LSTM layer (the dimensions are only needed in the first layer)
model.add(LSTM(10, return_sequences=True))

# the TimeDistributed object allows a 3D output
model.add(TimeDistributed(Dense(look_ahead)))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, nb_epoch=epoch_number, batch_size=batch_size, verbose=1)

これは次のことを意味します:

例外: モデル ターゲットのチェック中にエラーが発生しました: timedistributed_1 の形状が (None、4、24) であると予想されていましたが、形状 (100、3、24) の配列を取得しました

TimeDistributed 問題は、レイヤーを定義するときにあるようです。

TimeDistributedレイヤーをコンパイルしてトレーニングするように定義するにはどうすればよいですか?

4

2 に答える 2

0

問題は、の出力でoutput_dim(!= )を期待していることだと思いますが、それは不可能です。この次元は、時間次元と見なされるものであり、保持されます。input_dimTimeDistributed

入力は少なくとも 3D である必要があり、インデックス1の次元は時間次元と見なされます。

の目的は、各時間ステップに同じレイヤーをTimeDistributed適用することです。開始時と同じ数の時間ステップでしか終了できません。

この次元を 4 から 3 に本当に下げる必要がある場合は、最後に別のレイヤーを追加するか、 とは異なるものを使用する必要があると思いますTimeDistributed

PS: この問題を見つけるための 1 つのヒントoutput_dimは、モデルの作成時には使用されず、検証データにのみ表示されることでした。これは単なるコードのにおいですが (この観察に問題はないかもしれません)、チェックする価値のあるものです。

于 2016-10-17T18:45:16.167 に答える