2017-02-02 5 views
1

私の入力は、形状が(1, 893, 463)、より一般的には(None, None, 463)です。これは893個のタイムステップの1サンプルに対応し、それぞれ463個のフィーチャがあります。出力形状は(1, 893, 2)、すなわち(None, None, 2)です。KerasのConvolutional1Dは、機能の代わりに時間ステップで畳み込まれていますか?

マイネットワーク構造は、次のようになります。このようにコンパイルされた

model = Sequential() 
model.add(Convolution1D(64, 5, input_dim = one_input_length, border_mode = "same", W_regularizer = l2(0.01))) 
model.add(MaxPooling1D(10, border_mode = "same")) 
model.add(Convolution1D(64, 5, border_mode = "same", W_regularizer = l2(0.01))) 
model.add(MaxPooling1D(10, border_mode = "same")) 
model.add(GRU(300, return_sequences = True, W_regularizer = l2(0.01), U_regularizer = l2(0.01))) 
model.add(TimeDistributed(Dense(2, activation='sigmoid'))) 

compileに遡っ、Incompatible shapes: [1,893] vs. [1,9]

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

問題は、私はmodel.fit(test_X, test_Y, nb_epochs = ....)を行うときに、私は次のエラーを取得する、ありますライン。

Iこれを考え出すthis技術を用いて、各層の出力の形状を記録した:

Input: (1, 893, 463) 
Conv_1: (1, 893, 64) 
Pool_1: (1, 90, 64) 
Conv_2: (1, 90, 64) 
Pool_2: (1, 9, 64) 
GRU: (1, 9, 300) 
Dense: (1, 9, 2) 

Iモデルは、精度を計算しようとし、そして正しい893のためにそれを見つけたときにこれが発生した疑い出力には、9つの予測しかありません。なんらかの理由で、第2のConvolutional1Dレイヤーは、最初のレイヤーと同じように、フィーチャーではなく時間ステップで畳み込みを開始します。

これはなぜですか、これを修正するにはどうすればよいですか?

EDIT:

モデルの要約:私はCNN-LSTM分類器を作成しようとしています

____________________________________________________________________________________________________ 
Layer (type)      Output Shape   Param #  Connected to 
==================================================================================================== 
convolution1d_1 (Convolution1D) (None, None, 64)  148224  convolution1d_input_1[0][0] 
____________________________________________________________________________________________________ 
maxpooling1d_1 (MaxPooling1D) (None, None, 64)  0   convolution1d_1[0][0] 
____________________________________________________________________________________________________ 
convolution1d_2 (Convolution1D) (None, None, 64)  20544  maxpooling1d_1[0][0] 
____________________________________________________________________________________________________ 
maxpooling1d_2 (MaxPooling1D) (None, None, 64)  0   convolution1d_2[0][0] 
____________________________________________________________________________________________________ 
gru_1 (GRU)      (None, None, 300)  328500  maxpooling1d_2[0][0] 
____________________________________________________________________________________________________ 
timedistributed_1 (TimeDistribut (None, None, 2)  602   gru_1[0][0] 
==================================================================================================== 
Total params: 497,870 
Trainable params: 497,870 
Non-trainable params: 0 
____________________________________________________________________________________________________ 

、時系列データ与えられ、各時間ステップのための出力が得られます。

完全なエラーメッセージ:

Traceback (most recent call last): 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1021, in _do_call 
    return fn(*args) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1003, in _run_fn 
    status, run_metadata) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/contextlib.py", line 66, in __exit__ 
    next(self.gen) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/framework/errors_impl.py", line 469, in raise_exception_on_not_ok_status 
    pywrap_tensorflow.TF_GetCode(status)) 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [1,893] vs. [1,9] 
    [[Node: Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/cpu:0"](ArgMax, ArgMax_1)]] 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "Stock_CNN_LSTM.py", line 89, in <module> 
    model.fit(test_X, test_Y, nb_epoch=nb_epoch, verbose = 2, callbacks=[TestCallback((test_X, test_Y)), ModelCheckpoint("cnn_lstm_model-{epoch:02d}.h5")], initial_epoch = initial_epoch) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/models.py", line 672, in fit 
    initial_epoch=initial_epoch) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/engine/training.py", line 1192, in fit 
    initial_epoch=initial_epoch) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/engine/training.py", line 892, in _fit_loop 
    outs = f(ins_batch) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 1900, in __call__ 
    feed_dict=feed_dict) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 766, in run 
    run_metadata_ptr) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 964, in _run 
    feed_dict_string, options, run_metadata) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1014, in _do_run 
    target_list, options, run_metadata) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 1034, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [1,893] vs. [1,9] 
    [[Node: Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/cpu:0"](ArgMax, ArgMax_1)]] 

Caused by op 'Equal', defined at: 
    File "Stock_CNN_LSTM.py", line 71, in <module> 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/models.py", line 594, in compile 
    **kwargs) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/engine/training.py", line 713, in compile 
    append_metric(i, 'acc', acc_fn(y_true, y_pred)) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/metrics.py", line 11, in categorical_accuracy 
    K.argmax(y_pred, axis=-1))) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 1275, in equal 
    return tf.equal(x, y) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/ops/gen_math_ops.py", line 728, in equal 
    result = _op_def_lib.apply_op("Equal", x=x, y=y, name=name) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op 
    op_def=op_def) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2240, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/Users/user/.pyenvs/MLPy3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1128, in __init__ 
    self._traceback = _extract_stack() 

