10

このSimpleRNNを実行しようとしています:

model.add(SimpleRNN(init='uniform',output_dim=1,input_dim=len(pred_frame.columns)))
model.compile(loss="mse", optimizer="sgd")
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True)

以下に示すように、エラーは model.fit にあります。

File "/Users/file.py", line 1496, in Pred
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True)
File "/Library/Python/2.7/site-packages/keras/models.py", line 581, in fit
shuffle=shuffle, metrics=metrics)
File "/Library/Python/2.7/site-packages/keras/models.py", line 239, in _fit
outs = f(ins_batch)
File "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py", line 365, in __call__
return self.function(*inputs)
File "/Library/Python/2.7/site-packages/theano/compile/function_module.py", line 513, in __call__
allow_downcast=s.allow_downcast)
File "/Library/Python/2.7/site-packages/theano/tensor/type.py", line 169, in filter
data.shape))
TypeError: ('Bad input argument to theano function with name "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py:362"  at index 0(0-based)', 'Wrong number of dimensions: expected 3, got 2 with shape (88, 88).')

エラーは、次元の数が間違っていることを示しています。3 である必要がありますが、2 しかありません。それが参照している次元は何ですか?

4

2 に答える 2

10

RNN を実行しようとしています。これは、計算に以前の時間ステップを含める必要があることを意味します。そのためには、データを SimpleRNN レイヤーに渡す前に前処理する必要があります。

簡単にするために、それぞれ 88 個の特徴を持つ 88 個のサンプルの代わりに、それぞれ 4 個の特徴を持つ 8 個のサンプルがあると仮定します。ここで、RNN を使用する場合、バックプロパゲーションの最大値 (つまり、計算に含まれる以前の時間ステップの数) を決定する必要があります。この場合、最大 2 つの前の時間ステップを含めることを選択できます。したがって、RNN の重みを計算するには、各タイム ステップで現在のタイム ステップの入力 (4 つの特徴を含む) と前の 2 つのタイム ステップの入力 (それぞれ 4 つの特徴を含む) を提供する必要があります。このビジュアライゼーションのように:

sequence    sample0  sample1  sample2  sample3  sample4  sample5  sample6 sample7       
   0        |-----------------------|
   1                 |-----------------------|
   2                          |-----------------------|
   3                                   |-----------------------|
   4                                             |----------------------|
   5                                                      |----------------------|

したがって、SimpleRNN への入力として (nb_samples, nb_features) 行列を与える代わりに、(nb_sequences, nb_timesteps, nb_features) 形式の入力を与える必要があります。この例では、(8x4) 入力を与える代わりに (5x3x4) 入力を与えることを意味します。

keras Embeddingレイヤーがこの仕事をするかもしれませんが、この場合、短いコードを書くこともできます:

input = np.random.rand(8,4)
nb_timesteps = 3    # 2 (previous) + 1 (current)
nb_sequences = input.shape[0] - nb_timesteps    #8-3=5

input_3D = np.array([input[i:i+nb_timesteps] for i in range(nb_sequences)])
于 2016-03-30T10:07:14.230 に答える
4

入力ディメンションが次の形式ではないため、エラーが発生する可能性があります。

(nb_samples, timesteps, input_dim)

3 つのディメンションが必要ですが、そのうちの 2 つしか提供していません(88,88)

于 2016-03-22T16:08:43.360 に答える