InvalidArgumentError (see above for traceback): Incompatible shapes: [1,893] vs. [1,9] 
    [[Node: Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/cpu:0"](ArgMax, ArgMax_1)]] 

ありがとう!

+0

あなたが達成しようとしていることに関する詳細情報を提供できますか?なぜあなたの 'TimeDistributed'が最後の出力ですか?あなたの目標yの次元は何ですか? – ShmulikA

+0

入力と出力の形状、print model.summary()と完全なエラーメッセージを提供できますか? –

+0

完了。あなたの時間をありがとう! –

答えて

2

現在のところ、すべてのコンボリューション/プーリング層は時間とともに動作しています。フィーチャ空間に適用する場合は、TimeDistributedとし、入力の最後に余分なディメンションを追加する必要があります。次に、データをGRUレイヤーに渡す前に余分なディメンションを削除する必要があります。

import keras.backend as K 

model = Sequential() 
model.add(Lambda(lambda x: K.expand_dims(x, -1))) 
model.add(TimeDistributed(Convolution1D(1, 5, input_dim = one_input_length, border_mode = "same", W_regularizer = l2(0.01)))) 
model.add(TimeDistributed(MaxPooling1D(10, border_mode = "same"))) 
model.add(TimeDistributed(Convolution1D(1, 5, border_mode = "same", W_regularizer = l2(0.01)))) 
model.add(TimeDistributed(MaxPooling1D(10, border_mode = "same"))) 
model.add(Lambda(lambda x: K.squeeze(x, -1))) 
model.add(GRU(300, return_sequences = True, W_regularizer = l2(0.01), U_regularizer = l2(0.01))) 
model.add(TimeDistributed(Dense(2, activation='sigmoid'))) 

あなたのコンボリューションで複数の出力チャネルを使用したい場合は、あなたが「マトリックス」のいくつかの種類を作成する必要があります:しかし、あなただけが畳み込みにつき1つのチャンネル出力を持っている場合があることを行うことができるだろうGRUユニット。

+0

それは動作します、ありがとうございます。しかし、なぜ畳み込みとプールのために別の次元を追加しなければならないのですか? –

+0

@IvanVegnerまあ、それがなくても動作するかどうかはチェックしませんでしたが、基本的に1D畳み込みが働きました。それぞれの例(TimeDistributed、各タイムステップ)、畳み込まれたディメンション(463フィーチャあなたのケースでは)と畳み込まれたチャンネルの数(あなたのケースでは1つのフィーチャにつき1つの数字)があるので、最後に1つのディメンションを追加して、畳み込み演算で各数値を1次元ベクトルとして見ます。私はそれが助けるかどうか分からない、私はそれが混乱していることを知っている:S – jdehesa

+0

私はそれを得ると思います。各フィーチャは複数の「チャネル」を持つ可能性があるため、必要なのはそのフィーチャが1つのみであることを示すために、そのフィーチャを追加する必要があります。正しい? –

関連する問題